一、方案概述
在数字化业务场景中,数据库是核心基础设施,单点故障会直接导致业务中断。本文基于MySQL 双主复制 + haproxy 负载均衡 + Keepalived 高可用架构,实现 MySQL 服务的故障自动切换、读写负载分流,保障业务连续性,满足企业级高可用需求。
架构核心组件
表格
| 组件 | 作用 |
|---|---|
| MySQL 双主 | 两台 MySQL 节点互为主从,双向同步数据,支持读写操作,保障数据冗余 |
| haproxy | 负载均衡器,分发读写请求,支持健康检查,实现故障节点自动剔除 |
| Keepalived | 提供 VIP 漂移,实现 haproxy 节点的高可用,保障负载均衡层无单点 |
二、环境准备
1. 服务器规划
表格
| 主机 | 操作系统 | IP 地址 | 应用 |
|---|---|---|---|
| Master1 | openEuler 24.03 | 192.168.10.01 | MySQL |
| Master2 | openEuler 24.03 | 192.168.10.02 | MySQL |
| Keepalived1 | openEuler 24.03 | 192.168.10.03 | Keepalived、haproxy |
| Keepalived2 | openEuler 24.03 | 192.168.10.04 | Keepalived、haproxy |
2. 前置准备
所有节点执行基础环境配置:
bash
运行
# 关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
三、MySQL 双主复制部署
1. 二进制安装 MySQL
bash
运行
# 解压安装包
tar -zxvf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz -C /usr/local/
ln -s /usr/local/mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql
# 创建数据目录
mkdir -p /data/mysql/data
# 创建用户
useradd -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql /data/mysql
# 初始化
/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql/data
# 配置环境变量
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile
2. 配置双主同步
Master1 配置(/etc/my.cnf)
ini
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=MIXED
auto-increment-increment=2
auto-increment-offset=1
Master2 配置(/etc/my.cnf)
ini
[mysqld]
server-id=2
log-bin=mysql-bin
binlog-format=MIXED
auto-increment-increment=2
auto-increment-offset=2
配置主从同步
Master1 执行:
sql
CREATE USER 'repl'@'192.168.10.02' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.02';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; -- 记录File和Position
Master2 执行:
sql
CREATE USER 'repl'@'192.168.10.01' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.01';
FLUSH PRIVILEGES;
-- 配置主从(以Master1为源)
CHANGE MASTER TO
MASTER_HOST='192.168.10.01',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157;
START SLAVE;
SHOW SLAVE STATUS\G -- 确认Slave_IO_Running、Slave_SQL_Running为Yes
-- 配置反向主从(以Master2为源,Master1执行)
CHANGE MASTER TO
MASTER_HOST='192.168.10.02',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157;
START SLAVE;
SHOW SLAVE STATUS\G
四、haproxy 负载均衡部署
1. 安装 haproxy
bash
运行
yum install -y haproxy
2. 配置 haproxy(/etc/haproxy/haproxy.cfg)
ini
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend mysql_front
bind *:3306
default_backend mysql_back
backend mysql_back
balance roundrobin
server master1 192.168.10.01:3306 check port 3306 inter 2000 rise 2 fall 3
server master2 192.168.10.02:3306 check port 3306 inter 2000 rise 2 fall 3
listen stats
bind *:8080
stats enable
stats uri /stats
stats auth admin:Admin@123
3. 启动服务
bash
运行
haproxy -f /etc/haproxy/haproxy.cfg
systemctl enable --now haproxy
五、Keepalived 高可用部署
1. 安装 Keepalived
bash
运行
yum install -y keepalived
2. 主节点配置(Keepalived1,/etc/keepalived/keepalived.conf)
ini
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100
}
track_script {
check_haproxy
}
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
}
3. 备节点配置(Keepalived2,/etc/keepalived/keepalived.conf)
ini
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100
}
track_script {
check_haproxy
}
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
}
4. 健康检查脚本(/etc/keepalived/check_haproxy.sh)
bash
运行
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
systemctl stop keepalived
fi
bash
运行
chmod +x /etc/keepalived/check_haproxy.sh
systemctl enable --now keepalived
六、高可用验证
1. 故障切换验证
- 手动停止 Master1 的 MySQL 服务,haproxy 会自动剔除该节点,业务流量仅流向 Master2,无感知切换。
- 手动停止 Keepalived1 的 haproxy 服务,Keepalived 会自动将 VIP 漂移至 Keepalived2,负载均衡服务持续可用。
2. 负载均衡验证
通过 VIP(192.168.10.100)连接 MySQL,多次执行查询,可观察到请求在 Master1、Master2 之间轮询分发。
七、方案优势
- 高可用性:双主复制 + VIP 漂移,实现数据库层、负载均衡层双重高可用,故障秒级切换。
- 可扩展性:haproxy 支持水平扩展,可灵活新增 MySQL 节点,适配业务增长。
- 运维友好:开源组件、社区支持完善,无厂商绑定,适合自建数据库集群。
- 性能优化:支持读写分离、负载均衡,提升数据库并发处理能力。
八、注意事项
- MySQL 双主架构需避免数据冲突,建议业务层控制写入逻辑,或使用自增步长分离。
- haproxy 需配置合理的健康检查参数,避免误判节点故障。
- Keepalived 主备节点需配置相同的认证信息,避免脑裂问题。
- 定期备份数据,保障极端场景下的数据可恢复性。