1、创建两个mysql配置文件目录
#创建m1库的配置文件目录
mkdir -p /home/rebei/m1/config
#创建m2库的配置文件目录
mkdir -p /home/rebei/m2/config
2、分别创建配置文件my.cnf到对应的config目录下,配置文件内容如下:
m1库配置文件如下
#m1库的配置文件
# 修改配置
[mysqld]
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
log-bin=mysql-bin-master
server_id=1
log_replica_updates=1
plugin-load="rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so"
#如果启动容器的时候报错无效的变量rpl_semi_sync_source_enabled=1,先注释下面两个参数配置,启动后再开启这两个参数配置
rpl_semi_sync_source_enabled=1
rpl_semi_sync_replica_enabled=1
[client]
default-character-set=utf8mb4
m2库配置文件如下
## m2库 配置文件内容
[mysqld]
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
log-bin=mysql-bin-master
server_id=2
log_replica_updates=1
plugin-load="rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so"
#如果启动容器的时候报错无效的变量rpl_semi_sync_source_enabled=1,先注释下面两个参数配置,启动后再开启这两个参数配置
rpl_semi_sync_source_enabled=1
rpl_semi_sync_replica_enabled=1
[client]
default-character-set=utf8mb4
4、启动m1、m2数据库容器
#启动m1库
docker run -d --name m1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ="Asia/Shanghai" -v /home/rebei/m1/config:/etc/mysql/conf.d mysql --authentication_policy=mysql_native_password
docker restart m1
docker exec -it m1 mysql -uroot -p123456
#启动m2库
docker run -d --name m2 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ="Asia/Shanghai" -v /home/rebei/m2/config:/etc/mysql/conf.d mysql --authentication_policy=mysql_native_password
docker restart m2
docker exec -it m2 mysql -uroot -p123456
4、每个数据库要重置一下server_uuid,否则后面的主从复制会出错,进入容器直接删掉auto.cnf让MySQL自动生成即可
#m1库
docker exec -it m1 /bin/bash
rm -rf /var/lib/mysql/auto.cnf
#m2库
docker exec -it m2 /bin/bash
rm -rf /var/lib/mysql/auto.cnf
5、分别添加对应的热备用户到m1、m2。两个库都要添加。
docker exec -it m1 mysql -uroot -p123456
DROP USER 'repl'@'%' ;
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
flush privileges;
#切换窗口
docker exec -it m2 mysql -uroot -p123456
DROP USER 'repl'@'%' ;
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
flush privileges;
6、分别查看两个库的master状态
查看m1库的master状态
#进入m1库
docker exec -it m1 mysql -uroot -p123456
#进入mysql后继续输入命令
show master status;
两个重要的参数File和Position,后面配置m2位m2的从库的时候需要使用这两个参数,结果如下图:
查看m2库的master状态
#进入m2库
docker exec -it m2 mysql -uroot -p123456
#进入mysql后继续输入命令
show master status;
同样两个重要的参数File和Position,后面配置m1为m2从库的时候需要使用这两个参数,结果如下:
7、设置m1为m2的从库
#停止m1的从库功能,并且重置
STOP SLAVE;
RESET SLAVE;
#设置m1的主库为m2,信息如下:
CHANGE MASTER TO
MASTER_HOST='192.168.0.68',
MASTER_PORT=3307
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin-master.000004',
MASTER_LOG_POS=1830;
#开启m1的从库功能
START SLAVE;
#查看m1的从库状态
SHOW SLAVE STATUS\G;
结果中两个重要参数:Slave_IO_Running和Slave_SQL_Running都必须是Yes,否则就是事变的,如下图:
8、设置m2位m1的从库
#停止m2的从库功能,并且重置
STOP SLAVE;
RESET SLAVE;
#设置m2的主库为m2,使用同一个服务器时只需要替换端口号即可,信息如下:
CHANGE MASTER TO
MASTER_HOST='192.168.0.68',
MASTER_PORT=3306
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin-master.000004',
MASTER_LOG_POS=1824;
#开启m2的从库功能
START SLAVE;
#查看m2的从库状态
SHOW SLAVE STATUS\G;
结果中两个重要参数:Slave_IO_Running和Slave_SQL_Running都必须是Yes,否则就是事变的,如下图:
至此,搭建完毕!
主主架构也成为了半同步架构或者互为主从架构