1.1 简单说明
这里用了两台服务器,分别是161,和163,有条件可以用四台
- 161服务器 :
1主1备(mysql-5.7-master-161 mysql-5.7-slave-161)
端口:3339 和3340
- 163服务器 :
1主1备(mysql-5.7-master-163 mysql-5.7-slave-163)
端口:3339 和3340
- docker镜像
mysql:5.7
1.2 这分别构建容器
- 拉取镜像:
docker pull mysql:5.7
- 分别创建容器:
(可以挂载配置文件,这里没有挂载)
161服务器:
docker run -itd --name=mysql-5.7-master-161 -p 3339:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 docker run -itd --name=mysql-5.7-slave-161 -p 3340:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
163服务器.
docker run -itd --name=mysql-5.7-master-163 -p 3339:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 docker run -itd --name=mysql-5.7-slave-163 -p 3340:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
分别进入容器修改配置文件:(没有挂载文件的需要vim命令修改配置)
apt-get update apt-get install vim
分别修改配置文件:
vim /etc/mysql/my.cnf
4份配置文件添加信息如下:(可相应去补充其他的)
161-master======
[mysqld] server-id=1 log-bin=mysql-bin skip-name-resolve log-slave-updates lower_case_table_names=1 interactive_timeout=7200 wait_timeout=86400 max_connections=4000 back_log=100 expire_logs_days=3 max_binlog_size=100M character_set_server=utf8 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
161-slave======
[mysqld] server-id=2 log-bin=mysql-slave-bin relay_log=edu-mysql-relay-bin skip-name-resolve log-slave-updates=1 lower_case_table_names=1 interactive_timeout=7200 wait_timeout=86400 max_connections=4000 back_log=100 expire_logs_days=3 max_binlog_size=100M character_set_server=utf8 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
163-master======
[mysqld] server-id=3 log-bin=mysql-bin skip-name-resolve log-slave-updates lower_case_table_names=1 interactive_timeout=7200 wait_timeout=86400 max_connections=4000 back_log=100 expire_logs_days=3 max_binlog_size=100M character_set_server=utf8 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
163-slave======
[mysqld] server-id=4 log-bin=mysql-slave-bin relay_log=edu-mysql-relay-bin skip-name-resolve log-slave-updates=1 lower_case_table_names=1 interactive_timeout=7200 wait_timeout=86400 max_connections=4000 back_log=100 expire_logs_days=3 max_binlog_size=100M character_set_server=utf8 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1.3 配置文件字段说明
Server-id
ID值唯一的标识了复制群集中的主从服务器,因此它们必须各不相同。Master_id必须为1到232-1之间的一个正整数值,slave_id值必须为2到232-1之间的一个正整数值。
Log-bin
表示打开binlog,打开该选项才可以通过I/O写到Slave的relay-log,也是可以进行replication的前提。
Binlog-do-db
表示需要记录二进制日志的数据库。如果有多个数据可以用逗号分隔,或者使用多个binlog-do-dg选项。
Binglog-ingore-db
表示不需要记录二进制日志的数据库,如果有多个数据库可用逗号分隔,或者使用多binglog-ignore-db选项。
Replicate-do-db
表示需要同步的数据库,如果有多个数据可用逗号分隔,或者使用多个replicate-do-db选项。
Replicate-ignore-db
表示不需要同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项。
Master-connect-retry
master-connect-retry=n表示从服务器与主服务器的连接没有成功,则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从服务器存在mater.info文件,它将忽略些选项。
Log-slave-updates
配置从库上的更新操作是否写入二进制文件,如果这台从库,还要做其他从库的主库,那么就需要打这个参数,以便从库的从库能够进行日志同步。
Slave-skip-errors
在复制过程,由于各种原因导致binglo中的sql出错,默认情况下,从库会停止复制,要用户介入。可以设置slave-skip-errors来定义错误号,如果复制过程中遇到的错误是定义的错误号,便可以路过。如果从库是用来做备份,设置这个参数会存在数据不一致,不要使用。如果是分担主库的查询压力,可以考虑。
1.4 配置主从、主主
- 创建slave角色,用于数据同步。
分别进入在161和163服务器的主库容器中:
docker exec -it mysql-5.7-master-161 /bin/bash mysql -uroot -p123456 CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;
docker exec -it mysql-5.7-master-163 /bin/bash mysql -uroot -p123456 CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; flush privileges;
- 配置主从连接。
在宿主机161、163分别执行命令
docker inspect mysql-5.7-master-161
docker inspect mysql-5.7-master-163
161的是172.17.0.2 主从之间基于此ip,可能docker重启ip会发生改变,也可以用宿主机host的ip和端口
163的是172.17.0.3
下面分别在161、163配置主从连接
1) 161-master:
show master status;
关注file和position的值
2) 161-slave:
show slave status G; change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000004', master_log_pos=1490; start slave; show slave status G;
change操作前要先stop slave;
- 配置主主连接
分别去对应show master status;查看对应的动态参数。
#主机2复制主机1命令 change master to master_host='xxx.xx.x.161', master_port=3339, master_user='slave', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=1306, master_connect_retry=60; #主机1复制主机2命令 change master to master_host='xxx.xx.x.163', master_port=3339, master_user='slave', master_password='123456', master_log_file='mysql-bin.000005', master_log_pos=769, master_connect_retry=60;
关联主从,主主之间主要关注:
master_host,master_log_file,master_log_pos字段
- 验证