1、创建两个mysql配置文件目录

#创建m1库的配置文件目录mkdir -p /home/rebei/m1/config#创建m2库的配置文件目录mkdir -p /home/rebei/m2/config

2、分别创建配置文件my.cnf到对应的config目录下,配置文件内容如下:

m1库配置文件如下

#m1库的配置文件# 修改配置[mysqld]user=mysqlcharacter-set-server=utf8mb4collation-server=utf8mb4_general_cilog-bin=mysql-bin-masterserver_id=1log_replica_updates=1plugin-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=1rpl_semi_sync_replica_enabled=1[client]default-character-set=utf8mb4

m2库配置文件如下

## m2库 配置文件内容[mysqld]user=mysqlcharacter-set-server=utf8mb4collation-server=utf8mb4_general_cilog-bin=mysql-bin-masterserver_id=2log_replica_updates=1plugin-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=1rpl_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_passworddocker restart m1docker 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_passworddocker restart m2docker exec -it m2 mysql -uroot -p123456

4、每个数据库要重置一下server_uuid,否则后面的主从复制会出错,进入容器直接删掉auto.cnf让MySQL自动生成即可

#m1库docker exec -it m1 /bin/bashrm -rf/var/lib/mysql/auto.cnf#m2库docker exec -it m2 /bin/bashrm -rf/var/lib/mysql/auto.cnf

5、分别添加对应的热备用户到m1、m2。两个库都要添加。

docker exec -it m1 mysql -uroot -p123456DROP USER 'repl'@'%' ;CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';flush privileges;#切换窗口docker exec -it m2 mysql -uroot -p123456DROP 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 TOMASTER_HOST='192.168.0.68',MASTER_PORT=3307MASTER_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 TOMASTER_HOST='192.168.0.68',MASTER_PORT=3306MASTER_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,否则就是事变的,如下图:

至此,搭建完毕!

主主架构也成为了半同步架构或者互为主从架构