基于 MySQL5.7, Semisynchronous Replication(MySQL 半同步复制), Keepalived, MHA 的 MySQL 高可用方案
MySQL, 用得最多最广泛的关系型数据库。 在生产环境中,难免遇到诸如 需要重启服务器或者 MySQL 服务莫名宕了 等问题。如何保证 MySQL 能够持续提供读写等服务,即 高可用性?
本文主要讲述如何从无到有构建一套简单的 MySQL 高可用方案,少概念原理,多实操。
概念及架构简介
- semi-synchronous Replication: 传统的 asynchronous 模式在 master 宕机时仍然有数据丢失的风险。MySQL5.5 之后提供了 semi-synchronous 模式,它会在 master 处理完一个事务并且等待至少一个支持 semi-synchronous 的 slave 确认收到该事件并将其写 入relay-log 之后才会返回。相较于前者,数据安全性更高。性能也无需担心,因为 facebook 也用了。
- Keepalived: 基于 VRRP 实现的路由管理工具,在 负载均衡 和 高可用 场景中应用广泛。这里主要用来创建 VIP(虚拟路由)
- MHA: 即 mysql-master-ha, 最主要的一个功能是监控 MySQL 主从集群( 确切地说主要监控 Master), 在 Master 出现故障后自动选择一个 Slave 提升为 Master,并且可以保证新 Master 和 Slave 的一致性。
来看一下 架构图
应用通过 VIP(虚拟路由,由 Keepalived 创建)访问 MySQL 集群。一主(图 M )二从(图 S1 和 S2),S2 作备用主库。一旦原 Master 节点出现故障,MHA 自动将主库切换到 S1,并且 S2 随之连接到新的 Master。MHA 同时通过 master_ip_failover_script 脚本停止原 Master 节点上的 Keepalived,路由自动切换到 新 Master。这时候外部应用实际访问的是 S1 了,不会出现 MySQL 突然无法使用的问题。
机器规划
Host | IP | VIP | Role | Software |
---|---|---|---|---|
M | 10.20.78.241 | 10.20.78.11 | Master | MySQL5.7 Keepalived MHA-Node |
S1 | 10.20.78.243 | 备用 | candidate_master (Slave) | MySQL5.7 Keepalived MHA-Node |
S2 | 10.20.78.245 | - | Slave | MySQL5.7 MHA-Node |
MHA-Manager | 10.20.78.227 | - | MHA Manager | MHA-Node MHA-Manger |
M 出现故障后:
Host | IP | VIP | Role |
---|---|---|---|
M | 10.20.78.241 | - | stoped |
S1 | 10.20.78.243 | 10.20.78.11 | master |
S2 | 10.20.78.245 | - | Slave |
MHA-Manager | 10.20.78.227 | - | MHA Manager(stoped) |