使用版本: 8.0.26
集群 my.cnf 配置
loose 前缀的作用在于第一次启动时还没加载组复制的 plugin,可以让 mysql server 忽略该参数继续启动。
不同节点需修改 server_id 和 group_replication_local_address
该配置需启动时加载,要确保 /etc/my.cnf 包含 /etc/mysql/conf.d/ 目录下的配置文件
[mysqld]server_id=1gtid_mode=ONenforce_gtid_consistency=ONdisabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"binlog_checksum=NONElog_bin=binlog#log_slave_updates=ON # 5.7log_replica_updates=ONbinlog_format=ROW# 8.0 后为默认配置#master_info_repository=TABLE#relay_log_info_repository=TABLE#transaction_write_set_extraction=XXHASH64plugin_load_add='group_replication.so'# 可以使用 SELECT UUID() 生成一个loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"# 配置成员后,可以设置 group_replication_start_on_boot 为 on 在服务器启动时自动启动组复制。loose-group_replication_start_on_boot=off# 配置 group_replication_local_address 设置成员用于与组中其他成员进行内部通信的网络地址和端口。loose-group_replication_local_address= "s1:33061"loose-group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"loose-group_replication_bootstrap_group=off# 小于 8.0.22 的配置 group_replication_ip_whitelist=127.0.0.1/8,192.168.1.1/24loose-group_replication_ip_allowlist=127.0.0.1/8,192.168.1.1/24loose-group_replication_recovery_get_public_key=ON
启动服务
docker run -dit --name mysql --restart always --net host -v /path/mgr.cnf:/etc/mysql/conf.d/mgr.cnf -v /etc/localtime:/etc/locatime:ro -v /var/lib/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=password mysql/mysql-server
账户创建
SET SQL_LOG_BIN=0;CREATE USER rpl_user@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';# 8.0GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';FLUSH PRIVILEGES;SET SQL_LOG_BIN=1;CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';# Or from MySQL 8.0.23:CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';SELECT * FROM performance_schema.replication_group_members;SHOW STATUS LIKE 'group_replication_primary_member';
实例检查
需要每一个实例都执行
SET SQL_LOG_BIN=0;CREATE USER mgr@'%' IDENTIFIED BY '123456';FLUSH PRIVILEGES;SET SQL_LOG_BIN=1;mysqlsh root@localhost:3306dba.checkInstanceConfiguration()# 将报错无权限,按照提示授权,登录 mysql 终端重新执行授权语句SET SQL_LOG_BIN=0;GRANT xxxxxxxFLUSH PRIVILEGES;SET SQL_LOG_BIN=1;# 登录后 mysqlsh 执行如下命令修复配置问题dba.configureInstance()# 执行后返回 okdba.checkInstanceConfiguration()
创建集群
var cluster = dba.createCluster('cluster_name');cluster.addInstance('mgr@ip:3306');# 查看状态cluster.describe()cluster.status()
实例恢复
var cluster = dba.getCluster('cluster_name')cluster.rescan()cluster.rejoinInstance('root@ip:3306')cluster.removeInstance("root@ip:3306")
重启 mgr
dba.rebootClusterFromCompleteOutage()var cluster = dba.getCluster('cluster_name')cluste.status()
启动 mgr
START GROUP_REPLICATION;# 查看主从库信息SELECT * FROM performance_schema.replication_group_members;# 查看本机 MySQL 的 server_uuidshow variables like '%server_%';# 切换主库命令SELECT group_replication_set_as_primary('换成目标库的server_uuid');# 查看切换进度SELECT event_name, work_completed, work_estimated FROM performance_schema.events_stages_current WHERE event_name LIKE "%stage/group_rpl%";
启动 MySQL Router
docker run -dit --name mysql-router --restart always --net host -e MYSQL_HOST=192.168.1.1 -e MYSQL_PORT=3306 -e MYSQL_USER=mgr mysql/mysql-router
连接 6446 端口进行测试
