Docker实现MySQL主从复制配置【简易版】
Docker实现MySQL主从复制配置
环境准备
-
安装docker
-
拉取
MySQL 8.0
镜像docker pull mysql:8.0#检查 docker images | grep mysql
代码流程
由于Mysql8.0的ssl验证十分繁琐,在创建容器的时候一定要禁掉
-
创建自定义网络
docker network create mysql-replication-net
-
启动主库容器(禁用SSL)
docker run -d --name mysql-master \--network mysql-replication-net \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=root \-v $(pwd)/master-data:/var/lib/mysql \mysql:8.0 \--server-id=1 \--log-bin=mysql-bin \--binlog-format=ROW \--gtid-mode=ON \--enforce-gtid-consistency=ON \--skip-ssl \--require_secure_transport=OFF
-
启动从库容器(禁用SSL)
docker run -d --name mysql-slave \--network mysql-replication-net \-p 3307:3306 \-e MYSQL_ROOT_PASSWORD=root \-v $(pwd)/slave-data:/var/lib/mysql \mysql:8.0 \--server-id=2 \--log-bin=mysql-bin \--binlog-format=ROW \--gtid-mode=ON \--enforce-gtid-consistency=ON \--skip-ssl \--require_secure_transport=OFF
-
主库创建复制账号
这里更新一下可能出现的问题,过程报错:
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection
,表明 root 用户当前使用的 caching_sha2_password 认证插件要求安全连接(caching_sha2_password 插件默认要求连接使用 SSL/TLS 加密),我们可以进入数据库更改root
用户的认证插件绕开生成SSL证书:
sudo docker exec -it mysql-master bash
,mysql -uroot -proot -h127.0.0.1
,
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'proot'; FLUSH PRIVILEGES;
docker exec -it mysql-master mysql -uroot -proot -e \
"CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;"
-
配置从库复制
docker exec -it mysql-slave mysql -uroot -proot -e \ "STOP SLAVE; RESET SLAVE ALL; CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1, MASTER_SSL=0; START SLAVE;"
-
验证主从状态
# 检查主库状态 docker exec -it mysql-master mysql -uroot -proot -e "SHOW MASTER STATUS\G"# 检查从库复制状态 docker exec -it mysql-slave mysql -uroot -proot -e \ "SHOW SLAVE STATUS\G" | grep -E 'Slave_IO_Running|Slave_SQL_Running|Last_Error'# 测试数据同步 docker exec -it mysql-master mysql -uroot -proot -e \ "CREATE DATABASE sync_test; USE sync_test; CREATE TABLE test(id INT); INSERT INTO test VALUES(1);"docker exec -it mysql-slave mysql -uroot -proot -e \ "USE sync_test; SELECT * FROM test;"
关键配置补充
-
禁用SSL的核心参数:
--skip-ssl # 完全禁用SSL功能 --require_secure_transport=OFF # 不要求安全连接
-
认证插件选择:
IDENTIFIED WITH mysql_native_password # 使用兼容性更好的传统认证
-
主从连接配置:
MASTER_SSL=0 # 明确禁用SSL连接