一、MySQL 组复制(MGR)核心概念
MySQL Group Replication(简称 MGR)是 MySQL 官方推出的 高可用(HA)+ 强一致性 解决方案,基于改进的 Paxos 协议实现,核心能力可概括为 3 点:
- 数据强一致:事务需经集群中「多数节点(N/2+1)」确认后才提交,避免数据延迟或混乱;
- 自动故障转移:主节点故障时,剩余节点自动选举新主,无需人工干预; 灵活架构:支持「单主模式」(1
个可写节点,多只读节点)和「多主模式」(所有节点均可写),适配不同业务场景(读多写少 / 分布式写)。 - MGR 对表有一个硬性要求:所有表必须有主键或唯一索引(用于跟踪数据变化,确保同步不冲突),这也是前期操作中避免报错的关键。
二、搭建前置准备与环境说明
- MySQL源码环境:
https://blog.csdn.net/racwwt/article/details/151259281
1. 环境信息
本次搭建使用 3 台节点组成集群,具体信息如下:
主机名 | ip | 操作系统版本 | mysql版本 |
---|---|---|---|
master | 192.168.2.102/24 | rhel7.9 | mysql8.0.40 |
node1 | 192.168.2.104/24 | rhel7.9 | mysql8.0.40 |
node2 | 192.168.2.105/24 | rhel7.9 | mysql8.0.40 |
https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html
2.前置配置
MGR 集群依赖节点间的通信与身份识别,需先完成以下准备:
配置域名自解析(所有节点执行):
目的是让节点通过主机名(如 master、node1)相互访问,避免直接写 IP 导致配置繁琐。
编辑 /etc/hosts 文件,添加以下内容
#三个主机均需要配置hosts文件的解析,如果不配置域名解析则需要在/etc/my.cnf中加一条配置skip-name-resolve
[root@node1 ~]# cat /etc/hosts
192.168.2.102 master
192.168.2.104 node1
192.168.2.105 node2
三、MGR 单主模式搭建
单主模式是 MGR 默认架构,仅 master 节点可执行写操作(如插入 / 更新数据),node1、node2 为只读节点,适合「读多写少」场景(如电商商品详情页)。
1. Master 节点配置(修改 my.cnf)
#1)修改配置文件
[root@master ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM #设置日志时间和本地时间保持一致
server_id=102
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" #组复制,数据必须存储在 InnoDB 事务存储引擎中
gtid_mode=ON #组复制要开启gtid
enforce_gtid_consistency=ON
log_bin=binlog #默认开启
log_slave_updates=ON #默认开启
binlog_format=ROW #默认开启
transaction_write_set_extraction=XXHASH64 #默认开启,组复制使用此信息在所有组成员上进行冲突检测
plugin_load_add='group_replication.so' #将组复制插件添加到服务器启动时加载的插件列表中
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #告诉插件它正在加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa”
group_replication_start_on_boot=off #插件在服务器启动时不自动启动操作,使用手动启动插件
group_replication_local_address= "192.168.2.102:33061" #与其它主机通信时使用的网络地址和端口
group_replication_group_seeds= "master:33061,node1:33061,node2:33061" #设置组成员的主机名和端口
group_replication_bootstrap_group=off #指示插件是否启动该组,在首次引导组时在一个服务器上启用
group_replication_ip_whitelist="192.168.2.0/24,127.0.0.1/8" #仅允许白名单内的 IP 加入复制组
group_replication_recovery_use_ssl=on #caching_sha2_password插件要求安全传输密码,开启主从之间的连接使用SSL/TLS
[root@master ~]# /etc/init.d/mysqld restart
2. Master 节点创建复制账号与授权
MGR 节点间同步数据需专用账号,登录 MySQL 后创建 rp 用户并授予权限(所有节点后续均需创建相同账号)
执行以下 SQL 语句(SET SQL_LOG_BIN=0 表示当前操作不记录 binlog,避免同步给从节点)
#2)在主的数据库中使用sql语句添加复制账号并授予权限,从上面也需要设置一样的账号
-- 1. 临时关闭binlog(避免账号创建操作被同步)
SET SQL_LOG_BIN = 0;-- 2. 创建复制账号 rp(密码123,可自定义,所有节点需一致)
CREATE USER rp@'%' IDENTIFIED BY '123';-- 3. 授予MGR所需权限(复制、连接管理、备份、流复制权限)
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';-- 4. 刷新权限
FLUSH PRIVILEGES;-- 5. 恢复binlog记录
SET SQL_LOG_BIN = 1;-- 6. 配置MGR恢复通道(指定用rp账号同步数据)
CHANGE REPLICATION SOURCE TO
SOURCE_USER = 'rp',
SOURCE_PASSWORD = '123' FOR CHANNEL 'group_replication_recovery';#注意:如果需要重置则使用命令reset master;
3. 验证 MGR 插件加载
确认 MGR 插件已成功加载(避免后续启动失败)
#3)查看是否有group_replication插件
mysql> show plugins;
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
4. 启动 MGR 集群(引导 Master)
首次启动集群需通过 Master 节点「引导」(开启 group_replication_bootstrap_group)
#4)启动MGR集群
#使用当前服务器作为引导服务器启动一个新的群组复制过程或者恢复一个已经存在的群组
-- 1. 开启集群引导(仅Master首次启动时执行)
mysql> SET GLOBAL group_replication_bootstrap_group = ON;-- 2. 启动MGR(指定用rp账号通信)
mysql> START GROUP_REPLICATION USER = 'rp', PASSWORD = '123';-- 3. 关闭集群引导(避免重复引导导致冲突)
mysql> SET GLOBAL group_replication_bootstrap_group = OFF;
#在主上查看组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
5. 从节点(node1、node2)配置
#1)在从上写配置文件
[root@node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM
server_id=104
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="192.168.2.104:33061"
group_replication_group_seeds="master:33061,node1:33061,node2:33061"
group_replication_ip_whitelist="192.168.2.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_recovery_use_ssl=on
[root@node1 ~]# /etc/init.d/mysqld restart[root@node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM
server_id=105
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="192.168.2.105:33061"
group_replication_group_seeds="master:33061,node1:33061,node2:33061"
group_replication_ip_whitelist="192.168.2.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_recovery_use_ssl=on
[root@node2 ~]# /etc/init.d/mysqld restart
6. 从节点创建复制账号与授权
与 Master 步骤 2 完全一致,在 node1 和 node2 上分别登录 MySQL,执行相同的账号创建与授权 SQL
#2)在所有从的数据库中使用sql语句添加复制账号并授予权限,从上面也需要设置一样的账号
SET SQL_LOG_BIN=0;
CREATE USER rp@'%' IDENTIFIED BY '123';
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE REPLICATION SOURCE TO SOURCE_USER='rp', SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';
7. 从节点加入 MGR 集群且验证整个集群状态
从节点无需引导集群,直接启动 MGR 即可自动加入(node1 和 node2 分别执行):
#3)开启组复制
mysql> START GROUP_REPLICATION USER='rp', PASSWORD='123';
#查看组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+--------------
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUN
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+--------------
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f0 | master | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f1 | node2 | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f2 | node1 | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+--------------
3 rows in set (0.00 sec)
8. 单主模式功能验证
#master执行,从节点不支持写入操作
mysql> create database test2;
mysql> use test2;
mysql> create table t3(id int primary key);
mysql> insert into t3 values(9527);
#从上查看
mysql> select * from test2.t3;
+------+
| id |
+------+
| 9527 |
+------+
9. 测试主节点宕机
MGR 核心优势是「自动故障转移」,测试 Master 故障后集群是否正常:
#测试主节点宕机
mysql> stop GROUP_REPLICATION;
#从库节点查看,发现仅剩2个节点,并且自动选举出主节点
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f1 | node2 | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f2 | node1 | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
2 rows in set (0.00 sec)#重新启动前面的master主节点,可以看到master已经作为从节点加入到群组中
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (10.73 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f0 | master | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f1 | node2 | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f2 | node1 | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
四、MGR 多主模式搭建(基于单主改造)
多主模式允许 所有节点均可写(如 master、node1、node2 都能插入数据),适合「分布式写」场景(如多区域业务)。搭建需在单主模式基础上修改配置,关闭单主限制。
1. 所有节点修改 my.cnf 配置
在 master、node1、node2 的 /etc/my.cnf 中添加以下 2 个参数(关闭单主,开启多主一致性检查)
#修改所有的my.cnf的配置文件,添加如下内容
#关闭单master模式
loose-group_replication_single_primary_mode=off
#多主一致性检查
loose-group_replication_enforce_update_everywhere_checks=ON
[root@master mysql]# /etc/init.d/mysqld restart
2. 启动多主模式集群
#在其中一台主机里面执行以下mysql命令
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
#在另外两台主机里面执行以下mysql命令,开启组复制
mysql> START GROUP_REPLICATION;
#所有节点的 MEMBER_ROLE 均为 PRIMARY(表示均可写)
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f0 | master | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f1 | node2 | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f2 | node1 | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.01 sec)
#在三个主机上面分别执行以下三条命令测试是否都可以执行写入操作
mysql> insert into test2.t3 values(612);
mysql> insert into test2.t3 values(613);
mysql> insert into test2.t3 values(614);
mysql> select * from test2.t3;
+------+
| id |
+------+
| 612 |
| 613 |
| 614 |
| 9527 |
+------+
五、总结
- 核心流程:环境准备(hosts/MySQL 基础)→ 配置文件修改(启用 MGR 插件、参数)→ 复制账号创建→ 集群启动→ 功能验证;
- 单主 vs 多主:单主适合读多写少,多主适合分布式写;两者切换仅需修改 2 个配置参数,灵活度高;
- MGR 优势:自动故障转移(无需外部工具如 MHA)、数据强一致(避免脑裂)、动态扩缩容(节点加入 / 退出不中断服务)。