一:案例概述
目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA 的出现就是解决 MySQL 单点的问题。另外随着企业数据量越来越庞大,数据库的压力又成为企业的另一个瓶颈,MySQL 多主多从架构的出现可以减轻 MySQL 本身的压力。本章将主要围绕 “MySQL 主主复制 + Keepalived+HAProxy” 这一经典高可用架构展开,通过理论结合实践,解析如何通过开源工具实现数据库的故障自动转移、负载均衡和读写分离。
1.案例前置知识点
1.1什么是MySQL 高可用
MySQL 高可用(High Availability)是指通过冗余设计,确保数据库服务在单节点故障、网络中断或硬件损坏等异常情况下,仍能持续对外提供服务,同时保证数据一致性。其核心目标是实现 “零停机、零数据丢失” 的业务连续性。
1.2方案组成
MySQL 主主复制 + Keepalived + HAProxy 的高可用方案由三部分组成:
- MySQL 主主复制:两台 MySQL 实例互为主从,双向同步数据,均支持读写操作,提供冗余和扩展能力。
- Keepalived:通过 VRRP 协议管理虚拟 IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。
- HAProxy:作为反向代理和负载均衡器,将流量分发至 MySQL 节点,支持健康检查、读写分离(可选)和故障节点自动剔除。
1.3优势
高可用性:Keepalived 实现秒级故障切换,HAProxy 健康检查确保流量仅路由到正常节点,避免单点故障。
读写扩展:主主架构支持双节点并发写入,提升写入性能;HAProxy 可配置读写分离,利用备节点分担读压力。
灵活扩展:可横向扩展 HAProxy 或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。
运维友好:基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。
2.案例环境
2.1本案例环境
主机 | 操作系统 | IP 地址 | 应用 |
---|---|---|---|
Master1 | openEuler 24.03 | 192.168.10.101 | Mysql8 |
Master2 | openEuler 24.03 | 192.168.10.102 | Mysql8 |
Keepalived1 | openEuler 24.03 | 192.168.10.103 | Keepalived、haproxy |
Keepalived2 | openEuler 24.03 | 192.168.10.104 | Keepalived、haproxy |
2.2案例需求
本案例要求通过 MHA 监控 MySQL 数据库在故障时进行自动切换,不影响业务。
2.3案例实现思路
(1)安装 MySQL 数据库;
(2)配置 MySQL 互为主从;
(3)安装 haproxy 软件并配置复制均衡;
(4)安装 keepalived 软件并配置故障转移;
(5)模拟 master 故障切换
二:案例实施
1.安装MySQL
前几章笔记有安装MySQL,在这不演示了。
2.配置MySQL双主复制
(1)在MASTER1 /etc/my.cnf 中修改或增加下面内容
vim /etc/my.cnf
server-id=1
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format = MIXED
log-slave-updates=1
(2)在MASTER2 /etc/my.cnf 中修改或增加下面内容
vim /etc/my.cnf
server-id=2
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format = MIXED
log-slave-updates=1
(3)重启MySQL服务(MASTER1,2 都执行)
service mysqld restart
(4)登录MySQL服务,给服务器授权(MASTER1,2 都执行)
mysql -uroot -ppwd123
create user 'myslave'@'%' identified by '123456';
grant replication slave on *.* to 'myslave'@'%';
alter user 'myslave'@'%' identified with mysql_native_password '123456';
flush privileges;
show master status;
(5)登录MySQL,配置同步。(MASTER1,2 都执行)
按服务器结果更改下面命令中master_log和maser_log_pos参数
change master to master_host='192.168.10.102',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1147;
start slave;
show slave status\G;
查看slave状态,确保以下两个值为YES
3.安装haproxy
HAProxy 是一个开源的高性能负载均衡器和代理工具,支持 TCP/HTTP 应用的流量分发,具备健康检查、SSL 终止、会话保持等功能,广泛应用于 Web 服务器集群、数据库读写分离及 API 网关场景,以高效稳定的特性提升系统可用性和扩展能力。
(1) 关闭 SELinux 和防火墙
[root@localhost ~]# sed -i's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop firewalld
(2) 安装 haproxy
[root@localhost ~]# dnf install haproxy
(3) 编辑 haproxy 配置文件
vim /etc/haproxy/haproxy.cfg
defults
mode tcp
option tcplog #修改第一个
#frontend......后全部删掉
#添加:
listen mysql
bind 0.0.0.0:3306
balance leastconn
server mysql1 192.168.101:3306 check port 3306 maxconn 300
server mysql2 192.168.102:3306 check port 3306 maxconn 300
注释
- 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 端口是否响应,判断其存活状态
- maxconn 300 限制每个后端节点的最大并发连接数为 300,防止节点被压垮
(4) 检测配置文件,并启动服务
[root@localhost ~]# haproxy -c -f /etc/haproxy/haproxy.cfg
[root@localhost ~]# systemctl restart haproxy
(5) 测试
使用测试用户 test,访问 haproxy 的代理端口登录 mysql
101主机:
create user 'test'@'%' identified by 'pwd123';
grant replication slave on *.* to 'test'@'%';
alter user 'test'@'%' identified with mysql_native_password by 'pwd123';
flush privileges;
show master status;
105客户端主机:
dnf -y install mariadb
mysql -utest -ppwd123 -h192.168.10.103(192.168.10.104) -p3306
4.安装keepalived
Keepalived 是一个用于实现系统高可用性和负载均衡的工具,通过 VRRP(Virtual Router Redundancy Protocol)等协议管理虚拟 IP 地址,持续监测服务器健康状态,当主节点故障时自动将流量切换至备用节点,确保服务不中断,常用于数据库、Web 服务等集群环境,提升系统可靠性并简化故障恢复流程。
该阶段操作在 Keepalived1、Keepalived2 都要执行
(1) 关闭 SELinux 和防火墙
[root@localhost ~]# sed -i's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop firewalld
(2) 安装 keepalived
[root@localhost ~]# dnf install keepalived
(3)编辑haproxy配置文件
cp /etc/keepalived/keepalived.conf.sample
/etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
router_id LVS_1 / 2
#vrrp_strict
vrrp_script chk_haproxy {
script "/etc/keepalived/chk.sh"
interval 2
}
vrrp_instance VI_1 {
state MASTER / BACKUP # 都为BACKUP下面加一行:nopreempt
interface ens33
priority 100 / 90
}
virtule_ipaddress{
192.168.10.100
}
track_script {
chk_haproxy
}
#virule server .....后删掉
systemctl restart keepalived
systemctl restart haproxy
添加监控脚本并启动keepalived
vim /etc/keepalived/chk.sh
#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/keepalived stop
fi
chmod +x /etc/keepalived/chk.sh
systemctl restart keepalived
(4)编测试使用VIP连接MySQL
mysql -utest -ppwd123 -h192.168.10.100 -p3306
show databases;
5. 测试故障转移
- 关闭 master1 主机,测试使用 vip 能否正常访问 mysql 数据库
关闭 master1 后,因为 master1、master2 通过 haproxy 负载均衡,master1 关闭后,haproxy 检测其状态异常,会从负载中移除,不进行流量转发,依然可以通过 vip 访问 mysql,实现 mysql 的高可用
mysql -utest -ppwd123 -h192.168.10.100
ip a