目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA 的出现就是解决 MySQL 单点的问题。另外随着企业数据量越来越庞大,数据库的压力又成为企业的另一个瓶颈,MySQL 多主多从架构的出现可以减轻 MySQL 本身的压力。本章将主要围绕 “MySQL 主主复制 + Keepalived+HAProxy” 这一经典高可用架构展开,通过理论结合实践,解析如何通过开源工具实现数据库的故障自动转移、负载均衡和读写分离。
MySQL 高可用(High Availability)是指通过冗余设计,确保数据库服务在单节点故障、网络中断或硬件损坏等异常情况下,仍能持续对外提供服务,同时保证数据一致性。其核心目标是实现 “零停机、零数据丢失” 的业务连续性。
MySQL 主主复制 + Keepalived + HAProxy 的高可用方案由三部分组成:
高可用性:Keepalived 实现秒级故障切换,HAProxy 健康检查确保流量仅路由到正常节点,避免单点故障。
读写扩展:主主架构支持双节点并发写入,提升写入性能;HAProxy 可配置读写分离,利用备节点分担读压力。
灵活扩展:可横向扩展 HAProxy 或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。
运维友好:基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。
主机 | 操作系统 | 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 |
本案例要求通过 MHA 监控 MySQL 数据库在故障时进行自动切换,不影响业务。
(1)安装 MySQL 数据库;
(2)配置 MySQL 互为主从;
(3)安装 haproxy 软件并配置复制均衡;
(4)安装 keepalived 软件并配置故障转移;
(5)模拟 master 故障切换
前几章笔记有安装MySQL,在这不演示了。
vim /etc/my.cnf
server-id=1
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format = MIXED
log-slave-updates=1
vim /etc/my.cnf
server-id=2
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format = MIXED
log-slave-updates=1
service mysqld restart
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;
按服务器结果更改下面命令中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
HAProxy 是一个开源的高性能负载均衡器和代理工具,支持 TCP/HTTP 应用的流量分发,具备健康检查、SSL 终止、会话保持等功能,广泛应用于 Web 服务器集群、数据库读写分离及 API 网关场景,以高效稳定的特性提升系统可用性和扩展能力。
[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
[root@localhost ~]# dnf install 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
注释
[root@localhost ~]# haproxy -c -f /etc/haproxy/haproxy.cfg
[root@localhost ~]# systemctl restart haproxy
使用测试用户 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
Keepalived 是一个用于实现系统高可用性和负载均衡的工具,通过 VRRP(Virtual Router Redundancy Protocol)等协议管理虚拟 IP 地址,持续监测服务器健康状态,当主节点故障时自动将流量切换至备用节点,确保服务不中断,常用于数据库、Web 服务等集群环境,提升系统可靠性并简化故障恢复流程。
该阶段操作在 Keepalived1、Keepalived2 都要执行
[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
[root@localhost ~]# dnf install keepalived
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
mysql -utest -ppwd123 -h192.168.10.100 -p3306
show databases;
mysql -utest -ppwd123 -h192.168.10.100
ip a