high availability(HA) 高可用: 不会有单点故障,一个坏了,另外的能顶替,不影响工作,有备份。3个经典的HA软件:
- heartbeat
- keepalived 开源并且免费的软件 官方网站:Keepalived for Linux
- HAproxy
Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡(4层)和高可用性功能。
master角色的路由器(的接口)承担实际的数据流量转发任务,backup路由器侦听master路由器的状态,并在master路由器发生故障时,接替其工作,从而保证业务流量的平滑切换。
Keepalived 的2大核心功能:
- loadbalance 负载均衡 (LB):底层依赖 ipvs--》lvs软件在linux内核里已经安装,不需要单独安装
- high-availability 高可用 (HA) :底层依赖 vrrp协议
Keepalived 双主模式(互为主备)配置方案
在传统的 Keepalived 主备模式中,VIP(虚拟IP)仅在主节点生效,备节点处于待机状态。若需要实现 双主模式(互为主备),可通过 多VRRP实例 配置,使两台mysqlrouter服务器同时承载流量并互为备份。以下是具体实现步骤:
架构设计
mysqlrouter配置省略
- 目标:两台mysqlrouter服务器(Node1和Node2)各自作为不同VRRP实例的主节点,绑定不同的VIP,实现流量分流与故障互备。
- VIP分配:
-
- VIP1: 192.168.10.88(主节点:Node1,备节点:Node2)
- VIP2: 192.168.10.99(主节点:Node2,备节点:Node1)
- 流量分发:客户端或DNS轮询访问VIP1和VIP2,实现负载均衡。
Keepalived 配置
确保两个 VIP 地址是可用的,并且在同一子网中。没有看到vip是防火墙和selinux没关
#关闭firewalld防火墙服务,并且设置开机不要启动
service firewalld stop
systemctl disable firewalld
#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
不然后面ip a看不到vip
修改keepalived配置文件,其中有2个vrrp实例(互为主备),每个实例有两个不同点
state MASTER/BACKUP #keepalved是主还是备
priority 100/90 # 优先级(0-255),值越大优先级越高
1️⃣mysqlrouter1 配置(主VIP1,备VIP2)
vim/etc/keepalived/keepalived.conf
# 定义健康检查脚本:用于检测服务状态并在异常时发送告警
vrrp_script check_service {
# 脚本路径:实际执行检查和邮件告警的脚本
script "/etc/keepalived/check_service.sh"
interval 2 # 检查频率:每2秒执行一次
fall 2 # 失败阈值:连续2次检查失败视为服务异常
rise 1 # 恢复阈值:1次检查成功视为服务恢复正常
timeout 2 # 超时时间:2秒内脚本未返回则视为检查失败
}
# 第一个VRRP实例(对应VIP 192.168.10.88)
vrrp_instance VI_1 {
state MASTER # 初始状态:主节点(优先持有VIP)
interface ens33 # 绑定网卡:必须与实际物理网卡名称一致
virtual_router_id 51 # 虚拟路由ID:主备节点必须相同(1-255范围)
priority 100 # 节点优先级:主节点需高于备节点(0-255)
advert_int 1 # 通告间隔:每秒发送一次VRRP状态通告
authentication {
auth_type PASS # 认证类型:密码认证(主备需一致)
auth_pass 1234 # 认证密码:主备节点必须相同
}
virtual_ipaddress {
192.168.10.88/24 # 虚拟IP(VIP):服务对外提供的访问地址
}
track_script {
check_service # 关联健康检查:使用上面定义的check_service脚本监控服务
}
}
# 第二个VRRP实例(对应VIP 192.168.10.99)
vrrp_instance VI_2 {
state BACKUP # 初始状态:备节点(默认不持有VIP)
interface ens33 # 绑定网卡:与第一个实例保持一致
virtual_router_id 52 # 虚拟路由ID:需与其他实例不同,避免冲突
priority 90 # 节点优先级:低于VI_1,实现负载分担
advert_int 1 # 通告间隔:与第一个实例保持一致
authentication {
auth_type PASS # 认证配置:与对端节点保持一致
auth_pass 1234
}
virtual_ipaddress {
192.168.10.99/24 # 第二个虚拟IP:实现多VIP负载分担
}
track_script {
check_service # 关联健康检查:复用同一套服务监控逻辑
}
}
2️⃣mysqlrouter2 配置(主VIP2,备VIP1)
vim/etc/keepalived/keepalived.conf
# 定义健康检查脚本:用于检测服务状态并在异常时发送告警
vrrp_script check_service {
# 脚本路径:实际执行检查和邮件告警的脚本
script "/etc/keepalived/check_service.sh"
interval 2 # 检查频率:每2秒执行一次
fall 2 # 失败阈值:连续2次检查失败视为服务异常
rise 1 # 恢复阈值:1次检查成功视为服务恢复正常
timeout 2 # 超时时间:2秒内脚本未返回则视为检查失败
}
# 第一个VRRP实例(对应VIP 192.168.10.88)
vrrp_instance VI_1 {
state BACKUP
interface ens33 # 绑定网卡:必须与实际物理网卡名称一致
virtual_router_id 51 # 虚拟路由ID:主备节点必须相同(1-255范围)
priority 90
advert_int 1 # 通告间隔:每秒发送一次VRRP状态通告
authentication {
auth_type PASS # 认证类型:密码认证(主备需一致)
auth_pass 1234 # 认证密码:主备节点必须相同
}
virtual_ipaddress {
192.168.10.88/24 # 虚拟IP(VIP):服务对外提供的访问地址
}
track_script {
check_service # 关联健康检查:使用上面定义的check_service脚本监控服务
}
}
# 第二个VRRP实例(对应VIP 192.168.10.99)
vrrp_instance VI_2 {
state MASTER
interface ens33 # 绑定网卡:与第一个实例保持一致
virtual_router_id 52 # 虚拟路由ID:需与其他实例不同,避免冲突
priority 100
advert_int 1 # 通告间隔:与第一个实例保持一致
authentication {
auth_type PASS # 认证配置:与对端节点保持一致
auth_pass 1234
}
virtual_ipaddress {
192.168.10.99/24 # 第二个虚拟IP:实现多VIP负载分担
}
track_script {
check_service # 关联健康检查:复用同一套服务监控逻辑
}
}
健康检查失败后,Keepalived 会将当前节点所有vrrp实例的优先级临时降低(默认降低 20 ,可通过 weight
参数自定义)。
健康检查脚本,某一台mysqlrouter挂了降低优先级并发邮件告警
vim /etc/keepalived/check_service.sh
chmod +x /etc/keepalived/check_service.sh
------------------------------------------------
#!/bin/bash
# 服务健康检查脚本:检测目标服务状态,异常时发送告警邮件
# 定义要监控的服务名称(根据实际情况修改,如mysql、httpd等)
SERVICE="mysqlrouter"
# 定义接收告警的邮箱地址
ALERT_EMAIL="xxxxxxxxxx@qq.com"
# 检查服务是否运行(systemctl is-active返回0表示服务正常)
if systemctl is-active --quiet $SERVICE; then
# 服务正常:返回0(keepalived不会调整优先级)
exit 0
else
# 服务异常:发送告警邮件并返回1(触发优先级降低)
# 邮件内容包含时间、服务器主机名和异常服务名
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服务器$(hostname)的$SERVICE服务异常!可能需要主备切换。" |
mail -s "【紧急】$SERVICE服务故障告警" $ALERT_EMAIL
# 返回非0值:告知keepalived检查失败
exit 1
fi
- 当
check_service.sh
脚本连续fall 2
次返回非 0 退出码(表示检查失败),或脚本执行超时(timeout 2
秒未返回),Keepalived 会判定 “服务异常”。 - 执行改脚本会报错,未收到邮件的原因是 系统中缺少
mail
命令(报错 “mail: 未找到命令
”),导致脚本执行到发送邮件的步骤时失败。 mail
命令并非系统默认自带,它需要通过安装mailx
包获取;同时,还需要安装postfix
(邮件传输代理服务),否则即使有mail
命令,也无法实际发送邮件。
# 1. 安装 mailx(提供 mail 命令)和 postfix(邮件传输服务)
yum install -y mailx postfix
# 2. 启动 postfix 服务,并设置开机自启(确保重启后仍能使用)
systemctl start postfix
systemctl enable postfix
验证双主
在 mysqlrouter1
和 mysqlrouter2
节点上分别启动 Keepalived 服务,使新配置生效:
systemctl start keepalived
停止一台mysqlrouter服务
[root@mysqlrouter2 keepalived]# systemctl stop mysqlrouter
vip漂移到mysqlrouter1了
故障切换逻辑
- 场景1:Node1宕机:
-
- VIP1(192.168.10.88)漂移到Node2。
- VIP2(192.168.10.99)仍由Node2主控。
- 所有流量由Node2处理。
- 场景2:Node2宕机:
-
- VIP2(192.168.10.99)漂移到Node1。
- VIP1(192.168.10.88)仍由Node1主控。
- 所有流量由Node1处理。
- 配置文件核心逻辑:
- 两个 VRRP 实例分别管理不同 VIP通过初始状态和优先级实现负载分担
- 健康检查脚本实时监控服务,异常时自动降低节点优先级触发切换
vrrp_script
:用于监控mysqlrouter
服务是否正常运行,负责mysqlrouter服务异常时的告警(周期性检查),并进行优先级的升降,使vip漂移
vrrp_script
是 Keepalived 配置中的一个核心指令块
- 用于定义外部检测脚本,其目的是扩展 VRRP 协议 beyond 仅能检测网络和对方节点存活的基础功能,实现对应用层服务状态的高可用性管理。
track_script
的作用是:
- 在一个
vrrp_instance
(VRRP实例)中,关联并启用一个或多个事先定义好的vrrp_script
(健康检测脚本)。它是连接VRRP状态机和外部健康检查机制的桥梁。
流量分发策略
- DNS轮询:将域名解析到VIP1和VIP2,客户端随机访问两台Nginx。
- 负载均衡器:在前端部署硬件负载均衡器(如F5)或软件LB(如HAProxy),将流量分发给VIP1和VIP2。
- 客户端直连:客户端代码直接轮询使用两个V
通过配置 多VRRP实例,实现了mysqlrouter的双主互备架构,提升资源利用率与系统吞吐量。此方案适用于需要高可用且期望最大化利用硬件资源的场景,同时需注意避免网络脑裂(可通过优先级差和健康检查增强稳定性)。
脑裂现象
什么是脑裂?
多台机器出现相同vip
为什么会出现脑裂
网络通信问题是指互相联系不上都以为对方挂了,优先级就提高,切为master,vip漂移过来
脑裂有没有危害?如果有危害对业务有什么影响?
没有危害,能正常访问,反而还有负载均衡的作用,两台机器都有相同的ip地址,域名访问哪一台不可控,不是管理人员想看到的
脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务的