---
tags: [MySQL, Group Replication, Paxos, 多主复制, 集群]
create time: 2026-05-16 00:00
---
# Group Replication(组复制)
## 概述
Group Replication(GR)是 Oracle 官方提供的 MySQL 高可用解决方案,基于 Paxos 共识算法实现多主复制,提供自动故障检测和成员管理。它代表了 MySQL 分布式能力的核心方向。
## GR 与主从复制的对比
```mermaid
flowchart LR
subgraph "传统主从"
RM["单主模型
Master → Slave(s)"]
RS["异步/半同步复制"]
RF["故障切换需外部工具"]
end
subgraph "Group Replication"
RG["多主模型
任一节点接受写入"]
RP["Paxos 共识保证一致性"]
RA["自动故障检测 + 自动选举"]
end
RM -.">"| RA
RF -.">"| RA
style RG fill:#00B6BC,color:#fff
style RP fill:#C44569,color:#fff
style RA fill:#00D866,color:#fff
```
## 两种工作模式
### 单主模式(Single-Primary)
```mermaid
flowchart TD
Primary["Primary\nRW + RO"] --> Paxos["Paxos 共识层"]
Paxos --> S1["Secondary 1\n只读"]
Paxos --> S2["Secondary 2\n只读"]
Paxos --> S3["Secondary N\n只读"]
style Primary fill:#00B6BC,color:#fff
style Paxos fill:#C44569,color:#fff
style S1 fill:#74b9ff,color:#000
style S2 fill:#74b9ff,color:#000
style S3 fill:#74b9ff,color:#000
```
- **特点**:类似主从,但故障切换全自动
- **适用**:大多数读写分离场景
- **冲突解决**:单主天然无冲突
### 多主模式(Multi-Primary)
```mermaid
flowchart LR
N1["Node 1\nRW + RO"] <-- Paxos --> N2["Node 2\nRW + RO"]
N2 <-- Paxos --> N3["Node 3\nRW + RO"]
style N1 fill:#00B6BC,color:#fff
style N2 fill:#C44569,color:#fff
style N3 fill:#00D866,color:#fff
```
- **特点**:所有节点都可读写
- **适用**:多数据中心容灾、低延迟写入需求
- **冲突检测**:基于行级别的乐观锁,冲突时拒绝写入节点
> [!WARNING] 多主模式的限制
> - 有冲突检测但不自动解决——冲突的那条事务会被拒绝并返回错误码 3092
> - 不适合相同数据在多个节点上同时修改的场景
> - **生产环境推荐使用单主模式**
## GR 的工作原理
```mermaid
flowchart TD
Client["客户端连接"] --> Node["任意节点"]
Node --> TXN["事务执行"]
TXN --> Cert["Certification: 检查与其他节点的冲突"]
Cert -->|"无冲突"| Order["Ordering: 获得全局顺序号"]
Cert -->|"冲突"| REJECT["❌ 事务被拒绝
error 3092"]
Order --> Broadcast["Broadcast: 向所有成员广播 committed order"]
Broadcast --> Apply["Apply: 按全局顺序提交"]
Apply --> Members{"所有成员 >= N/2+1?"}
Members -->|是| SUCCESS["✅ 事务提交成功"]
Members -->|否| PENDING["⏳ pending 状态
等待多数派确认"]
style SUCCESS fill:#00D866,color:#fff
style REJECT fill:#EE5A24,color:#fff
style PENDING fill:#FF9F43,color:#000
```
### Certification(认证)
GR 在每个事务提交前进行冲突检测:
```go
// 伪代码:certification 算法
func certTransaction(txn Transaction) error {
for _, pk := range txn.writeSet.primaryKeys {
// 检查全局 write set 中是否存在相同主键的并发事务
if conflict, exists := globalWriteSet.Find(pk); exists {
if !areCommutative(txn, conflict) {
return ErrorConflict("row-level conflict detected")
}
}
}
return nil
}
```
**认证流程的核心思路:**
1. **Collect**: 当事务在本地执行完毕后,收集所有被修改行的主键集合(write set)
2. **Certify**: 将 write set 与组内其他成员已提交的事务进行比较
3. **Resolve**: 若发现冲突且不可交换(commutative),则拒绝该事务(返回错误码 3092);若无冲突或可交换,则通过认证
> [!TIP] 什么是可交换操作?
> 两个事务如果修改的是不同的行,即使它们同时发生也不会冲突,这在数学上称为「可交换」(commutative)。例如:`UPDATE users SET age=age+1 WHERE id=1` 和 `UPDATE users SET name='Alice' WHERE id=2` 是可交换的,GR 允许两者都提交。
### Ordering(全局排序)
通过认证后,事务需要获得一个全局顺序号(view change ID + local order),确保所有节点以**完全相同的顺序**应用事务——这是保证一致性的关键。
### Broadcast & Apply(广播与应用)
获得全局序号的事务会通过 group communication layer 广播给所有组成员。每个成员收到后按全局顺序依次 apply,最终达成状态机的一致性。这就是 Paxos/Raft 式的确定性状态机复制。
```mermaid
flowchart TD
TA["事务 A: UPDATE users SET x=1 WHERE id=1"]
TB["事务 B: UPDATE users SET y=2 WHERE id=1"]
TA --> CA{Certification}
TB --> CB{Certification}
CA -->|passed| O1["已获得全局顺序 #100"]
CB -->|conflict! both write id=1| CE["Conflict Error 3092"]
style CE fill:#EE5A24,color:#fff
```
## 部署配置
```ini
# 每个节点 my.cnf 中需要配置
# 基本复制配置
server_id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
# GR 专用配置
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 = "10.0.1.10:33061"
group_replication_group_seeds = "10.0.1.10:33061,10.0.1.11:33061,10.0.1.12:33061"
# 单主模式
group_replication_single_primary_mode = ON
group_replication_enforce_update_everywhere_checks = OFF
# 多主模式(取消注释以上两行,注释掉以下两行)
# group_replication_single_primary_mode = OFF
# group_replication_enforce_update_everywhere_checks = ON
```
### 初始化步骤
```sql
-- 在每个节点上执行
-- 1. 创建复制用户
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
-- 2. 配置集群地址
SET GLOBAL group_replication_bootstrap_group = OFF;
-- 3. 在第一个节点启动组(引导组)
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;
-- 4. 在其他节点加入组
START GROUP_REPLICATION;
-- 5. 检查组成员状态
SELECT * FROM performance_schema.replication_group_members;
```
## 性能与注意事项
### 性能特点
GR 的性能瓶颈主要来自 Paxos 共识层,以下为生产环境的经验总结:
| 维度 | 说明 |
|------|------|
| **写入延迟** | 单主模式下,提交需要等待多数派确认(majority commit),TPS 通常比异步主从低 20%~40% |
| **并发能力** | 行级认证 + 乐观锁策略让不同行的写操作可以并行通过,高并发小事务场景表现较好 |
| **网络要求** | 节点间通过端口 33061 通信,要求低延迟、高带宽局域网;跨 DC 部署延迟应控制在 5ms 以内 |
| **SSD 必要** | binlog 和 relay log 频繁刷盘,强烈建议使用 SSD/NVMe |
### 生产注意事项
> [!IMPORTANT] 上线前必须检查的清单
> 1. **表必须有主键**:没有主键的表无法被 GR 复制,启动时会报错并拒绝加入该表的数据
> 2. **外键约束**:建议关闭 `foreign_key_checks`,GR 不保证跨节点外键一致性
> 3. **存储引擎**:只支持 InnoDB
> 4. **事务隔离级别**:推荐使用 `READ COMMITTED`(GR 默认),RR 在部分场景下可能增加冲突概率
> 5. **自增主键冲突**:多主模式下多个节点同时产生自增值会冲突,需配置 `auto_increment_increment` 和 `auto_increment_offset` 错开编号区间
> 6. **DDL 操作**:大表的 DDL(如 ADD INDEX)会在整个组阻塞,务必在维护窗口执行
> 7. **GTID 不可变**:开启 GTID 后无法关闭,数据初始化时必须用 GTID 方式导出导入
## 故障处理
```mermaid
stateDiagram-v2
[*] --> ONLINE: 节点正常加入组
ONLINE --> REMOVED: 节点宕机 / 网络断开
ONLINE --> OFFLINE: 手动 STOP GROUP_REPLICATION
REMOVED --> SELF_JOIN: 节点恢复并重新加入
REMOVED --> [*]: 永久退出
SELF_JOIN --> ONLINE: 数据同步完成
state REMOVED {
state_config ["Config Change Pending"]
state_error ["Error Recovering"]
}
```
> [!NOTE] 组的最小生存条件
> - 单主模式:至少 2 个节点在线(1 primary + 1 secondary)
> - 多主模式:至少 N/2+1 个节点在线
> - 少于这个阈值,整个组进入 readonly 模式,拒绝所有写入
## 监控命令
```sql
-- 组成员状态
SELECT * FROM performance_schema.replication_group_members;
-- MEMBER_ID, MEMBER_HOST, MEMBER_PORT, MEMBER_STATE (ONLINE/RECOVERING/ERROR/RO)
-- 组内事务统计
SELECT * FROM performance_schema.replication_group_member_stats;
-- 正在进行的冲突事务
SELECT * FROM performance_schema.replication_group_history;
-- 连接数
SELECT * FROM performance_schema.replication_group_connections;
```
## 关联笔记
- [[hhs/MySQL/30-主从复制]] — GR 的主干是改进后的主从复制
- [[hhs/MySQL/31-MHA与Orchestrator]] — 为什么 GR 不需要外部 HA 工具
- [[hhs/MySQL/35-监控指标]] — GR 特有的监控指标