1、准备

在三台服务器安装好mysql8.0

2、修改my.cnf配置文件 在[mysqld]标签下添加MGR相关配置 (重启mysql)

# 组复制==============start
# Mysql服务ID
server-id=1
# 全局事务
gtid-mode=on
# 强制GTID的一致性
enforce-gtid-consistency=on
# 将master.info元数据保存在系统表中
master-info-repository=TABLE
# 将relay.info元数据保存在系统表中
relay-log-info-repository=TABLE
# 禁用二进制日志事件校验
binlog-checksum=none
# 级联复制
log-slave-updates=on
# 开启二进制日志记录
log-bin=binlog
# 以行的格式记录
binlog-format=ROW
# 使用哈希算法将其编码为散列
transaction-write-set-extraction=XXHASH64
# 加入的组名,可以修改,只要格式对
loose-group_replication_group_name='ce9be252-2b71-11e6-b8f4-00212844f856'
# 不自动启用组复制集群
loose-group_replication_start_on_boot=off
# 以本机端口33061接受来自组中成员的传入连接
loose-group_replication_local_address='192.168.51.115:33061'
# 组中成员访问表
loose-group_replication_group_seeds='192.168.51.115:33061,192.168.51.116:33062,192.168.51.117:33063'
# 不启用引导组
loose-group_replication_bootstrap_group=off
# 开启多主模式以下两行配置
# 关闭单master模式
loose-group_replication_single_primary_mode=off
# 开启多主一致性检查
loose-group_replication_enforce_update_everywhere_checks=ON
# 组复制==============end

备注:不同服务器  server-id 、loose-group_replication_local_address 这两个属性不一样。

 

3.进入mysql控制台 创建组复制用户

CREATE USER 'slave'@'%' IDENTIFIED BY 'XM_zm2019';

# mysql8.0 不能加identified by
grant replication slave,replication client on *.* to slave@'%';

FLUSH PRIVILEGES;

 

4.构建组复制集群信息

change master to master_user='slave',master_password='XM_zm2019' for channel 'group_replication_recovery';

 

5.安装MGR插件并查看插件是否安装成功

install PLUGIN group_replication SONAME 'group_replication.so';

show plugins;

mysql8.0 mgr mysql8.0 mgr集群_mysql

 

 

 

6.作为主服务器需要由这台服务器开启引导,开启组复制(group replication)集群

mysql> set global group_replication_bootstrap_group=on;  //开启组复制引导
Query OK, 0 rows affected (0.00 sec)
mysql> start group_replication;  //开启组复制
Query OK, 0 rows affected (2.24 sec)
mysql> set global group_replication_bootstrap_group=off;  //关闭组复制引导
Query OK, 0 rows affected (0.00 sec)

查看到添加到组复制集群的服务器信息

select * from performance_schema.replication_group_members;

备注:其他节点在执行开启组复制命令时会自动加入集群  start group_replication;

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 0386ca5c-6d1f-11ec-a050-00155d0a3233 | linux-8e8f  |        3306 | RECOVERING   | PRIMARY     | 8.0.25         |
| group_replication_applier | 05c31313-6d38-11ec-bdad-00155d0a3235 | linux-8e8f  |        3306 | RECOVERING   | PRIMARY     | 8.0.25         |
| group_replication_applier | 420466eb-6d33-11ec-8547-00155d0a323c | linux-8e8f  |        3306 | ONLINE       | PRIMARY     | 8.0.25         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.01 sec)

 

指定hostname名称(MEMBER_HOST显示的值)命令(相同的主机名称可能导致sql主备通信失败)

hostnamectl set-hostname mgr116

# 永久
hostnamectl --static set-hostname node115

 

可能用到的命令:

1.启动MGR失败可以考虑执行以下命令 

reset slave

reset master;

reset slave all;

 

2.查看mysql正在运行哪些线程

show full processlist;

3.查看mysql错误日志(配置文件加上如下配置 可以使用tail命令查看)

log-error=/var/log/mysql/mysqld.log

 

4.创建MGR架构时需要保证数据库一步,如果出现不一致 会导致mgr报错节点脱离集群

如果出现error mgr会设置数据库为只读 需要手动去解决

