1. 高可用 (High Availability) 概述
1.1 什么是高可用
高可用(HA)是指通过设计减少系统不能提供服务的时间。在服务器架构中,通常指两台或多台机器运行相同的业务系统,当主节点(Master)出现故障时,备节点(Backup)能快速接管服务,使用户对故障“无感知”。
1.2 常见解决方案
- 硬件方案:F5 Big-IP(性能强,价格贵)。
- 软件方案:Keepalived(基于 VRRP,轻量级,常用)、Heartbeat(较老)、Pacemaker(复杂)。
2. Keepalived 核心原理
2.1 VRRP 协议 (虚拟路由冗余协议)
Keepalived 的核心是 VRRP。
- 背景:传统网络中,网关故障会导致内网断网。客户端通常无法自动切换网关 IP。
- 机制:VRRP 将多台路由器虚拟成一个虚拟路由器,对外提供一个虚拟 IP (VIP) 和 虚拟 MAC (VMAC)。
- 工作方式:
- 客户端只连接 VIP。
- Master 节点通过组播(Multicast)定期发送心跳包(VRRP Advertisement)。
- Backup 节点监听心跳。如果在规定时间内(通常是 3 * advert_int + skew_time)没收到心跳,则认为 Master 挂了,并根据优先级选举出新的 Master 接管 VIP。
- ARP 欺骗/更新:VIP 漂移后,新 Master 会发送免费 ARP (Gratuitous ARP) 更新局域网内设备的 ARP 缓存,将 VIP 映射到自己的 MAC 地址。
2.2 【拓展】Keepalived 架构组件
Keepalived 不仅仅是 VRRP,它主要由三个模块组成:
- Core:负责进程启动、维护和全局配置文件的加载。
- VRRP Stack:实现 VRRP 协议,处理 VIP 漂移和故障切换。
- Checkers:负责后端真实服务器(Real Server)的健康检查(如 LVS 场景下)。在 Nginx 高可用场景中,我们通常使用
vrrp_script自定义脚本进行应用层检查。
3. Keepalived 安装与配置
3.1 环境准备
- Master: 10.0.0.5
- Backup: 10.0.0.6
- VIP: 10.0.0.3
3.2 安装
yum install -y keepalived
3.3 配置文件详解 (/etc/keepalived/keepalived.conf)
Master 配置示例:
global_defs {
router_id lb01 # 唯一标识,通常用主机名
}
vrrp_instance VI_1 { # 实例名称,主备必须一致
state MASTER # 初始角色:MASTER 或 BACKUP
interface eth0 # 绑定 VIP 的网卡
virtual_router_id 50 # VRID,主备必须一致 (0-255)
priority 150 # 优先级,数值越大优先级越高
advert_int 1 # 心跳间隔 (秒)
authentication { # 认证信息,主备必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 虚拟 IP 列表
10.0.0.3
}
}
Backup 配置区别:
router_id: 设置为不同 ID (如lb02)。state: 设置为BACKUP。priority: 设置较低的值 (如100)。
4. 抢占模式 vs 非抢占模式
4.1 抢占模式 (Preempt) - 默认
- 行为:当 Master 挂掉,Backup 接管 VIP。一旦 Master 恢复,由于优先级高,会立即抢回 VIP。
- 缺点:如果 Master 网络不稳定导致频繁启停,VIP 会在两台机器间频繁漂移(Flapping),影响业务稳定性。
4.2 非抢占模式 (No-Preempt)
- 行为:Master 挂掉,Backup 接管。即使 Master 恢复,只要 Backup 没挂,VIP 就不会漂移回去。
- 配置要点:
- 两台机器的
state都必须配置为BACKUP。 - 两台机器都添加
nopreempt指令。 - 通过
priority区分谁是主(高优先级者优先启动获得 VIP)。
配置示例:
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt # 开启非抢占
...
}
5. 脑裂 (Split Brain)
5.1 现象与原因
- 现象:Master 和 Backup 互不相通,都认为自己是 Master,导致两台机器同时拥有 VIP。这会引起 IP 冲突,导致服务不可用。
- 常见原因:
- 心跳链路故障(网线松动、交换机故障)。
- 防火墙(iptables/firewalld)拦截了 VRRP 组播报文。
- 配置错误(
virtual_router_id不一致等)。
5.2 解决方案
- 防火墙放行:确保 VRRP 协议(IP 协议号 112)允许通过。
bash firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT - 脚本检测:编写脚本,当检测到无法 ping 通对方但自己拥有 VIP 时,强制关闭自身的 Keepalived 服务(自杀机制)。
6. Nginx + Keepalived 高可用集成
6.1 为什么需要集成?
Keepalived 默认只监控网络层和系统层。如果 Nginx 进程挂了(应用层故障),但机器还在,Keepalived 不会切换 VIP,导致请求发送到死掉的 Nginx 上。
6.2 实现方案:VRRP Script
通过 vrrp_script 定义检测脚本,通过 track_script 调用。
检测脚本 (check_web.sh):
#!/bin/bash
# 检查 nginx 进程数量
nginxpid=$(ps -C nginx --no-header | wc -l)
if [ $nginxpid -eq 0 ]; then
# 尝试重启 Nginx
systemctl start nginx
sleep 3
# 再次检查
nginxpid=$(ps -C nginx --no-header | wc -l)
if [ $nginxpid -eq 0 ]; then
# 重启失败,停止 keepalived,触发 VIP 转移
systemctl stop keepalived
fi
fi
注意:脚本需要执行权限 chmod +x check_web.sh
Keepalived 配置调用:
global_defs { ... }
# 定义脚本
vrrp_script check_web {
script "/root/check_web.sh"
interval 5 # 每 5 秒检测一次
weight -20 # (可选) 失败时降低本节点优先级
fall 2 # (可选) 连续失败 2 次才算失败
rise 1 # (可选) 成功 1 次算恢复
}
vrrp_instance VI_1 {
...
# 调用脚本
track_script {
check_web
}
}
6.3 【拓展】双主模式 (Active-Active)
为了避免 Backup 资源浪费,可以配置双主模式。
- 原理:运行两个 VRRP 实例(如 VI_1 和 VI_2)。
- 配置:
- Node A: VI_1 Master, VI_2 Backup
- Node B: VI_1 Backup, VI_2 Master
- 使用两个 VIP(VIP1, VIP2)。
- DNS 轮询:将域名解析同时指向 VIP1 和 VIP2,实现简单的负载均衡和双活高可用。
7. 常用排错命令
- 查看日志:
tail -f /var/log/messages(Keepalived 日志默认在此) - 查看 VIP:
ip addr show(不要用ifconfig,可能看不到 VIP) - 抓包分析:
tcpdump -i eth0 vrrp -n(查看 VRRP 报文发送情况)
Comments NOTHING