使用Docker完成Mysql主从复制

使用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库:

同步了创建数据库、新建表、插入语句等,以上就是主从复制的所有内容。