1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# 创建数据文件夹 mkdir -p /var/docker/mgr/{m1,s11,s12} # 创建临时MySQL把MySQL初始数据库复制出来,最后删除 docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name test mysql:5.7 for dir in {m1,s11,s12};do docker cp test:/etc/mysql/mysql.cnf /var/docker/mgr/${dir};done docker stop test docker rm test # 创建独有的网络 docker network create --driver bridge \ --subnet 172.16.1.0/24 \ mgr_net docker network ls # 创建三个MySQL docker run -d \ -p 3306:3306 \ -v /var/docker/mgr/m1/mysql.cnf:/etc/mysql/mysql.cnf:ro \ -v /var/docker/mgr/m1/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --privileged=true \ --net mgr_net \ --ip 172.16.1.10 \ --name mysql_m1 \ mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci docker run -d \ -p 3307:3306 \ -v /var/docker/mgr/s11/mysql.cnf:/etc/mysql/mysql.cnf:ro \ -v /var/docker/mgr/s11/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --privileged=true \ --net mgr_net \ --ip 172.16.1.11 \ --name mysql_s1 \ mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci docker run -d \ -p 3308:3306 \ -v /var/docker/mgr/s12/mysql.cnf:/etc/mysql/mysql.cnf:ro \ -v /var/docker/mgr/s12/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --privileged=true \ --net mgr_net \ --ip 172.16.1.12 \ --name mysql_s2 \ mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci |
每个MySQL都配置(mysql.cnf)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 配置(记得把注释去掉) [mysqld] server-id=1 # Mysql服务ID gtid-mode=on # 全局事务 enforce-gtid-consistency=on # 强制GTID的一致性 master-info-repository=TABLE # 将master.info元数据保存在系统表中 relay-log-info-repository=TABLE # 将relay.info元数据保存在系统表中 binlog-checksum=none # 禁用二进制日志事件校验 log-slave-updates=on # 级联复制 log-bin=binlog # 开启二进制日志记录 binlog-format=ROW # 以行的格式记录 transaction-write-set-extraction=XXHASH64 # 使用哈希算法将其编码为散列 loose-group_replication_group_name='d7554cee-bc3f-11eb-bdca-0242ac16210a' # 加入的组名,可以修改,只要格式对 loose-group_replication_start_on_boot=off # 不自动启用组复制集群 loose-group_replication_local_address='mysql_m1:33061' # 除3306以外的端口。以本机端口3306接受来自组中成员的传入连接 loose-group_replication_group_seeds='mysql_m1:33061,mysql_s1:33062,mysql_s2:33063' # 除3306以外的端口。组中成员访问表 loose-group_replication_bootstrap_group=off # 不启用引导组 loose-group_replication_member_weight=50 # 权重:新主选举时的优先级参照,越大,优先级越高 #loose-group_replication_single_primary_mode=off #关闭单主模式的参数(本例测试时多主模式,所以关闭该项) #loose-group_replication_enforce_update_everywhere_checks=on #开启多主模式的参数 |
重启
1 |
docker restart mysql_m1 mysql_s1 mysql_s2 |
所有节点操作
1 |
docker exec -it mysql_m1 /bin/bash |
1 2 3 4 5 6 7 8 9 |
SET SQL_LOG_BIN=0; create user 'repl'@'%' identified by '123456'; grant replication slave on *.* to 'repl'@'%' with grant option; flush privileges; reset master; SET SQL_LOG_BIN=1; change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; install PLUGIN group_replication SONAME 'group_replication.so'; show plugins; |
master节点
1 2 3 4 |
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; SELECT * FROM performance_schema.replication_group_members; |
slave节点
1 2 3 |
set global group_replication_allow_local_disjoint_gtids_join=ON; start group_replication; select * from performance_schema.replication_group_members; |