GTID 复制、故障切换与扩展边界
可运行检查 SQL
sql
SELECT @@server_uuid, @@server_id, @@gtid_mode,
@@enforce_gtid_consistency, @@log_bin, @@binlog_format;
SHOW BINARY LOG STATUS;
SHOW REPLICA STATUS;
SELECT CHANNEL_NAME, SERVICE_STATE, LAST_ERROR_NUMBER, LAST_ERROR_MESSAGE
FROM performance_schema.replication_applier_status_by_worker;配置副本时使用 8.4 的 SOURCE/REPLICA 术语;以下语句需替换实验地址与账户:
sql
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = 'source.example',
SOURCE_PORT = 3306,
SOURCE_USER = 'replicator',
SOURCE_PASSWORD = 'load-from-secret-store',
SOURCE_AUTO_POSITION = 1;
START REPLICA;机制解释
源库提交事务并写 binlog,副本接收后写 relay log,再由 applier 重放。GTID 标识已执行事务,使重新定位和故障切换不再依赖手工文件位置,但不会自动解决错误事务、延迟或脑裂。
读写分离带来读己之写、一致性路由和副本过载问题。高可用控制面必须实施 fencing,防止旧主仍可写。复制拓扑仍会复制误删除,因此必须保留独立备份。
真实边界
- 提升副本前确认事务集合、延迟、只读、客户端路由和旧主隔离。
- 故障切换要记录数据缺口、RTO、恢复旧主和重新接入副本步骤。
- 分区管理单表数据,不等于跨实例分片。
- 分片只在单实例优化、归档、容量和业务边界仍不足时考虑,并接受跨片事务和查询成本。
练习
- 画出 source → binlog → relay log → applier → replica 的失败点。
- 设计一次旧主隔离、提升副本、客户端切换和旧主重建演练。
- 解释为什么副本正常不证明能够恢复误删除。
验收清单
- 拓扑图标出 binlog、relay log、接收和应用线程的失败点。
- 切换演练包含 fencing、事务集合校验、路由和旧主重建。
- RPO/RTO 由故障演练测得,不只来自配置推断。
深度加餐:高可用不是多一台机器
复制延迟、切换语义、客户端重连和数据一致性共同决定高可用;拓扑图只是起点。
先做一个可观察实验
sql
SHOW MASTER STATUS;
SHOW REPLICA STATUS\G
SELECT @@gtid_mode, @@enforce_gtid_consistency,
@@read_only, @@super_read_only;预期:能看到源端位置、复制线程、延迟与 GTID 设置;只读副本不会被应用误写。
原理下潜与工程边界
GTID 让事务以全局标识复制,故障切换时减少手工定位;半同步降低丢失窗口但增加提交延迟。读写路由要处理切换期间的旧连接与缓存。
Seconds_Behind_Source 可能为 NULL 或不代表真实业务延迟;自动切换可能重复执行非幂等写入;跨区域网络分区会让“多数派”判断复杂。
反例排错路线
同时看复制错误、队列长度、心跳延迟和应用重试;演练必须验证写入、读一致性、旧主隔离和回切,而不是只看进程存活。
练习加码(仍不提供答案)
加码:设计单主 GTID 拓扑的故障切换 runbook,列出侦测、隔离、提升、路由、回切五阶段证据。
验收时请补充:一份可复现的环境/数据前提、正常结果、失败结果以及可回滚或清理动作。
继续查阅:MySQL 8.4 参考手册(外部资料已收录于证据账本) · InnoDB 文档(外部资料已收录于证据账本)