使用版本: 8.0.26

集群 my.cnf 配置

loose 前缀的作用在于第一次启动时还没加载组复制的 plugin,可以让 mysql server 忽略该参数继续启动。
不同节点需修改 server_idgroup_replication_local_address
该配置需启动时加载,要确保 /etc/my.cnf 包含 /etc/mysql/conf.d/ 目录下的配置文件

  1. [mysqld]
  2. server_id=1
  3. gtid_mode=ON
  4. enforce_gtid_consistency=ON
  5. disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
  6. binlog_checksum=NONE
  7. log_bin=binlog
  8. #log_slave_updates=ON # 5.7
  9. log_replica_updates=ON
  10. binlog_format=ROW
  11. # 8.0 后为默认配置
  12. #master_info_repository=TABLE
  13. #relay_log_info_repository=TABLE
  14. #transaction_write_set_extraction=XXHASH64
  15. plugin_load_add='group_replication.so'
  16. # 可以使用 SELECT UUID() 生成一个
  17. loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  18. # 配置成员后,可以设置 group_replication_start_on_boot 为 on 在服务器启动时自动启动组复制。
  19. loose-group_replication_start_on_boot=off
  20. # 配置 group_replication_local_address 设置成员用于与组中其他成员进行内部通信的网络地址和端口。
  21. loose-group_replication_local_address= "s1:33061"
  22. loose-group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
  23. loose-group_replication_bootstrap_group=off
  24. # 小于 8.0.22 的配置 group_replication_ip_whitelist=127.0.0.1/8,192.168.1.1/24
  25. loose-group_replication_ip_allowlist=127.0.0.1/8,192.168.1.1/24
  26. loose-group_replication_recovery_get_public_key=ON

启动服务

  1. 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

账户创建

  1. SET SQL_LOG_BIN=0;
  2. CREATE USER rpl_user@'%' IDENTIFIED BY '123456';
  3. GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  4. # 8.0
  5. GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
  6. FLUSH PRIVILEGES;
  7. SET SQL_LOG_BIN=1;
  8. CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
  9. # Or from MySQL 8.0.23:
  10. CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
  11. SELECT * FROM performance_schema.replication_group_members;
  12. SHOW STATUS LIKE 'group_replication_primary_member';

实例检查

需要每一个实例都执行

  1. SET SQL_LOG_BIN=0;
  2. CREATE USER mgr@'%' IDENTIFIED BY '123456';
  3. FLUSH PRIVILEGES;
  4. SET SQL_LOG_BIN=1;
  5. mysqlsh root@localhost:3306
  6. dba.checkInstanceConfiguration()
  7. # 将报错无权限,按照提示授权,登录 mysql 终端重新执行授权语句
  8. SET SQL_LOG_BIN=0;
  9. GRANT xxxxxxx
  10. FLUSH PRIVILEGES;
  11. SET SQL_LOG_BIN=1;
  12. # 登录后 mysqlsh 执行如下命令修复配置问题
  13. dba.configureInstance()
  14. # 执行后返回 ok
  15. dba.checkInstanceConfiguration()

创建集群

  1. var cluster = dba.createCluster('cluster_name');
  2. cluster.addInstance('mgr@ip:3306');
  3. # 查看状态
  4. cluster.describe()
  5. cluster.status()

实例恢复

  1. var cluster = dba.getCluster('cluster_name')
  2. cluster.rescan()
  3. cluster.rejoinInstance('root@ip:3306')
  4. cluster.removeInstance("root@ip:3306")

重启 mgr

  1. dba.rebootClusterFromCompleteOutage()
  2. var cluster = dba.getCluster('cluster_name')
  3. cluste.status()

启动 mgr

  1. START GROUP_REPLICATION;
  2. # 查看主从库信息
  3. SELECT * FROM performance_schema.replication_group_members;
  4. # 查看本机 MySQL 的 server_uuid
  5. show variables like '%server_%';
  6. # 切换主库命令
  7. SELECT group_replication_set_as_primary('换成目标库的server_uuid');
  8. # 查看切换进度
  9. SELECT event_name, work_completed, work_estimated FROM performance_schema.events_stages_current WHERE event_name LIKE "%stage/group_rpl%";

启动 MySQL Router

  1. 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 端口进行测试