目录
案例概述
目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQI数据库单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA的出现就是解决 MySQL 单点的问题。另外随着企业数据量越来越庞大,数据库的压力又成为企业的另一个瓶颈,MySQL多主多从架构的出现可以减轻 MySQL 本身的压力。本章将主要围绕 “MySQL主主复制+Keepalived+HAProxy” 这一经典高可用架构展开,通过理论结合实践,解析如何通过开源工具实现数据库的故障自动转移、负载均衡和读写分离。
1.前置知识点
1.什么是MySQL高可用
MySQL 高可用(High Availability)是指通过冗余设计,确保数据库服务在单节点故障、网络中断或硬件损坏等异常情况下,仍能持续对外提供服务,同时保证数据一致性。其核心目标是实现 “零停机、零数据丢失”的业务连续性。
2.方案组成
MySQL 主主复制 + Keepalived + HAProxy 的高可用方案由三部分组成:
MySQL 主主复制:两台 MySQL 实例互为主从,双向同步数据,均支持读写操作,提供冗余和扩展能力。
Keepalived:通过 VRRP 协议管理虚拟 IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。
HAProxy:作为反向代理和负载均衡器,将流量分发至MySQL节点,支持健康检查、读写分离(可选)和故障节点自动剔除。
3.优势
高可用性:Keepalived实现秒级故障切换,HAProxy健康检查确保流量仅路由到正常节点,避免单点故障。
读写扩展:主主架构支持双节点并发写入,提升写入性能;HAProxy可配置读写分离,利用备节点分担读压力。
灵活扩展:可横向扩展 HAProxy或MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。运维友好基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。
2.案例环境
1.拓扑图
案例实施
1.创建测试用户
2.配置mysql双主复制
对于 MySQL 的主主架构,其实原理就是两台服务器 Master1、Master2 互为主从,双向复制
(1)在Master1 /etc/my.cnf 中修改或者增加下面内容
(2)在Master2 /etc/my.cnf 中修改或者增加下面内容
log-bin=/usr/local/mysql/data/mysql-bin #启用二进制日志(Binary Log)并指定其存储路径
binlog_format=MIXED #定义二进制日志的记录格式为混合模式
server-id=2 #为mysql实例分配一个唯一的服务器标识符
(3)重启mysql服务(master1,2都执行)
(4)登录Mysql程序,给从服务器授权(master1、2都执行)
(5)登录MySQL,配置同步。(master1、2都执行)
master1
按master2结果更改下面参数
master2
按master1结果更改下面参数
3.安装haproxy
HAProxy 是一个开源的高性能负载均衡器和代理工具,支持 TCP/HTTP 应用的流量分发,具备健康检查、SSL 终止、会话保持等功能,广泛应用于Web 服务器集群、数据库读写分离及API网关场景,以高效稳定的特性提升系统可用性和扩展能力。
该阶段操作在 Keepalived1、Keepalived2 都要执行
(1)关闭防火墙
(2)安装haproxy
(3)编辑haproxy配置文件
mode tcp :表示tcp代理>listen mysql 0.0.0.0:3306 表示创建一个名为 mysql 的监听服务
bind 0.0.0.0:3306 绑定到所有网卡的 3306 端口(MySQL 默认端口),作为流量入口。
balance leastconn 指定使用最少连接数算法 分配请求,将新连接导向当前活跃连接最少的后端服务器,避免单点过载Server声明两个MySQL服务器节点mysql1和mysql2,分别指向 192.168.10.101:3306和192.168.10.102:3306。
check port 3306 表示通过检査节点的 3306端口是否响应,判断其存活状态
限制每个后端节点的最大并发连接数为300,防止节点被压垮maxconn 300
(4)检测配置文件
(5)测试
使用测试用户 test,访问 haproxy 的代理端口登录 mysql
4.安装keepalived
Keepalived 是一个用于实现系统高可用性和负载均衡的工具,通过 VRRP(Virtual Router Redundancy Protocol)等协议管理虚拟 IP 地址,持续监测服务器健康状态,当主节点故障时自动将流量切换至备用节点,确保服务不中断,常用于数据库、Web 服务等集群环境,提升系统可靠性并简化故障恢复流程。
该阶段操作在 Keepalived1、Keepalived2 都要执行
(1)安装keepalived
(2)编辑haproxy配置文件
keepalived1配置
启用 nopreempt 的作用:
节点 A(优先级 100,配置 nopreempt)故障节点B成为 Master。
节点 A恢复→ 不触发抢占,节点 B继续作为 Master,VIP 不切换。
仅当节点 B 故障时,节点 A 才会重新成为 Master。
添加监控脚本并启动 keepalived
keepalived2配置
添加监控脚本并启动 keepalived
此处两台主机均配置为 BACKUP,因此哪台先运行 keepalived,VIP 就在哪台上。本案例刚开始 VIP 运行在 keepalived1 上
在 keepalived1 测试査看 VIP(注意査看 VIP 只能用 ip 命令,ifconfig 不显示VIP)
(4)编测试使用VIP连接mysql
5.测试故障转移
1.关闭 master1 主机,测试使用 vip 能否正常访问 mysql 数据库关闭 masterl后,因为 master1、master2 通过 haproxy 负载均衡,masterl关闭后,haproxy检测其状态异常,会从负载中移除,不进行流量转发,依然可以通过 vip 访问 mysql,实现 mysql 的高可用
2.2. 接着关闭 keepalived1,测试使用 vip 能否正常访问 mysql 数据库关闭 keepalivedl 后,keepalived 检测到主节点离线,VIP 192.168.10.100会漂移至 keepalived2 节点,mysql 依然可以访问