使用Docker完成Mysql主从复制部署
下文将简述如何通过docker容器,完成MySQL 主从复制集群。
操作系统版本:CentOS7
连接工具版本:FinalShell 4.5.12
MySQL版本:8.0.39
1.拉取镜像
使用docker pull拉取mysql镜像,版本可以参考docker hub官网,注意9.0以上版本还不稳定,暂时不要使用
docker pull 8.0.39
2.查看镜像
docker images

3.创建挂载目录
由于需要启动两个容器,master和slave,新建两个目录结构,选择自定义的位置。
mkdir -p /home/mysql/master/{conf,data,log}
mkdir -p /home/mysql/slave/{conf,data,log}

4.分别创建my.cnf配置文件
cd /home/mysql/master/conf
vim my.cnf
chmod 644 /home/mysql/master/conf/my.cnf #授权
cd /home/mysql/slave/conf
vim my.cnf
chmod 644 /home/mysql/slave/conf/my.cnf #授权
5.Master 启动和配置
(1)启动容器
docker run \
-p 3306:3306 \
--restart=always \
--name mysql-master \
--privileged=true \
-v /home/mysql/master/log:/var/log/mysql \
-v /home/mysql/master/data:/var/lib/mysql \
-v /home/mysql/master/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.39
(2)修改my.cnf配置文件
server-id=1
log-bin=mysql-bin
binlog-ignore-db=mysql
binlog_format=ROW
expire_logs_days=7 #日志过期时间7天
sync-binlog=1
read-only=0 #0表示可读写 1表示只读
(3)重启docker
docker restart mysql-master
(4)进入容器,创建主从复制用户并授权
docker exec -it mysql-master mysql -uroot -p
CREATE USER 'repl'@'%' IDENTIFIED BY '123456'; #创建用户密码
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; #授予主从复制权限
FLUSH PRIVILEGES;
(5)查看master坐标
后续从库需要配置参数
SHOW MASTER STATUS

File:当前binlog文件
Position:文件写的位置
(6)开启端口3306
firewall-cmd --zone=public --add-port=3306/tcp --permanent
6.Slave容器启动及从库配置
(1)启动容器
docker run \
-p 3307:3306 \
--restart=always \
--name mysql-slave1 \
--privileged=true \
-v /home/mysql/slave/log:/var/log/mysql \
-v/home/mysql/slave/data:/var/lib/mysql \
-v /home/mysql/slave/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.39
(2)修改my.cnf配置文件
server-id=2
read-only=1
relay-log=mysql-relay-bin
log-slave-updates=1
(3)重启docker
(4)主从关联
这一步是配置从库要同步的主库信息,是最重要的一步。
docker exec -it mysql-slave mysql -uroot -p
#执行sql 语句
CHANGE MASTER TO
MASTER_HOST='192.168.48.155', //主库的ip地址
MASTER_USER='repl', //主库创建的主从复制用户
MASTER_PASSWORD='repl123', //密码
MASTER_LOG_FILE='binlog.000003',//主库SHOW MASTER STATUS 的File值
MASTER_LOG_POS=3845;//主库SHOW MASTER STATUS 的Position值
(5)开启主从复制
START SLAVE
也是在mysql控制台执行
(6)查看主从复制的状态
show replica status;

Replica_IO_Running 和Replica_SQL_Running都为yes表示开启成功
如果不为yes,看一下Last_IO_Error、Last_SQL_Error中是否有提示
7.主从复制测试
在master库中执行以下语句:
create database db01;
CREATE TABLE t_user (
id int NOT NULL,
name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
sex varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO t_user VALUES (1, 'zhangsan', '0');
INSERT INTO t_user VALUES (2, 'test1234', '0');
执行完成后打开slave库:
同步了创建数据库、新建表、插入语句等,以上就是主从复制的所有内容。