2022-04-07T02:10:51.243145Z 37 [ERROR] [MY-010584] [Repl] Slave SQL for channel 'group_replication_applier': Error 'Can't drop database 'shop_ds_master'; database doesn't exist' on query. Default database: 'shop_ds_master'. Query: 'DROP DATABASE `shop_ds_master`', Error_code: MY-001008
2022-04-07T02:10:51.243285Z 37 [Warning] [MY-010584] [Repl] Slave: Can't drop database 'shop_ds_master'; database doesn't exist Error_code: MY-001008
2022-04-07T02:10:51.243396Z 37 [ERROR] [MY-011451] [Repl] Plugin group_replication reported: 'The applier thread execution was aborted. Unable to process more transactions, this member will now leave the group.'
2022-04-07T02:10:51.243477Z 37 [ERROR] [MY-010586] [Repl] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'FIRST' position 0
2022-04-07T02:10:51.243519Z 34 [ERROR] [MY-011452] [Repl] Plugin group_replication reported: 'Fatal error during execution on the Applier process of Group Replication. The server will now leave the group.'
2022-04-07T02:10:51.243683Z 34 [ERROR] [MY-011712] [Repl] Plugin group_replication reported: 'The server was automatically set into read only mode after an error was detected.'
2022-04-07T02:10:51.244084Z 34 [System] [MY-011565] [Repl] Plugin group_replication reported: 'Setting super_read_only=ON.'
2022-04-07T02:10:54.943272Z 0 [System] [MY-011504] [Repl] Plugin group_replication reported: 'Group membership changed: This member has left the group.'

 

5.关闭数据库只读限制

set global super_read_only=OFF;

 

6.单主 设置权重配置

loose-group_replication_member_weight=40

7.卸载MGR插件

UNINSTALL PLUGIN group_replication;

8.MGR限流配置

loose-group_replication_flow_control_mode=DISABLED

在命令行可以使用如下命令

set group_replication_flow_control_mode=QUOTA

set group_replication_flow_control_mode='DISABLED'

 

备注:

# 查看二进制日志信息
show binary logs;

mysql查看binlog

#只查看第一个binlog文件的内容mysql> show binlog events;#查看指定binlog文件的内容mysql> show binlog events in 'mysql-bin.000002';#获取binlog文件列表mysql> show binary logs;#查看当前正在写入的binlog文件mysql> show master status;

查看服务id

SHOW VARIABLES LIKE 'server_id';

 

 使用mysql_clone.so(mysql 8.17版本之后才有该功能)插件解决已存在数据库同步问题

被克隆的mysql服务:

GRANT BACKUP_ADMIN,CLONE_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,SYSTEM_VARIABLES_ADMIN ON *.* TO `root`@`%` WITH GRANT OPTION;

执行克隆的服务器:

GRANT BACKUP_ADMIN,CLONE_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,SYSTEM_VARIABLES_ADMIN ON *.* TO `root`@`%` WITH GRANT OPTION; 

INSTALL PLUGIN CLONE SONAME "mysql_clone.so";

SET GLOBAL clone_valid_donor_list = '192.168.51.116:3306';

CLONE INSTANCE FROM 'root'@'192.168.51.116':3306 IDENTIFIED BY 'XM_zm2019';

 

MGR的限制
- 存储引擎必须为Innodb,即仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;
- 每个表必须提供主键;
- 只支持ipv4,网络需求较高;
- 必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set;
- COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景;
- 目前一个MGR集群组最多支持9个节点;
- 不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚;
- 二进制日志binlog不支持Replication event checksums;
- 多主模式(也就是多写模式) 不支持SERIALIZABLE事务隔离级别;
- 多主模式不能完全支持级联外键约束;
- 多主模式不支持在不同节点上对同一个数据库对象并发执行DDL(在不同节点上对同一行并发进行RW事务,后发起的事务会失败);

MGR组复制优势
-  弹性复制(高扩展性):server动态添加移除
-  高可用分片(高扩展性):分片实现写扩展,每个分片是一个复制组。
-  替代主从复制(高扩展性):整组写入,避免单点争用。
-  自动化系统:自动化部署Mysql复制到已有复制协议的自动化系统。
-  故障检测与容错:自动检测,若服务faild,组内成员大多数达成认为该服务已不正常,则自动隔离。
-  组内成员会构成一个视图,组内成员主动加入或离开(主动或被动),都会更新组配置,更新视图。成员自愿离开,先更新组配置,然后采用大多数成员(不包含主动脱离的成员)意见是否确认该成员离开更新视图。如果是故障要排除,则需大多数服务确认(包括故障成员意见),然后才会更新组配置和视图。   
-  最大允许即时故障数:f=(n-1)/2,多数正常则正常

 

问题1: This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' first

mysql> reset slave;
ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' first
mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.06 sec)

mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.40 sec)

mysql> start SLAVE IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.20 sec)

 

⎛⎝官萧何⎠⎞