Keepalived 高可用负载均衡解决方案
一、Keepalived 概述
1.1 什么是 Keepalived?
Keepalived 是一款用 C 语言编写的路由软件,旨在为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。它最初是专为 LVS(Linux Virtual Server)负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。
1.2 核心功能
Keepalived 主要实现两大核心功能:
| 功能模块 | 描述 |
|---------|------|
| **负载均衡** | 基于 LVS(IPVS)内核模块,提供 Layer4 传输层负载均衡 |
| **高可用性** | 通过 VRRP(虚拟路由冗余协议)实现路由器故障转移 |
| **健康检查** | 实现对真实服务器的健康检查,自动隔离故障节点 |
1.3 工作原理
**VRRP协议机制**:
-
Keepalived 使用 VRRP 协议实现虚拟路由器的冗余
-
多台路由器中,一台作为 MASTER 负责处理流量,其他作为 BACKUP 监控 MASTER 状态
-
MASTER 定期发送 VRRP 通告(心跳);如果 BACKUP 在指定时间收不到通告,则接管虚拟 IP
-
虚拟 IP(VIP)会在主节点故障时自动"漂移"到备用节点,确保服务连续性
**健康检查机制**:
-
Keepalived 通过多种检查方式监控真实服务器状态
-
当某台服务器故障时,自动将其从 LVS 拓扑中移除
-
故障恢复后,自动重新加入服务器池
1.4 软件架构
Keepalived 采用模块化设计,守护进程分为三个进程:
```
PID 111 Keepalived <-- 父进程(监控子进程)
112 \_ Keepalived <-- VRRP子进程
113 \_ Keepalived <-- Healthchecking子进程
```
-
**父进程**:负责监控子进程状态,定期发送心跳包
-
**VRRP子进程**:负责 VRRP 协议实现,处理故障转移
-
**健康检查子进程**:负责对真实服务器进行健康检查
二、Keepalived 安装部署
2.1 在 openEuler/CentOS/RHEL 系统安装
```bash
使用 yum/dnf 安装
dnf install -y keepalived
验证安装
keepalived --version
rpm -qa keepalived
```
2.2 在 Ubuntu/Debian 系统安装
```bash
更新软件源
apt-get update
安装 keepalived(不安装 ipvsadm 可选)
apt-get install -y keepalived
如果需要 LVS 负载均衡功能,安装 ipvsadm
apt-get install -y ipvsadm
```
2.3 源码编译安装
```bash
下载最新稳定版
wget http://www.keepalived.org/software/keepalived-2.2.8.tar.gz
解压
tar zxvf keepalived-2.2.8.tar.gz
cd keepalived-2.2.8
配置(指定安装路径)
./configure --prefix=/usr/local/keepalived
编译安装
make && make install
```
#三、Keepalived 配置文件详解
Keepalived 的配置文件通常位于 `/etc/keepalived/keepalived.conf`。
3.1 配置文件结构
```
全局定义(global_defs)
├── VRRP实例配置(vrrp_instance)
│ ├── 虚拟IP配置(virtual_ipaddress)
│ ├── 脚本跟踪(track_script)
│ └── 状态通知(notify)
└── 虚拟服务器配置(virtual_server)
├── 真实服务器(real_server)
└── 健康检查(HTTP_GET/TCP_CHECK等)
```
3.2 完整配置示例
```bash
! Configuration File for keepalived
全局配置
global_defs {
故障通知邮件(可选)
notification_email {
acassen@firewall.loc
failover@firewall.loc
}
发件人地址
notification_email_from Alexandre.Cassen@firewall.loc
SMTP服务器
smtp_server 192.168.200.1
smtp_connect_timeout 30
路由器标识,集群内唯一
router_id LVS_MASTER
VRRP多播地址
vrrp_mcast_group4 224.0.0.18
}
脚本定义(用于服务监控)
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 检查脚本
interval 2 # 检查间隔(秒)
weight -20 # 失败时优先级降低值
fall 2 # 失败次数阈值
rise 1 # 成功次数阈值
}
VRRP实例配置
vrrp_instance VI_1 {
节点状态(MASTER/BACKUP)
state MASTER
绑定网卡
interface ens33
虚拟路由ID(同一组必须一致,范围0-255)
virtual_router_id 51
优先级(MASTER高于BACKUP)
priority 100
通告间隔(秒)
advert_int 1
认证配置
authentication {
auth_type PASS
auth_pass 1111 # 认证密码(最多8位)
}
虚拟IP地址
virtual_ipaddress {
192.168.10.100/24 dev ens33
192.168.10.101/24 dev ens33
}
跟踪脚本
track_script {
chk_nginx
}
非抢占模式(默认抢占)
nopreempt
状态通知脚本
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
LVS虚拟服务器配置(可选,与LVS集成)
virtual_server 192.168.10.100 80 {
健康检查间隔(秒)
delay_loop 6
调度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_algo rr
LVS模式 NAT|DR|TUN
lb_kind DR
持久连接超时(秒)
persistence_timeout 50
协议
protocol TCP
后备服务器(所有RS都故障时使用)
sorry_server 192.168.10.200 80
真实服务器1
real_server 192.168.10.11 80 {
weight 1
HTTP健康检查
HTTP_GET {
url {
path /index.html
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
真实服务器2
real_server 192.168.10.12 80 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200
}
connect_timeout 3
}
}
}
```
3.3 健康检查脚本示例
```bash
#!/bin/bash
/etc/keepalived/check_nginx.sh
检查 Nginx 进程是否运行
if pgrep nginx > /dev/null; then
exit 0
else
exit 1
fi
```
3.4 状态通知脚本示例
```bash
#!/bin/bash
/etc/keepalived/notify.sh
STATE=$1
VIP="192.168.10.100"
LOGFILE="/var/log/keepalived-notify.log"
case $STATE in
master)
echo "(date): 切换到 MASTER 状态,VIP: VIP" >> $LOGFILE
可以在这里启动相关服务
;;
backup)
echo "(date): 切换到 BACKUP 状态" \>\> LOGFILE
可以在这里停止相关服务
;;
fault)
echo "(date): 切换到 FAULT 状态" \>\> LOGFILE
故障处理
;;
*)
echo "(date): 未知状态: STATE" >> $LOGFILE
;;
esac
```
四、Keepalived 配置参数说明
4.1 VRRP实例关键参数
| 参数 | 说明 | 注意事项 |
|------|------|----------|
| `state` | 实例初始状态(MASTER/BACKUP) | 同一组只能有一个MASTER |
| `interface` | 绑定网卡接口 | VIP会绑定到此网卡 |
| `virtual_router_id` | 虚拟路由ID(0-255) | 同一组必须一致 |
| `priority` | 优先级(1-255) | 数值越高越可能成为MASTER |
| `advert_int` | 通告间隔(秒) | 默认1秒 |
| `nopreempt` | 非抢占模式 | 禁止高优先级节点抢占 |
| `preempt_delay` | 抢占延迟(秒) | 默认300秒 |
4.2 健康检查类型
| 检查类型 | 适用场景 | 特点 |
|----------|----------|------|
| `TCP_CHECK` | 通用TCP服务 | 检查端口是否可连接 |
| `HTTP_GET` | Web服务 | 检查HTTP状态码或页面内容MD5 |
| `SSL_GET` | HTTPS服务 | 同HTTP_GET,使用SSL连接 |
| `MISC_CHECK` | 自定义服务 | 执行自定义脚本检查 |
| `SMTP_CHECK` | 邮件服务器 | 检查SMTP服务 |
五、Keepalived 高可用实战案例
5.1 双主高可用架构
主备配置示例:
**MASTER节点配置**:
```bash
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
virtual_ipaddress {
192.168.10.100/24
}
}
```
**BACKUP节点配置**:
```bash
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.10.100/24
}
}
```
5.2 Nginx + Keepalived 高可用
```bash
1. 创建健康检查脚本
cat > /etc/keepalived/check_nginx.sh << 'EOF'
#!/bin/bash
if curl -I http://localhost/ 2>/dev/null | grep "200 OK" >/dev/null; then
exit 0
else
Nginx 故障,尝试重启
systemctl restart nginx
sleep 2
if curl -I http://localhost/ 2>/dev/null | grep "200 OK" >/dev/null; then
exit 0
else
exit 1
fi
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh
- 配置 keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.10.100/24
}
}
```
5.3 与 LVS 集成(DR模式)
```bash
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
virtual_ipaddress {
192.168.10.100/24
}
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.10.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.10.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
```
六、Keepalived 运维管理
6.1 服务管理命令
```bash
启动服务
systemctl start keepalived
停止服务
systemctl stop keepalived
重启服务
systemctl restart keepalived
查看状态
systemctl status keepalived
设置开机自启
systemctl enable keepalived
查看日志
journalctl -u keepalived -f
tail -f /var/log/messages | grep Keepalived
```
6.2 配置验证与调试
```bash
检查配置文件语法
keepalived -t -f /etc/keepalived/keepalived.conf
以调试模式运行(前台)
keepalived -n -l -D
查看详细日志
keepalived -D
查看当前VIP
ip addr show | grep -A 2 vrrp
查看VRRP状态
ip -d link show | grep vrrp
```
6.3 状态监控命令
```bash
查看keepalived进程
ps aux | grep keepalived
查看VRRP组播状态
tcpdump -i ens33 -n vrrp
查看IPVS规则(如果使用LVS)
ipvsadm -L -n --stats
查看系统日志中的keepalived消息
grep Keepalived /var/log/messages
```
七、故障排查指南
7.1 常见问题及解决方法
| 问题现象 | 可能原因 | 解决方法 |
|---------|---------|---------|
| VIP 不生效 | 网卡配置错误 | 检查 `interface` 是否正确 |
| 双主同时存在 | 防火墙阻挡VRRP | 开放 VRRP 多播地址 224.0.0.18 |
| 频繁切换 | 网络不稳定 | 增加 `advert_int` 或设置 `nopreempt` |
| 健康检查失败 | 检查脚本错误 | 单独运行脚本测试 |
| 服务无法故障转移 | 优先级配置错误 | 确保 BACKUP 优先级低于 MASTER |
7.2 防火墙配置
```bash
开放 VRRP 多播(iptables)
iptables -I INPUT -d 224.0.0.18 -j ACCEPT
iptables -I OUTPUT -d 224.0.0.18 -j ACCEPT
firewalld
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
```
八、Keepalived 与 LVS 对比总结
| 特性 | Keepalived 单独使用 | LVS + Keepalived |
|------|---------------------|------------------|
| **核心功能** | VRRP高可用、健康检查 | LVS负载均衡 + Keepalived高可用 |
| **适用场景** | 服务高可用(Nginx/MySQL等) | 四层负载均衡高可用集群 |
| **配置复杂度** | 简单 | 中等 |
| **资源消耗** | 低 | 较低 |
| **典型应用** | Web服务器高可用、数据库高可用 | LVS负载均衡器高可用 |
九、最佳实践建议
-
**合理设置优先级**:主备优先级差距建议在30以上,避免网络波动导致误判
-
**使用非抢占模式**:`nopreempt` 可避免主节点恢复后不必要的切换
-
**健康检查要精确**:尽量模拟真实用户请求,避免误判
-
**日志集中管理**:配置 syslog 集中收集 keepalived 日志
-
**定期演练**:定期进行故障转移演练,验证高可用有效性
-
**监控告警**:对接监控系统,及时掌握高可用状态
Keepalived 作为成熟的高可用解决方案,无论是单独使用还是与 LVS 结合,都能为关键业务提供可靠的服务连续性保障。