MySQL组复制(MGR)是MySQL官方提供的原生高可用分布式集群解决方案,通过Paxos协议保证集群内所有节点的数据一致性,支持自动故障检测与节点动态加入退出,可满足大多数分布式场景的数据库高可用需求。
MGR集群核心架构
MGR集群由多个MySQL实例节点组成,所有节点分为两种角色:
- 主节点:单主模式下唯一处理写请求的节点,多主模式下所有节点都可处理写请求
- 从节点:同步主节点的数据变更,仅提供读服务
集群的通信层基于Paxos协议实现,每个节点的变更操作都需要经过多数派节点确认后才会提交,保证数据在不同节点间的一致性。
Paxos协议在MGR中的工作原理
Paxos协议是解决分布式系统一致性的经典算法,MGR中采用的是类Multi-Paxos实现,核心流程分为三个阶段:
1. 提议阶段
发起写操作的节点作为提议者,生成一个全局唯一的提议编号,向集群内所有节点发送提议请求。
2. 接受阶段
接收节点收到提议后,对比本地已接受的最大提议编号,若当前提议编号更大,则返回接受响应,否则拒绝。
3. 学习阶段
当提议者收到超过半数节点的接受响应后,向所有节点发送提交请求,所有节点执行该变更操作并持久化到本地。
这种机制保证了只要集群中存活节点数超过总节点数的半数,就可以正常提供服务,同时避免脑裂问题。
MGR集群配置前置条件
配置MGR集群前需要满足以下基础要求:
- MySQL版本不低于5.7.17,推荐使用8.0及以上版本
- 所有节点开启GTID模式,保证事务全局唯一标识
- 所有节点使用相同的字符集与排序规则
- 节点间网络互通,建议关闭防火墙或开放对应端口
单主模式MGR集群配置步骤
1. 基础参数配置
所有节点修改MySQL配置文件my.cnf,添加以下配置:
-- 开启GTID gtid_mode = ON enforce_gtid_consistency = ON -- MGR基础配置 plugin_load_add = 'group_replication.so' group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" -- 集群唯一UUID,所有节点一致 group_replication_start_on_boot = OFF group_replication_local_address = "192.168.0.1:33061" -- 当前节点的组内通信地址,每个节点不同 group_replication_group_seeds = "192.168.0.1:33061,192.168.0.2:33061,192.168.0.3:33061" -- 集群所有节点的通信地址 group_replication_single_primary_mode = ON -- 开启单主模式 group_replication_enforce_update_everywhere_checks = OFF
2. 初始化节点
启动所有节点的MySQL服务,登录第一个节点执行以下操作:
-- 创建MGR专用复制用户 CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; -- 配置复制通道 CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='Repl@123456' FOR CHANNEL 'group_replication_recovery'; -- 启动MGR组复制 INSTALL PLUGIN group_replication SONAME 'group_replication.so'; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
3. 加入其他节点
登录第二个、第三个节点,执行以下操作加入集群:
-- 创建复制用户(和第一个节点一致) CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; -- 配置复制通道 CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='Repl@123456' FOR CHANNEL 'group_replication_recovery'; -- 启动组复制加入集群 START GROUP_REPLICATION;
4. 验证集群状态
在任意节点执行以下SQL查看集群状态:
SELECT * FROM performance_schema.replication_group_members;
若所有节点的MEMBER_STATE字段为ONLINE,且只有一个节点的MEMBER_ROLE为PRIMARY,说明单主MGR集群配置成功。
常见问题排查
- 节点无法加入集群:检查通信端口是否互通,group_replication_group_name是否所有节点一致
- 数据不一致:检查所有节点的GTID是否开启,是否有未同步的历史数据
- 主节点故障:单主模式下集群会自动选举新的主节点,无需人工干预