您当前的位置:首页 > 网站建设 > 网站维护
| php | asp | css | H5 | javascript | Mysql | Dreamweaver | Delphi | 网站维护 | 帝国cms | React | 考试系统 | ajax | jQuery |

docker实现mysql主从复制的示例代码

51自学网 2022-07-04 11:30:47
  网站维护

一、概述

1、原理

  • master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
  • slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
  • 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

主从流程图

2、实现

主库:192.168.3.13:3310从库:192.168.3.14:3310二、创建master主库进入服务器192.168.3.13

1、安装镜像

docker pull mysql:8.0.26

2、新建目录

mkdir -p /home/apps/mysql-master/{config,log,data}

3、创建并启动

docker run -d --name mysql-master /--restart=always /--privileged=true /-p 3310:3306 /-v /home/apps/mysql-master/config:/etc/mysql/conf.d /-v /home/apps/mysql-master/log:/var/log/mysql /-v /home/apps/mysql-master/data:/var/lib/mysql /-e MYSQL_ROOT_PASSWORD=123456 /mysql:8.0.26

4、新增/修改master基本配置

vim /home/apps/mysql-master/config/my.cnf

添加以下内容

[client]default-character-set=utf8 [mysql]default-character-set=utf8 [mysqld]init_connect='SET collation_connection = utf8_unicode_ci'init_connect='SET NAMES utf8'character-set-server=utf8collation-server=utf8_unicode_ciskip-character-set-client-handshakeskip-name-resolve

三、创建Slave实例

进入服务器192.168.3.14

1、同上面操作一样

# 创建目录mkdir -p /home/apps/mysql-slave-01/{config,log,data}# 启动容器docker run -d --name mysql-slave-01 /--restart=always /--privileged=true /-p 3310:3306 /-v /home/apps/mysql-slave-01/config:/etc/mysql/conf.d /-v /home/apps/mysql-slave-01/log:/var/log/mysql /-v /home/apps/mysql-slave-01/data:/var/lib/mysql /-e MYSQL_ROOT_PASSWORD=123456 /mysql:8.0.26# 修改Slave基本配置vim /home/apps/mysql-slave-01/config/my.cnf# 添加以下内容[client]default-character-set=utf8 [mysql]default-character-set=utf8 [mysqld]init_connect='SET collation_connection = utf8_unicode_ci'init_connect='SET NAMES utf8'character-set-server=utf8collation-server=utf8_unicode_ciskip-character-set-client-handshakeskip-name-resolve

四、主从配置

1、添加master配置

vim /home/apps/mysql-master/config/my.cnfserver_id=1# 开启二进制日志log-bin=mysql-binread-only=0# 需要同步的数据库binlog-do-db=rapid-cloudbinlog-do-db=rapid-cloud-test# 需要忽略的数据库replicate-ignore-db=mysqlreplicate-ignore-db=sysreplicate-ignore-db=information_schemareplicate-ignore-db=performance_schema

2、重启容器

docker restart mysql-master

3、添加Slave配置

vim /home/apps/mysql-slave-01/config/my.cnfserver_id=2log-bin=mysql-binread-only=1binlog-do-db=rapid-cloudbinlog-do-db=rapid-cloud-testreplicate-ignore-db=mysqlreplicate-ignore-db=sysreplicate-ignore-db=information_schemareplicate-ignore-db=performance_schema

4、重启容器

docker restart mysql-slave-01

5、master添加帐号,用来同步的用户

# 进入容器docker exec -it mysql-master /bin/bash# 进入主库mysql数据库mysql -u root -p# 授权root可以远程访问( 主从无关,为了方便我们远程连接mysql)# 授权远程ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';# 刷新flush privileges;# 创建backup用户# 应先创建新用户create user 'backup'@'%' identified by '123456';# 执行授权grant all privileges on *.* to 'backup'@'%';# 刷新flush privileges;# 授权远程ALTER USER 'backup'@'%' IDENTIFIED WITH mysql_native_password BY '123456';# 刷新flush privileges;# 查看主库状态show master status;

6、在从库里设置主库连接

# 进入容器docker exec -it mysql-slave-01 /bin/bash# 进入主库mysql数据库mysql -u root -pchange master to master_host='192.168.3.13',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3310;

7、启动从库同步

先将主库的数据复制一份到从库,包含表结构及数据

将主库binlog清除一下,这样它的位置就从0开始了

purge master logs to'mysql-bin.000001';

开启同步

# 开始同步start slave;# 停止同步# stop slave;# 查看同步状态show slave status/G;

8、错误排查

如果无法实现主从同步,可以通过以下排查

总结:

主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。并且server-id不能一样主库授权某个账号密码来同步自己的数据从库使用这个账号密码连接主库来同步数据

五、参考

https://www.cnblogs.com/heian99/p/12104189.html

https://blog.csdn.net/lilygg/article/details/98187015

binlog清除:https://www.cnblogs.com/kiko2014551511/p/11532426.html


下载地址:
基于Docker+Selenium Grid的测试技术应用示例代码
docker容器详细讲解如何精简镜像减小体积
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1