一、MGR原理
一、基本定义
MGR(MySQL Group Replication) 是 MySQL 官方推出的一种高可用、高可靠的数据库集群解决方案,基于分布式系统理论(如 Paxos 协议变种)实现,主要用于构建强一致性的主从复制集群,支持多主或单主模式,确保数据在多个节点之间的可靠复制和故障转移。
二、核心特性
-
强一致性(Consistency)
- 通过分布式事务协调机制(基于 Paxos 的优化协议),确保所有节点的数据变更按相同顺序提交,避免传统主从复制可能出现的异步延迟导致的数据不一致问题。
- 所有写操作需多数节点(Quorum)确认后才会提交,保证集群内数据的强一致性。
-
高可用性(High Availability)
- 自动检测节点故障,当主节点失效时,集群可自动选举新主节点(需满足多数节点存活),无需人工干预,减少服务中断时间。
- 支持在线添加 / 删除节点,不影响集群正常运行。
-
多主或单主模式
- 单主模式(Single-Master):仅允许一个主节点写入,其他节点作为从节点只读,适合传统主从架构场景,避免多主写入冲突。
- 多主模式(Multi-Master):允许多个节点同时写入,通过冲突检测机制(如行级锁、全局事务 ID)避免写入冲突,适合读写分离或分布式写入场景。
-
成员管理与故障检测
- 基于组通信协议(如 NetXCOM)实现节点间的状态同步和心跳检测,实时监控集群成员状态。
- 节点加入 / 退出集群时,通过自动数据同步(State Transfer)快速完成数据初始化,无需手动备份恢复。
三、架构原理
-
节点角色
- 主节点(Primary):处理写操作并将变更同步到其他节点(单主模式下唯一可写节点;多主模式下所有节点均可写)。
- 从节点(Replica):接收主节点的变更并应用,提供读服务。
-
关键组件
- Group Replication Plugin:实现节点加入集群、事务协调、故障检测等核心逻辑。
- MySQL Binlog:记录数据变更,通过组复制协议在节点间同步。
- InnoDB 存储引擎:支持事务和行级锁,确保冲突检测和一致性。
-
工作流程
- 写事务提交时,主节点将事务包装为 “写集合”(Write Set),通过组播协议发送给所有从节点。
- 从节点验证事务是否冲突(如更新同一行记录),无冲突则应用事务,有冲突则回滚。
- 多数节点确认事务提交后,主节点才最终提交事务,确保数据一致性。
二、部署MGR集群
部署mgr集群需要三个MySQL单实例,MySQL安装单机版本安装就好了,这里不再说MySQL单机部署了跳过,介绍MGR集群如果构建。
介绍基础环境 三个节点10.10.65.101,10.10.65.102,10.10.65.103,已安装了MySQL单实例(注意这里要把MySQL的密码策略调整一致,如果不一致后期会因为这个组复制失败)
一、基础环境 把三台机器的信息写入到/etc/hosts文件里。
cat >> /etc/hosts << EOF
10.10.65.101 mgr1-010010065101
10.10.65.102 mgr2-010010065102
10.10.65.103 mgr3-010010065103
EOF
二、部署多主模式
有两种模式 一种是 single-primary 一种是 multi-primary 即单主或多主,这里部署的是多主模式
配置注意
每个节点配置需要不同
server-id=1
每个节点配置文件这个参数是自己节点的IP地址
group_replication_local_address=10.10.65.101:33061
每个节点配置文件uuid需要都相同
group_replication_group_name=70e4c56a-63b9-4666-bcd1-165266666eb9f
配置文件每个节点不一样
10.10.65.101 的配置文件
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
NGINE_SUBSTITUTION
character-set-server=utf8mb4
# 注意这里我改了MySQL的存储目录
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysqld/mysqld.pid
# MGR集群
# 插件目录
plugin_dir=/usr/lib64/mysql/plugin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
log_slave_updates=ON
transaction_write_set_extraction=XXHASH64
# MGR配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
early_plugin_load="group_replication.so"
group_replication_group_name=70e4c56a-63b9-4666-bcd1-165266666eb9f
group_replication_start_on_boot=OFF
group_replication_local_address=10.10.65.101:33061
group_replication_group_seeds=10.10.65.101:33061,10.10.65.102:33061,10.10.65.103:33061
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
# 其他优化参数
innodb_buffer_pool_size=1G
innodb_flush_log_at_trx_commit=2
sync_binlog=0
10.10.65.102 的配置文件
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysqld/mysqld.pid
# MGR集群
# 插件目录
plugin_dir=/usr/lib64/mysql/plugin
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
log_slave_updates=ON
transaction_write_set_extraction=XXHASH64
# MGR配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
early_plugin_load="group_replication.so"
group_replication_group_name=70e4c56a-63b9-4666-bcd1-165266666eb9f
group_replication_start_on_boot=OFF
group_replication_local_address=10.10.65.102:33061
group_replication_group_seeds=10.10.65.101:33061,10.10.65.102:33061,10.10.65.103:33061
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
# 其他优化参数
innodb_buffer_pool_size=1G
innodb_flush_log_at_trx_commit=2
sync_binlog=0
10.10.65.103 的配置文件
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysqld/mysqld.pid
# MGR集群
# 插件目录
plugin_dir=/usr/lib64/mysql/plugin
server-id=3
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
log_slave_updates=ON
transaction_write_set_extraction=XXHASH64
# MGR配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
early_plugin_load="group_replication.so"
group_replication_group_name=70e4c56a-63b9-4666-bcd1-165266666eb9f
group_replication_start_on_boot=OFF
group_replication_local_address=10.10.65.103:33061
group_replication_group_seeds=10.10.65.101:33061,10.10.65.102:33061,10.10.65.103:33061
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
# 其他优化参数
innodb_buffer_pool_size=1G
innodb_flush_log_at_trx_commit=2
sync_binlog=0
准备好上述配置文件后,重启MySQL数据库 。
三、创建用于MGR集群组复制的账号
以下sql在所有节点上操作
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SELECT User, Host FROM user;
+---------------+-----------+
| User | Host |
+---------------+-----------+
| admin | % |
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
5 rows in set (0.00 sec)
mysql> CREATE USER 'repl_user'@'%' IDENTIFIED BY 'ReplicationPassword1!';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
四、创建mgr集群
在第一节点操作 引导创建集群
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;
查询第一个节点创建出来的集群信息,目前只有一个节点。
SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| group_replication_applier | 2e1544a9-3203-11f0-b40b-005056914eca | mgr1-010010065101 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
1 row in set (0.00 sec)
在第二和三节点上运行
STOP GROUP_REPLICATION;
RESET SLAVE ALL;
CHANGE MASTER TO
MASTER_USER='repl_user',
MASTER_PASSWORD='ReplicationPassword1!'
FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
验证集群有几个节点,在任意一个节点都可以执行。这里需要查看每个节点的状态是ONLINE,说明节点是正常的,如果这里是RECOVERING状态需要注意,如果有节点长时间是RECOVERING状态,可能是这个节点没有完成数据同步,也有可能节点出现了异常,需要查看。
SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| group_replication_applier | 2e1544a9-3203-11f0-b40b-005056914eca | mgr1-010010065101 | 3306 | ONLINE |
| group_replication_applier | 31cc45ea-3203-11f0-8d5f-005056916f84 | mgr2-010010065102 | 3306 | ONLINE |
| group_replication_applier | 337c4d3d-3203-11f0-a4a4-005056916d63 | mgr3-010010065103 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
3 rows in set (0.00 sec)
查看这里说明MGR已经部署完成了,你可以在任意节点上创建数据库和sql,每个节点都可以读写,
问题:节点RECOVERING状态
如果节点异常RECOVERING状态,需要重新加入集群,运行以下代码,先停止复制,重置清空复制数据,最后开起组复制。
STOP GROUP_REPLICATION;
RESET SLAVE ALL;
CHANGE MASTER TO
MASTER_USER='repl_user',
MASTER_PASSWORD='ReplicationPassword1!'
FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
问题:ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
mgr集群出现 这个报错的时候查看报错日志,这里是因为binlog读取异常,这里要把binlog重置数据,停止复制后,重置binlog数据,再开启复制。
mysql]# tail -fn 300 mysqld.log | grep ERROR
2025-05-23T08:33:58.077528Z 0 [ERROR] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 11b3c0dd-37a9-11f0-b76b-0050569f8e51:1-8 > Group transactions: 70e4c56a-63b9-40a2-bcd1-1652eb52eb88:1-4'
2025-05-23T08:33:58.077610Z 0 [ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
节点恢复操作
-- 停止组复制
STOP GROUP_REPLICATION;
-- 清除所有复制信息
RESET MASTER;
RESET SLAVE ALL;
-- 配置复制用户
CHANGE MASTER TO
MASTER_USER='repl_user',
MASTER_PASSWORD='ReplicationPassword1!'
FOR CHANNEL 'group_replication_recovery';
-- 启动组复制
START GROUP_REPLICATION;