Docker搭建MySQL8.0主从复制(Replication)环境

基于二进制日志文件位置(Binary Log File Position)的复制配置

环境准备:

Centos 7.7.1908 64位
Docker 18.06.3-ce
要求服务器可连接互联网
本实验使用Root用户操作,mysql:latest镜像的MySQL版本为8.0.18

Docker镜像

# docker search mysql
选择STARS数最多的mysql官方镜像
# docker pull mysql

启动Master,Slave节点

启动2容器,一个用作master节点,一个用作slave节点
以下命令大致含义:容器后台运行,docker容器名命名为master/slave,容器端口映射到宿主机3306/3307端口, 设定root账号的密码为root,启动的mysql镜像版本为latest,切换mysql默认连接认证方式(使用账号密码登陆认证,8.0新特性)。

# docker run -it -d --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:latest --default-authentication-plugin=mysql_native_password 
# docker run -it -d --name slave -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:latest --default-authentication-plugin=mysql_native_password 

查看已启动容器
# docker ps
查看所有容器
# docker ps -a

Docker宿主机防火墙端口开放

开放3306到3307之间的2个端口,3306用于master节点,3307用于slave节点

# firewall-cmd --zone=public --add-port=3306-3307/tcp --permanent
# firewall-cmd --reload

设置容器内MySQL配置

1、master节点执行配置命令

# docker exec -it master mysql -uroot -proot \
-e "SET PERSIST server_id=1;" \
-e "SET PERSIST_ONLY gtid_mode=ON;" \
-e "SET PERSIST_ONLY enforce_gtid_consistency=true; " \
-e "CREATE USER 'repl_user'@'%' IDENTIFIED BY '123456' REQUIRE SSL; " \
-e "GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; "

Master节点命令行参数大致含义:
在容器内的mysql下执行复制参数配置,包括设置节点server-id,开启GTID复制模式,
master节点创建repl_user/123456 用户给slave连接复制使用,给repl_user用户添加所有Master数据库和表的复制权限。

还有些常见参数可酌情配置:
log-bin=二进制文件名
binlog_format=row #按行复制

启用了二进制日志记录的从服务器也可以用作复制拓扑的一部分。复制顺序如:master->slave1->slave2
参数配置可参考:https://dev.mysql.com/doc/refman/8.0/en/replication-howto-slavebaseconfig.html

2、slave节点执行配置命令

# docker exec -it slave mysql -uroot -proot \
-e "SET PERSIST server_id=2;" \
-e "SET PERSIST_ONLY gtid_mode=ON;" \
-e "SET PERSIST_ONLY enforce_gtid_consistency=true; " 

3、重启Master和Slave节点
# docker restart master slave

以下操作可验证配置是否生效
1)进入容器mysql命令
# docker exec -it master mysql -uroot -proot
2)分别查看配置项是否生效:
mysql> show variables like 'server_id';
mysql> show variables like 'gtid_mode';
mysql> show variables like 'enforce_gtid_consistency';
3)查看用户权限分配:
mysql> select * from user where user = 'repl_user'
4)使用mysql客户端连接工具测试Master和Slave外部网络连接是否正常
本次实验连接信息:
IP:192.168.18.128
port:3306(从库3307)
user:root
password:root

Slave连接Master

# docker exec -it slave mysql -uroot -p
Enter password: root
mysql > CHANGE MASTER TO MASTER_HOST='192.168.18.128', MASTER_PORT=3306, MASTER_USER='repl_user', MASTER_PASSWORD='123456', MASTER_AUTO_POSITION=1, MASTER_SSL=1;
mysql > START SLAVE;
mysql > show slave status;   -- 验证连接是否成功

命令行含义:登陆slave数据库,执行配置连接Master的参数(包括Master的IP,端口,用户名,密码),启动连接,验证连接是否成功。
show slave status展示如下状态为正常:
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上连接sql也可以通过客户端工具在从库直接执行,并查询验证

验证主从复制是否生效

主库创建数据库,查看从库是否会同步创建

参考资料:
https://dev.mysql.com/doc/refman/8.0/en/binlog-replication-configuration-overview.html/
https://www.jianshu.com/p/6194106cdd05
https://www.jianshu.com/p/3eb1e178f51b

你可能感兴趣的