摘要
高可用是生产环境数据库选型的核心指标。TiDB 基于 Raft 协议的分布式多副本机制与 MySQL Group Replication(MGR)的组复制方案,在架构理念、故障检测速度、切换时间和数据一致性保证方面存在根本性差异。本文通过架构对比、切换性能测试数据和运维复杂度分析,帮助 DBA 和架构师做出更准确的选型决策。
本文适合谁:负责数据库高可用架构设计的 DBA、架构师和技术负责人,以及正在从 MySQL 主从复制或 MGR 迁移到分布式数据库的团队。
1. 高可用架构对比
1.1 TiDB:Raft 多副本架构
Application
│
▼
┌───────────────────────────────────┐
│ TiDB Server(无状态) │ ◄── 计算层,多节点负载均衡
└─────────┬─────────────────────────┘
│
┌─────┼─────┐
▼ ▼ ▼
┌──────┐┌──────┐┌──────┐
│TiKV-1││TiKV-2││TiKV-3│ ◄── 存储层,Raft Group 多副本
└──────┘└──────┘└──────┘
│Leader │Follower│Follower
TiDB 的高可用建立在以下基础之上:
- Raft 共识协议:每个数据分片(Region,默认 96MB)维护 3 个副本,通过 Raft 选举 Leader
- 多 Raft:不同 Region 的 Leader 分布在不同节点上,避免单点热点
- 自动故障转移:Raft 成员变更 + Leader 转移,无需外部 orchestrator
- PD 调度:自动检测节点故障,调度 Region 副本补齐
-- TiDB:查看集群健康状态
SELECT * FROM information_schema.cluster_health;
-- TiDB:查看各节点状态
SELECT * FROM information_schema.tikv_store_status;
-- TiDB:查看 Region 副本分布
SELECT * FROM information_schema.tikv_region_status WHERE region_id = 1;
1.2 MySQL Group Replication:组复制架构
Application
│
▼
┌─────────────────────────────┐
│ ProxySQL / Router │ ◄── 连接路由
└──┬──────────┬──────────┬───┘
│ │ │
▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐
│Node-1│ │Node-2│ │Node-3│ ◄── MGR 组成员
│Primary│ │Second│ │Second│
└──┬───┘ └──┬───┘ └──┬───┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────┐
│ Paxos-based 共识通道 │ ◄── 组通信通道
└─────────────────────────────┘
MySQL MGR 的高可用机制:
- 单主模式:1 个 Primary + 多个 Secondary,自动选举新 Primary
- 多主模式:所有节点均可读写,冲突检测基于认证
- XCom 通信:基于 Paxos 的组成员管理和事务认证
- 故障检测:组内心跳超时触发成员驱逐和重新选举
-- MySQL MGR:查看组状态
SELECT * FROM performance_schema.replication_group_members;
-- MySQL MGR:查看通道状态
SELECT * FROM performance_schema.replication_connection_status
WHERE channel_name = 'group_replication_applier';
架构对比总结
| 维度 | TiDB (Raft) | MySQL MGR |
|---|---|---|
| 共识协议 | Raft(多 Raft Group) | Paxos(单组通信) |
| 副本粒度 | Region 级(96MB 分片) | 节点级(全量数据复制) |
| Leader 数量 | 多 Leader(不同 Region) | 单 Leader(单主模式) |
| 故障检测范围 | 细粒度(Region 级) | 粗粒度(节点级) |
| 自动恢复 | 内置(PD 调度 + Raft) | 内置(组自动选举) |
| 外部依赖 | PD Server | 无(或 Router/ProxySQL) |
2. 故障检测与切换时间
2.1 TiDB 故障切换流程
TiKV-1 (Leader) 宕机
│
▼
Raft Follower 心跳超时(默认 election_timeout = 10 × 10ms = 100ms)
│
▼
Follower 发起预投票(Pre-Vote)
│
▼
选举新 Leader(~100-200ms)
│
▼
PD 调度补齐缺失副本(后台异步)
关键时间参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
| `raft.heartbeat-tick` | 2 | Raft 心跳间隔 |
| `raft.election-timeout-ticks` | 10 | 选举超时 |
| `raft.tick-interval` | 500ms | Tick 时间单位 |
| 选举超时 | ~5s | 10 × 500ms × 2 |
| 实际切换 | 5-30s | 包含连接重试和应用感知 |
2.2 MySQL MGR 故障切换流程
Primary 节点宕机
│
▼
组通信超时(默认 group_replication_member_expel_timeout = 5s)
│
▼
成员驱逐 + 视图变更
│
▼
新 Primary 选举(~5-10s)
│
▼
Router/ProxySQL 更新路由(如使用 MySQL Router:自动)
│
▼
应用重连
关键时间参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
| `member_expel_timeout` | 5s | 成员驱逐超时 |
| `components_stop_timeout` | 5s | 组件停止超时 |
| `transaction_size_limit` | 150MB | 事务大小限制 |
| MySQL Router 切换 | 5-15s | 路由更新 |
| 实际切换 | 10-60s | 含应用重连 |
2.3 切换时间对比
| 故障场景 | TiDB 切换时间 | MySQL MGR 切换时间 |
|---|---|---|
| 单节点宕机 | 5-30s | 10-60s |
| 网络分区(多数派存活) | 5-30s | 10-60s |
| 网络分区(少数派) | 少数派不可用,自动隔离 | 少数派不可用 |
| 多节点同时故障(≤多数派) | 自动选举新多数派 | 组不可用 |
| PD 节点故障 | 集群只读(需 3 PD 中 2 个存活) | 无此组件 |
| TiDB Server 故障 | 秒级(连接重定向到其他 Server) | 依赖 Router 重定向 |
引用:实测参考:在 3 节点集群中模拟节点 kill,TiDB 的 Region Leader 切换通常在 5-15s 完成,MySQL MGR 的 Primary 切换通常在 15-45s 完成(含路由更新时间)。
3. 数据一致性保证
3.1 一致性模型
| 维度 | TiDB | MySQL MGR |
|---|---|---|
| 写入一致性 | Raft 多数派写入(W + R > N) | 组认证后提交 |
| 读取一致性 | 可配置(Read Committed / Snapshot Isolation) | 基于 binlog 位置 |
| 脑裂防护 | Raft 选举保证唯一 Leader | 视图变更保证唯一 Primary |
| 数据丢失 | 零丢失(多数派提交) | 零丢失(组认证提交) |
| 半同步回退 | 无需配置 | 需配置半同步复制 |
3.2 一致性配置
-- TiDB:设置事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL SNAPSHOT ISOLATION;
-- TiDB:设置读取一致性级别
SET SESSION tidb_read_consistency = 'REPEATED'; -- 默认
SET SESSION tidb_read_consistency = 'SESSION'; -- 会话级快照
SET SESSION tidb_read_consistency = 'EVENTUAL'; -- 最终一致(读 TiKV Follower)
-- MySQL MGR:查看组一致性状态
SELECT * FROM performance_schema.replication_group_member_stats;
3.3 边缘场景对比
| 场景 | TiDB 行为 | MySQL MGR 行为 |
|---|---|---|
| 网络抖动 | Raft 预投票避免无效选举 | 可能触发不必要的选举 |
| 慢节点 | 自动移除并补齐副本 | 组成员超时后驱逐 |
| 跨机房延迟 | Raft 日志复制可感知延迟 | 组通信延迟影响全局 |
| 一致性读 | Snapshot Isolation 保证快照读 | 需配置 Read Your Writes |
4. 扩展能力对比
| 扩展维度 | TiDB | MySQL MGR |
|---|---|---|
| 写入扩展 | 增加 TiKV 节点,水平扩展 | 单节点写入(单主模式) |
| 读取扩展 | 增加 TiDB Server / TiKV Follower | 增加 Secondary 节点 |
| 存储扩展 | 在线增加存储节点 | 垂直扩展磁盘 |
| 分析查询 | TiFlash 列存副本 | 需额外部署 OLAP 系统 |
| 节点上限 | 理论无上限(实际数百节点) | 最多 9 个组成员 |
| 热点处理 | 自动 Region 分裂和调度 | 需手动分表或使用中间件 |
-- TiDB:在线扩容示例(通过 TiDB Operator)
# kubectl scale statefulset tikv --replicas=5 -n tidb-cluster
-- TiDB:查看热点 Region
SELECT * FROM information_schema.tikv_region_status
WHERE written_bytes > 100000000
ORDER BY written_bytes DESC;
5. 运维复杂度对比
| 运维维度 | TiDB | MySQL MGR |
|---|---|---|
| 集群部署 | TiUP / TiDB Operator(K8s) | 手动配置 + MySQL Router |
| 监控告警 | Prometheus + Grafana(内置) | MySQL Exporter + 自建监控 |
| 备份恢复 | BR(物理备份)/ Dumpling(逻辑备份) | MySQLdump / XtraBackup |
| 升级流程 | 滚动升级(TiDB Operator) | 手动滚动升级 |
| 配置管理 | PD Server 集中管理 | 每节点独立配置 |
| 故障排查 | TiDB Dashboard(可视化) | 性能模式 + 慢查询日志 |
| 运维知识门槛 | 需理解分布式概念 | MySQL 基础即可 |
运维复杂度总结:
- TiDB 的学习曲线较陡,需要理解 Raft、Region、PD 调度等分布式概念,但部署和运维工具成熟度较高
- MySQL MGR 的运维更接近传统 MySQL,门槛较低,但缺乏统一的集群管理平台
- TiDB 的 TiDB Dashboard 和内置监控显著降低了分布式系统的运维复杂度
FAQ
Q1:TiDB 的 5-30s 切换时间在生产中是否可接受?
对于大多数 OLTP 场景,5-30s 的切换窗口是可接受的。应用端通过连接池重试和超时重连机制可以进一步缩短用户感知的不可用时间。如需更快的切换,可将 `raft.election-timeout-ticks` 调小(但不建议低于 5,避免网络抖动导致的频繁选举)。
Q2:MySQL MGR 单主模式下如何扩展写入?
MGR 单主模式不支持写入水平扩展,只能通过垂直升级 Primary 实例。如果写入量超过单节点承载能力,需要考虑分库分表或迁移到分布式数据库。多主模式虽然允许写入,但冲突检测会引入性能开销,实际吞吐可能不升反降。
Q3:TiDB 的 PD 节点是否是单点风险?
PD 采用 Raft 协议保证一致性,建议部署 3 个或 5 个 PD 节点。3 个 PD 中允许 1 个故障,5 个 PD 中允许 2 个故障。集群最多容忍 (N-1)/2 个 PD 故障。只要多数 PD 存活,集群即可正常运行。
Q4:从 MySQL MGR 迁移到 TiDB 需要做哪些准备?
- 应用兼容性验证(SQL 语法、存储过程、函数)
- 数据迁移方案(TiDB DM 全量+增量)
- 连接配置修改(端口、用户名)
- 监控体系对接(Prometheus + Grafana)
- 灰度切换方案(读写分离路由、流量灰度)
建议先在测试环境完整演练迁移流程。
总结
TiDB 和 MySQL MGR 在高可用设计上代表了两个方向:
- TiDB(Raft):面向分布式场景设计,提供细粒度的故障检测和快速切换,天然支持水平扩展。适合数据量增长预期大、需要弹性扩展的业务。
- MySQL MGR:在 MySQL 生态内提供了增强的高可用方案,运维门槛较低。适合已有 MySQL 运维经验、数据规模可控、需要渐进式升级的团队。
如果当前 MySQL 实例的高可用方案(主从复制 + Orchestrator)已经满足需求,MGR 的升级收益可能有限。如果面临写入瓶颈、扩展困难或需要 HTAP 能力,TiDB 是更长远的选择。
下一步行动
- 免费试用 TiDB Cloud:TiDB Cloud 免费试用——体验 Raft 多副本高可用和自动故障切换
- 获取高可用方案白皮书:TiDB 高可用架构最佳实践
- 联系解决方案团队:联系 PingCAP——获取从 MySQL 迁移到 TiDB 的定制化高可用方案