MySQL主从复制原理与读写分离架构
请详细解释MySQL主从复制的三种模式(异步复制、半同步复制、组复制)的原理和区别。如何实现读写分离?主从延迟问题如何解决?
回答
屠龙少年
三种复制模式:
-
异步复制(默认):
- 主库提交事务后立即返回客户端,不等待从库确认
- 性能最好,但主库宕机可能导致数据丢失
- 流程:主库binlog → IO线程拉取 → relay log → SQL线程重放
-
半同步复制:
- 主库等待至少一个从库接收并写入relay log后再提交
- rpl_semi_sync_master_timeout超时后降级为异步
- 在性能和一致性之间取得平衡
-
组复制(MySQL Group Replication, MGR):
- 基于Paxos协议,多个节点组成复制组,数据强一致性
- 内置故障检测和自动选主
- 适用于高可靠性场景
读写分离实现:
- 主库处理写操作(INSERT/UPDATE/DELETE)
- 从库处理读操作(SELECT)
- 中间件方案:ShardingSphere、MyCat、ProxySQL
- 应用层方案:Spring AbstractRoutingDataSource动态切换数据源
主从延迟问题:
- 原因:从库单线程重放(旧版),大事务,主库并发高
- 解决方案:
- MySQL 5.7+启用多线程复制(slave_parallel_workers)
- 写后立即读路由到主库(强制主库读)
- 避免大事务
- 使用半同步复制降低延迟概率