目录
在数字化时代,数据是企业的核心资产,而数据库的可靠性直接决定了业务的连续性。传统单节点 MySQL架构存在单点故障风险,一旦宕机,将导致业务中断、数据丢失等严重后果。尤其是在电商秒杀、金融交易等场景中,数据库的持续可用性(High Availability,HA)已成为系统设计的刚性需求。
一. 案例概述
目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQI数据库单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA 的出现就是解决 MySQL 单点的问题。另外随着企业数据量越来越庞大,数据库的压力又成为企业的另一个瓶颈,MySQL多主多从架构的出现可以减轻 MySQL本身的压力。本章将主要围绕“MySQL 主主复制+Keepalived+HAProxy” 这一经典高可用架构展开,通过理论结合实践,解析如何通过开源工具实现数据库的故障自动转移、负载均衡和读写分离。
1. 什么是MySQL高可用
MySQL 高可用(High Availability)是指通过冗余设计,确保数据库服务在单节点故障、网络中断或硬件损坏等异常情况下,仍能持续对外提供服务,同时保证数据一致性。其核心目标是实现“零停机、零数据丢失”的业务连续性。
2. 方案组成
MySQL 主主复制 + Keepalived + HAProxy 的高可用方案由三部分组成
- MySQL 主主复制:两台 MySQL 实例互为主从,双向同步数据,均支持读写操作,提供几余和扩展能力。
- Keepalived:通过 VRRP 协议管理虚拟 IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。
- HAProzy:作为反向代理和负载均衡器,将流量分发至 MySQL 节点,支持健康检查、读写分离(可选)和故障节点自动剔除。
3. 优势
高可用性:Keepalived 实现秒级故障切换,HAProxy健康检查确保流量仅路由到正常节点,避免单点故障。
读写扩展:主主架构支持双节点并发写入,提升写入性能;HAProxy可配置读写分离,利用备节点分担读压力。
灵活扩展:可横向扩展 HAProxy或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。
运维友好基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。
二. 案例环境
案例需求
通过MHA监控MySQL数据库在故障时进行自动切换,不影响业务
思路:
(1) 安装mysql数据库
(2) 配置mysql互为主从
(3) 安装HAProxy软件并配置复制均衡
(4) 安装keepalived软件并配置故障转移
(5) 模拟master故障切换
三. 案例实施
1. 安装MySQL数据库
参考前面文章
2. 配置mysql双主复制
对于MySQL的主主架构,其实原理就是两台服务器master1、master2互为主从,双向复制
主1
主2
主1
3. 安装HAProxy
HAProxy 是一个开源的高性能负载均衡器和代理工具,支持 TCP/HTTP 应用的流量分发,具备健康检查、SSL 终止、会话保持等功能,广泛应用于Web 服务器集群、数据库读写分离及 API 网关场景,以高效稳定的特性提升系统可用性和扩展能力。
该阶段操作在 Keepalived1、Keepalived2 都要执行
关闭防火墙 安装haproxy
编辑haproxy配置文件 (两台配置相同)
注释:
- mode tcp :表示tcp代理
- listen mysql 0.0.0.0:3306 表示创建一个名为 mysql 的监听服务
- bind 0.0.0.0:3306 绑定到所有网卡的 3306 端口(MySQL 默认端口),2作为流量入口。
- balance leastconn 指定使用 最少连接数算法 分配请求,将新连接导向当前活跃连接最少的后端服务器,避免单点过载
- Server声明两个MySQL服务器节点 mysql1 和mysql2,分别指向 192.168.10.101:3306 和192.168.10.102:3306。
- check port 3306 表示通过检査节点的 3306 端口是否响应,判断其存活状态
启动服务
4. 测试haproxy
直接用root用户登录是登录不上的
所以在主服务器上创建一个用户并授予权限
客户机测试用户test,访问haproxy的代理端口登录mysql
5. 安装keepalived
Keepalived 是一个用于实现系统高可用性和负载均衡的工具,通过 VRRP(Virtual Router Redundancy Protocol)等协议管理虚拟 IP 地址,持续监测服务器健康状态,当主节点故障时自动将流量切换至备用节点,确保服务不中断,常用于数据库、Web 服务等集群环境,提升系统可靠性并简化故障恢复流程。
Keepalived1、Keepalived2 都要执行
6. 编辑haproxy配置文件
启用nopreemrt的作用
- 节点A(优先级100,配置nopreempt)故障->节点 B成为master
- 节点A恢复->不触发抢占,节点B继续作为master,VIP不切换
- 当节点B故障时,节点A才会重新成为master
keepalived2
测试一下
keepalived1
keepalived2
停止keepalived1
keepalived1
keepalived2
监控脚本
编写一个脚本 两个keepalived都需要
执行一下
查看2
在配置文件中添加上脚本(1,2)
重启
6. 测试用VIP连接mysql
也可以看到之前所创建的库
7. 测试故障转移
关闭mysql1主机,测试使用 vip 能否正常访问 mysql 数据库
关闭 master1后,因为 master1、master2 通过 haproxy 负载均衡,master1关闭后,haproxy 检测其状态异常,会从负载中移除,不进行流量转发,依然可以通过 vip 访问 mysql,实现 mysql 的高可用
接着关闭keepalived1测试使用vip能否正常访问mysql数据库
关闭keepalived1后,keepalived检测到主节点离线,VIP192.168.10.100会漂移至keepalived2节点,mysql依然可以访问