目录
1. 什么是高可用性(High Availability, HA)?
MySQL 主主复制 + keepalived + HAProxy 的高可用负载均衡架构
(4)在haproxy代理上安装keepalived(用来检测haproxy的状态)
一、概述MySQL高可用
1. 什么是高可用性(High Availability, HA)?
定义:高可用性指系统在面临硬件故障、软件错误或维护时,仍能持续提供服务的能力,目标是尽量减少停机时间(如达到 99.99% 的可用性,即全年停机时间不超过 52.6 分钟)。
核心目标:
故障自动恢复:快速检测故障并自动切换至备用节点。
数据零丢失:确保故障切换时数据完整性。
服务连续性:用户无感知的故障转移。
2. MySQL 高可用常见方案
以下是 MySQL 实现高可用的主流方案及其特点:
方案 | 原理 | 优点 | 缺点 |
---|---|---|---|
主从复制 + MHA | 基于异步/半同步主从复制,通过 MHA(Master High Availability)监控主库故障并自动切换从库为新主库。 | 简单易用,适合异步复制环境。 | 依赖脚本和外部工具,半同步可能延迟。 |
Galera Cluster | 基于同步多主复制(Synchronous Multi-Master),所有节点数据实时同步。 | 强一致性,读写分离灵活。 | 网络延迟敏感,写入性能受节点数影响。 |
MySQL Group Replication | MySQL 官方方案,基于 Paxos 协议实现多主集群,支持单主或多主模式。 | 原生支持,自动化故障转移。 | 配置复杂,对网络稳定性要求高。 |
InnoDB Cluster | 基于 MySQL Group Replication + MySQL Shell + MySQL Router 的完整高可用套件。 | 官方集成,管理便捷。 | 依赖 MySQL 8.0+,资源消耗较高。 |
Proxy-based HA | 通过中间件(如 ProxySQL、HAProxy)实现读写分离和故障转移。 | 对应用透明,灵活扩展。 | 中间件可能成为性能瓶颈。 |
云服务高可用 | 使用云厂商方案(如 AWS RDS Multi-AZ、阿里云高可用版)。 | 全托管,自动备份与恢复。 |
成本较高,依赖云平台。 |
3. 高可用核心机制
数据冗余:
主从复制(异步/半同步)保障数据多副本存储。
同步复制(如 Galera)确保所有节点数据强一致。
故障检测与切换:
心跳机制:通过定期心跳包检测节点存活状态。
VIP/DNS 漂移:故障时虚拟 IP 或 DNS 指向新主库。
脑裂(Split-Brain)处理:
使用仲裁节点(如 MHA 的 Manager)或多数派投票(Paxos 协议)避免多主同时写入。
数据一致性保障:
半同步复制:主库提交事务前需至少一个从库确认接收。
并行复制:解决单线程复制延迟问题(MySQL 5.7+)
4. 选型建议
强一致性场景:选择 Galera Cluster 或 MySQL Group Replication。
简单主从架构:主从复制 + MHA 或 Keepalived。
云环境:优先使用云厂商托管方案(如 AWS RDS)。
大规模集群:结合中间件(ProxySQL)与 Group Replication。
注意事项
数据同步延迟:异步复制可能导致切换时数据丢失,需结合业务容忍度选择复制模式。
监控与告警:实时监控节点状态、复制延迟、集群健康度。
定期演练:模拟故障切换,验证高可用流程的有效性。
二、案例环境组成
MySQL 主主复制 + keepalived + HAProxy 的高可用负载均衡架构
MySQL 主主复制:两台 MySQL 实例互为主从,双向同步数据,均支持读写操作,提供冗余和扩展能力。
Keepalived:通过 VRRP 协议管理虚拟 IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。在这里用来检测HAPProxy的状态。
HAPProxy:作为反向代理和负载均衡器,将流量分发至 MySQL 节点,支持健康检查、读写分离(可选)和故障节点自动剔除。
优势
高可用性:Keepalived 实现秒级故障切换,HAPProxy 健康检查确保流量仅路由到正常节点,避免单点故障。
读写扩展:主主架构支持双节点并发写入,提升写入性能;HAPProxy 可配置读写分离,利用备节点分担读压力。
灵活扩展:可横向扩展 HAPProxy 或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。
运维友好:基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。
三、案例架构实施搭建
1. 案例需求
本案例要求通过 MHA 监控 MySQL 数据库,在故障时进行自动切换,不影响业务。
2. 案例实现思路
(1)安装 MySQL 数据库;
(2)配置 MySQL 互为主从;
(3)安装 haproxy 软件并配置复制均衡;
(4)安装 keepalived 软件并配置故障转移;
(5)模拟 master 故障切换。
3. 搭建架构
(1)安装 MySQL 数据库;
主页有关于MySQL的详细安装步骤
(2)配置主主复制,MySQL互为主从
#master1、2互为主从(操作一样)
vim /etc/my.cnf
log-bin=/usr/local/mysql/data/mysql-bin
binlog-format=MIXED
server-id=1/2
--重启MySQL
systemctl restart mysqld
#创建用户,为从授权
create user 'myslave'@'%' identified by '123456';
grant replication slave on *.* to 'myslave'@'%';
alter user 'myslave'@'%' identified with mysql_native_password by '123456';
注意:identified with mysql_native_password 加密模块,保护密码
#刷新并查看主的状态信息
flush privileges;
show master status; //看File和Position
#两个主机互相连接主 (注意好不要填错IP和pos偏移量)
change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1149;
#开启从同步
start slave;
#查看从状态信息
show slave status\G
验证主主复制的同步:创建库
(3)部署haproxy (2台)
#关闭selinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
#安装haproxy
dnf -y install haproxy
#编辑配置文件
vim /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 http-request 5s
timeout queue 1m
timeout connect 5s
timeout client 1m
timeout server 1m
timeout http-keep-alive 5s
timeout check 5s
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
#重启服务并检测文件配置
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy
(4)在haproxy代理上安装keepalived(用来检测haproxy的状态)
#关闭selinux和防火墙(做过不用)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
#安装
dnf install -y keepalived
#编辑配置文件
注意:原本的那个是模板文件,需要拷贝一下
cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
router_id r1/r2
vrrp_instance VI_1 {
state BACKUP
nopreempt //优先级高的主机设置
interface ens33
priority 100 //优先级
}
注释掉vrrp_strict,删除virtual_ipaddress:区域配置完后面的内容
##2台配置不同,要注意router_id 设置不同,
vrrp_instance 实例(管理VIP的):
要注意两台都为备BACKUP(通过优先级自动选主);优先级修改成不同;优先高一台设置nopreempt(不抢占模式),防止优先级高的故障后还抢占另一台的主身份。
interface 网卡对应本机的网卡名;
virtual_ipaddress: 改成同网段的
注释掉vrrp_strict :严格模式,它会阻止VIP单播通信 #####
#添加监控脚本(测试haproxy的状态,故障后关闭haproxy,keepalived就把VIP漂到另一台)
vim /etc/keepalived/chk.sh
#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];
then
/etc/init.d/keepalived stop 或 systemctl stop keepalived
fi
#重启keepalived
systemctl restart keepalived
#查看VIP(必须是一台有,一台没有)
ip add
#自动跑监控脚本
方一:创建计划任务,定期自动执行
方二:添加到keepalived的配置文件里(keepalived允许添加外部脚本到配置里)
添到示例上方:vrrp_script chk_haproxy {
script "/etc/keepalived/chk.sh"
interval 2
}
添加到示例里面:
track_script {
chk_haproxy
}
chmod +x /etc/keepalived/chk.sh //给脚本执行权限
systemctl restart keepalived
#客户端验证
用Vip连接MySQL
mysql -utest -p123456 -h192.168.10.100
#注意:客户端没有mysql的命令,可以用“yum -y install mysql”下载
(5)模拟故障并验证架构效果
#在服务器上创建测试账户test(只需创一次,另一台主会同步)
create user testt@'%' identified by '123456';
grant all on *.* to testt@'%';
alter user 'testt'@'%' identified with mysql_native_password by '123456';
flush privileges;
模拟故障:
1.关闭master1,测试HAProxy的效果,它具备健康检测功能,会自动切换
ping master1IP //发现已离线
mysql -utest -p123456 -h192.168.10.100 //客户端验证是否能正常登录,正常登为正确
2.关闭keepalived,查看VIP漂移的效果
ip a // mysql还是可以访问的