设计思路
- 半同步复制
- 原理:在传统异步复制基础上,主库在提交事务前,等待至少一个从库接收并写入中继日志,才反馈客户端事务提交成功。这确保了事务在至少一个从库有备份,大大提高数据安全性。
- 配置:在主库配置文件中开启
semi - sync - master
参数,在从库配置文件中开启semi - sync - slave
参数,并设置合适的等待超时时间。例如,主库设置semi - sync - master - wait - timeout = 1000
(单位毫秒),表示等待从库接收中继日志的最长时间。
- 多源复制
- 原理:从库可以同时从多个主库接收数据更新,这在一些复杂业务场景下,不同业务模块数据分布在不同主库时非常有用,且可以分担单个主库的复制压力。
- 配置:在从库配置文件中通过
CHANGE MASTER TO
语句分别指定每个主库的连接信息、日志文件及位置等。例如:
CHANGE MASTER TO
MASTER_HOST='master1_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='master1_binlog.000001',
MASTER_LOG_POS=107,
FOR CHANNEL'master1_channel';
CHANGE MASTER TO
MASTER_HOST='master2_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='master2_binlog.000001',
MASTER_LOG_POS=107,
FOR CHANNEL'master2_channel';
- 综合拓扑结构
- 一主多从:以一个主库为数据写入中心,多个从库负责读取和备份数据。主库开启半同步复制,从库配置为半同步模式并接收主库数据。
- 多源复制结合:如果业务有多个独立模块,可将每个模块数据写入各自主库,然后通过多源复制配置,让部分或全部从库同时从多个主库接收数据更新。
应对脑裂问题
- 使用仲裁机制
- 引入第三方仲裁服务:如使用Galera Cluster的仲裁机制或基于Zookeeper的仲裁方案。以Zookeeper为例,MySQL节点在启动时向Zookeeper注册,当出现脑裂迹象时,Zookeeper通过选举确定哪个MySQL节点集为合法集群。
- 配置仲裁:在MySQL节点配置文件中增加与仲裁服务交互的相关配置。例如,对于基于Zookeeper的仲裁,在MySQL配置文件中设置连接Zookeeper的地址、端口等信息。
- 设置合适的复制参数
- 半同步复制超时处理:合理设置半同步复制中的等待超时时间。如果主库等待从库接收中继日志超时,可采取降级为异步复制(但需记录相关日志,后续人工介入处理),以避免主库长时间阻塞事务提交导致业务中断。
- 复制心跳检测:通过设置合适的复制心跳参数,如
heartbeat - period
(单位秒),从库定期向主库发送心跳包,主库根据心跳判断从库状态。如果从库长时间无心跳,主库可采取相应措施,如将其从半同步复制组中移除。
- 监控与自动恢复
- 搭建监控系统:使用如Prometheus + Grafana组合监控MySQL复制拓扑结构。监控指标包括主从延迟、复制状态、半同步复制响应时间等。当出现异常指标,如主从延迟过高或半同步复制响应超时,及时发出警报。
- 自动恢复脚本:编写自动恢复脚本,当监控系统检测到脑裂相关异常时,脚本自动尝试重新配置复制拓扑,例如重新建立主从连接、调整半同步复制状态等。脚本执行过程需记录详细日志,方便后续排查问题。