MHA架构详解
MHA基本概念
MHA(Master High Availability)是一套成熟的MySQL高可用解决方案,由日本DeNA公司的Yoshinori Matsunobu开发。它主要用于实现MySQL主从架构下的自动化故障转移和主从切换功能。
核心功能特性
-
快速故障转移:
- 能够在30秒内自动完成主库故障检测和从库提升
- 典型的故障转移时间在10-30秒之间
- 支持手动触发的主库切换(计划内切换),通常仅需0.5-2秒
-
数据一致性保障:
- 通过对比各从库的relay log差异,确保数据一致性
- 支持自动从旧主库获取binlog进行数据修复
-
灵活的部署方式:
- 支持标准的主从复制架构
- 兼容基于GTID的复制模式
典型应用场景
- 金融交易系统:需要保证交易数据零丢失的支付系统
- 电商平台:大促时段的订单处理系统、商品库存管理系统
- 社交网络服务:用户关系链存储系统、即时消息存储系统
工作原理
- 监控阶段:MHA Manager通过定期ping检查主库可用性
- 故障检测:当主库不可达时,启动二次确认机制
- 故障转移流程:识别数据最接近主库的候选从库,应用差异relay log确保数据一致
组成部分
1. MHA Manager(管理节点)
MHA Manager是整个架构的控制中心,负责监控和管理整个MySQL主从复制集群。
-
部署方式灵活:可以独立部署在专用管理服务器上,也可以部署在某台Slave节点上
-
主要职责:
- 持续监控Master节点的健康状态
- 在Master故障时自动触发并控制故障转移流程
- 实时检查MySQL复制状态和延迟情况
-
典型工作流程:
- 每3秒(可配置)检测一次Master可达性
- 当连续3次检测失败时判定Master故障
- 自动选择数据最新的Slave作为新Master
2. MHA Node(数据节点)
MHA Node是运行在每个MySQL实例上的代理程序。
- 核心功能:
- 在Master节点上:实时保存和传输二进制日志(binlog)
- 在Slave节点上:接收并应用中继日志(relay log)
- 精确识别各Slave间的日志差异点
- 将缺失的日志事件应用到落后的Slave
故障处理
MHA故障处理机制详解
-
保存宕机主库的二进制日志
- 自动检测到Master宕机后,立即将Master服务器的binlog日志文件完整保存
- 通过SSH连接到原Master服务器,将未同步的binlog传输到管理节点
-
定位最新的从库
- 通过对比所有Slave的
SHOW SLAVE STATUS信息 - 根据
Exec_Master_Log_Pos和Relay_Log_Pos确定数据最接近Master的Slave
- 通过对比所有Slave的
-
修复其他从库
- 从最新Slave获取relay log信息
- 使用
mysqlbinlog工具解析和重放relay log到其他落后Slave
-
主从切换操作
- 在最新Slave执行
STOP SLAVE; RESET MASTER; - 修改my.cnf配置,启用log-bin等主库必需参数
- 通过
CHANGE MASTER TO命令提升为新的Master
- 在最新Slave执行
-
重建复制拓扑
STOP SLAVE; CHANGE MASTER TO MASTER_HOST='new_master_ip'; START SLAVE;
主备切换
主备切换是指将备库转换为主库,原主库转换为备库的过程。
主备切换策略
-
可靠性优先策略:确保数据一致性为最高优先级
- 典型实现步骤: a) 停止主库写入 b) 等待备库追上主库(Seconds_Behind_Master=0) c) 提升备库为新主库 d) 开启新主库写入
- 适用场景:金融交易、订单系统等对数据一致性要求严格的业务
-
可用性优先策略:保证服务可用性为最高优先级
- 典型实现步骤: a) 直接提升备库为新主库 b) 允许新主库立即接受写入 c) 原主库追赶数据
- 适用场景:社交网络、内容平台等更注重服务连续性的业务
主备延迟
主备延迟是由主从数据库同步延迟导致的性能指标。
关键时间点:
- T1时刻:主库A完成事务执行并写入binlog文件
- T2时刻:备库B完全接收到该binlog
- T3时刻:备库B执行完该binlog中的事务
主备延迟计算公式:延迟时间 = T3 - T1
重要字段:
Seconds_Behind_Master:表示当前备库延迟秒数Relay_Log_Pos:备库当前执行的binlog位置Master_Log_File:备库正在读取的主库binlog文件
延迟原因
-
备库机器性能问题
- 硬件配置不足
- 资源过载:一台机器同时作为多个主库的备库
- 网络瓶颈
-
分工问题
- 读操作负载:备库承担了应用的大量读请求
- 后台任务干扰
-
大事务操作
- 单次删除大量数据
- 大表结构变更(如为千万级表添加索引)
- 批量导入数据
可靠性优先 vs 可用性优先
可靠性优先流程:
- 判断从库B的 seconds_behind_master 值
- 把主库A改为只读状态(readonly=true)
- 等待从库B的 seconds_behind_master 值降为0
- 把从库B改为可读状态(readonly=false)
- 把业务请求切换至从库B
可用性优先:
- 不等主从同步完成,直接把业务请求切换至从库B
- 几乎不存在不可用时间,但会使数据不一致
多数情况下,优先选择可靠性优先战略,在满足数据可靠性的前提下,MySQL的可用性依赖于同步延时的大小,同步延时越小,可靠性就越高。
总结
MHA作为MySQL高可用解决方案的核心优势:
- 自动故障转移速度快:10-30秒内自动完成
- 数据一致性保障:自动识别和应用最新binlog事件
- 性能表现优异:支持多种复制模式
- 集中式监控管理:可管理多个MySQL集群
局限性:
- 需要至少一个从库才能工作
- 故障转移期间会有短暂的写入中断
- 需要额外的Manager节点进行监控管理
目前MHA主要支持一主多从架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器。
更新丢失问题
- 异步复制导致更新覆盖
MMM架构
基本介绍
MMM(Master-Master Replication Manager for MySQL)是一套开源的MySQL高可用解决方案。
核心功能
- 监控MySQL主从复制状态
- 自动检测节点故障并进行故障转移
- 管理虚拟IP地址实现客户端透明切换
节点角色
- Writer节点:负责处理所有的写操作
- Reader节点:负责处理读请求
故障处理流程
- VIP移除
- 角色切换
- 拓扑重构
监控机制
Monitor监控服务器
- 实时收集各节点健康状态指标
- 通过心跳检测判断节点故障
Agent代理程序
- 运行在每个MySQL服务器上
- 监控本地MySQL服务状态
- 执行Monitor下发的管理指令