目录
4.1 安装 MySQL 数据库(Master1/Master2)
(1)修改配置文件(Master1/Master2 分别设置)
(2)创建复制用户并授权(Master1/Master2 执行相同操作)
4.3 安装与配置 HAProxy(Keepalived1/Keepalived2)
(2)配置文件(/etc/haproxy/haproxy.cfg)
4.4 安装与配置 Keepalived(Keepalived1/Keepalived2)
一、前言
在数字化浪潮席卷的今天,数据已然成为企业最为核心的资产之一,而数据库的可靠性更是直接关乎业务的连续性。传统的单节点 MySQL 架构存在着单点故障风险,一旦发生宕机,随之而来的将是业务中断、数据丢失等一系列严重后果。尤其是在电商秒杀、金融交易这类对实时性和稳定性要求极高的场景中,数据库的持续可用性(High Availability, HA)早已成为系统设计不可妥协的刚性需求。
本文将探讨一种经典的 MySQL 高可用架构方案 ——主主复制 + Keepalived+HAProxy。通过理论与实践相结合的方式,详细解析如何借助开源工具,实现数据库的故障自动转移、负载均衡以及读写分离,为企业构建稳定可靠的数据库服务提供全面且实用的解决方案。
二、架构解析
2.1 高可用架构的三大核心组件
(1)MySQL 主主复制:双向同步,冗余扩展
两台 MySQL 实例相互作为主从节点,实现数据的双向同步,并且都支持读写操作。这种架构不仅提供了冗余保障,还具备扩展能力,能够有效应对日益增长的数据处理需求。
(2)Keepalived:虚拟 IP 管理与故障切换
基于 VRRP 协议,Keepalived 负责管理虚拟 IP(VIP),实时监控 MySQL 节点的状态。当检测到故障时,能够在秒级时间内将 VIP 漂移至存活节点,确保服务地址保持不变,从而保障业务的连续性。
(3)HAProxy:负载均衡与健康检查
作为反向代理和负载均衡器,HAProxy 能够将流量智能分发至各个 MySQL 节点。它支持健康检查功能,可自动剔除故障节点,同时还能实现读写分离(可选),进一步提升系统的性能和稳定性。
2.2 架构优势
- 高可用性保障:Keepalived 的秒级故障切换机制,结合 HAProxy 的健康检查功能,能够有效避免单点故障,确保服务的持续可用。
- 读写性能扩展:主主架构支持双节点并发写入,显著提升了写入性能;通过 HAProxy 配置读写分离,可利用备节点分担读压力,实现性能的全面提升。
- 灵活扩展能力:支持横向扩展 HAProxy 或 MySQL 节点,并且可以根据实际需求动态调整负载均衡策略,如轮询、权重等,使架构能够灵活适应业务发展。
- 运维友好性:基于开源工具构建,不存在厂商锁定问题,同时拥有丰富的社区支持,非常适合企业自建数据库集群,降低运维成本。
三、案例环境准备
3.1 环境配置表
主机角色 | 操作系统 | IP 地址 | 部署组件 |
Master1 | openEuler 24.03 | 192.168.10.101 | MySQL 8.0 |
Master2 | openEuler 24.03 | 192.168.10.102 | MySQL 8.0 |
Keepalived1 | openEuler 24.03 | 192.168.10.103 | Keepalived、HAProxy |
Keepalived2 | openEuler 24.03 | 192.168.10.104 | Keepalived、HAProxy |
3.2 拓扑结构说明
Keepalived1 (192.168.10.103) + HAProxy ├─ 虚拟IP: 192.168.10.100
Keepalived2 (192.168.10.104) + HAProxy └─ 负载均衡 → Master1/Master2
Master1 (192.168.10.101) ├─ 主主复制(双向同步)
Master2 (192.168.10.102) └─ 主主复制(双向同步)
3.3 案例需求与实现思路
- 核心需求:通过 MHA(实际上本案例主要使用 Keepalived+HAProxy)监控 MySQL 数据库,在发生故障时实现自动切换,确保业务不受影响。
- 实施步骤:
- 安装 MySQL 数据库,并完成基础环境配置。
- 配置 MySQL 主主复制,实现数据的双向同步。
- 安装 HAProxy 并进行负载均衡配置,实现流量的智能分发。
- 安装 Keepalived 并配置故障转移机制,保障服务的高可用性。
- 模拟 Master 节点故障,验证故障切换的有效性。
四、实施步骤
4.1 安装 MySQL 数据库(Master1/Master2)
(1)基础环境准备
# 安装基础工具包
yum -y install gcc vim wget net-tools lrzsz
# 安装依赖包
dnf install -y libaio numactl openssl ncurses-compat-libs
# 创建MySQL用户
useradd -M -s /sbin/nologin mysql
# 关闭SELinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl disable --now firewalld
(2)二进制安装
# 解压安装包
tar -xJf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql
# 创建数据目录并授权
mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql/data
# 初始化数据库(记录初始密码)
cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
(3)配置文件调整(/etc/my.cnf)
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address=0.0.0.0
skip-name-resolve
port=3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
max_allowed_packet=16M
(4)设置系统服务并启动
# 复制服务脚本
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
# 创建systemd服务
vim /lib/systemd/system/mysqld.service # 写入服务配置
systemctl daemon-reload
systemctl enable --now mysqld
# 设置root密码并创建测试用户
mysqladmin -u root -p password 'pwd123'
mysql -u root -p <<EOF
CREATE USER 'test'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL ON *.* TO 'test'@'192.168.10.%';
FLUSH PRIVILEGES;
EOF
4.2 配置 MySQL 主主复制
(1)修改配置文件(Master1/Master2 分别设置)
- Master1(/etc/my.cnf)
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format=MIXED
server-id=1
- Master2(/etc/my.cnf)
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format=MIXED
server-id=2
- 重启 MySQL 服务:
systemctl restart mysqld
(2)创建复制用户并授权(Master1/Master2 执行相同操作)
mysql -u root -p <<EOF
CREATE USER 'myslave'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.10.%';
FLUSH PRIVILEGES;
EOF
(3)配置双向复制
- 在 Master1 上配置指向 Master2 的复制
mysql -u root -p <<EOF
CHANGE MASTER TO
MASTER_HOST='192.168.10.102',
MASTER_USER='myslave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001', # 替换为实际日志文件名
MASTER_LOG_POS=157; # 替换为实际Position值
START SLAVE;
EOF
- 在 Master2 上配置指向 Master1 的复制
mysql -u root -p <<EOF
CHANGE MASTER TO
MASTER_HOST='192.168.10.101',
MASTER_USER='myslave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001', # 替换为实际日志文件名
MASTER_LOG_POS=157; # 替换为实际Position值
START SLAVE;
EOF
- 验证复制状态
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -E 'Slave_IO_Running|Slave_SQL_Running'
# 预期输出:Both should be "Yes"
4.3 安装与配置 HAProxy(Keepalived1/Keepalived2)
(1)环境准备
# 关闭SELinux和防火墙(同MySQL步骤)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl disable --now firewalld
# 安装HAProxy
dnf install -y haproxy
(2)配置文件(/etc/haproxy/haproxy.cfg)
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
maxconn 4000
defaults
mode tcp
log global
option tcplog
option dontlognull
retries 3
timeout connect 5s
timeout client 1m
timeout server 1m
maxconn 3000
listen mysql
bind 0.0.0.0:3306
balance leastconn
server mysql1 192.168.10.101:3306 check port 3306 maxconn 300
server mysql2 192.168.10.102:3306 check port 3306 maxconn 300
(3)启动与测试
haproxy -c -f /etc/haproxy/haproxy.cfg # 检查配置语法
systemctl restart haproxy
# 测试连接
mysql -utest -p123456 -h192.168.10.103 -P3306
4.4 安装与配置 Keepalived(Keepalived1/Keepalived2)
(1)安装与基础配置
dnf install -y keepalived
# 关闭SELinux和防火墙(同前)
(2)配置文件差异
- Keepalived1(/etc/keepalived/keepalived.conf)
global_defs {
router_id r1
}
vrrp_script chk_haproxy {
script "/etc/keepalived/chk.sh"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
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 {
chk_haproxy
}
}
- Keepalived2(/etc/keepalived/keepalived.conf)
global_defs {
router_id r2
}
# 其他配置与Keepalived1相同,仅priority改为99
priority 99
(3)健康检查脚本(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 分配
ip a show ens33 # Keepalived1应显示VIP 192.168.10.100
五、故障转移测试
5.1 模拟 Master1 故障
# 关闭Master1服务器
shutdown -h now
# 测试VIP连接
mysql -utest -p123456 -h192.168.10.100
# 预期结果:连接成功,HAProxy自动剔除故障节点
5.2 模拟 Keepalived1 故障
# 停止Keepalived1服务
systemctl stop keepalived
# 检查VIP漂移
ip a show ens33 # Keepalived2应显示VIP
# 测试连接
mysql -utest -p123456 -h192.168.10.100
# 预期结果:连接成功,VIP漂移至Keepalived2
六、总结
6.1 架构价值
- 数据一致性:通过主主复制实现双向数据同步,确保多节点间的数据一致。
- 服务连续性:Keepalived 的 VIP 漂移机制与 HAProxy 的健康检查相结合,实现故障的自动切换,保障业务零中断。
- 性能优化:负载均衡与读写分离功能有效提升系统吞吐能力,满足高并发场景的需求。
6.2 扩展建议
- 结合 MHA:进一步增强故障检测与自动恢复能力,实现更智能的故障切换。
- 读写分离配置:在 HAProxy 中细化规则,明确区分读请求和写请求,进一步优化性能。
- 节点扩展:根据业务需求横向扩展 MySQL 从节点,分担读压力,提升系统的可扩展性。
通过本文介绍的 “MySQL 主主复制 + Keepalived+HAProxy” 架构,企业能够以较低的成本构建高可用、高性能的数据库服务,为核心业务提供坚实的数据保障。在实际应用中,可根据具体业务场景对架构进行灵活调整和扩展,以满足不断变化的需求。