Keepalived 的工作原理基于 VRRP(虚拟路由冗余协议) 和 LVS(Linux 虚拟服务器),通过多层次协作实现服务器的高可用性和负载均衡。以下是其核心机制的详细说明:
VRRP(Virtual Router Redundancy Protocol) 是 Keepalived 实现高可用的核心协议,其作用是:
Keepalived 采用模块化设计,分为三层:
/etc/keepalived/keepalived.conf
配置文件。priority
值决定选举结果,值越高越优先成为 Master。state
参数(MASTER/BACKUP)设置初始角色。优先级比较:各节点通过比较 priority
值选举 Master(默认 100)。
抢占模式:若高优先级节点恢复,是否重新成为 Master(由 nopreempt
控制)。
VRRP 通告
:Master 定期(默认 1 秒)发送 VRRP 报文,Backup 监听该报文:
Master 职责
:
Backup 职责
:
Keepalived 通过 脚本监控 和 服务状态检测 确保高可用性:
脚本监控
:通过
vrrp_script
配置自定义脚本,定期执行(如检查 Nginx 进程)。
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" # 检测 Nginx 是否运行
interval 2 # 每2秒执行一次
weight -20 # 检测失败时降低优先级20
}
服务状态检测:结合 LVS 监控 Real Server 的健康状态,自动剔除故障节点。
当 Master 节点故障(如 Keepalived 进程停止):
Keepalived 可结合 LVS 实现负载均衡,工作流程:
理解以下参数对掌握 Keepalived 原理至关重要:
VRRP 实例参数
:
state
:初始状态(MASTER/BACKUP)。priority
:优先级(1-255,值越高越优先)。advert_int
:VRRP 通告间隔(秒)。authentication
:认证方式(确保集群安全)。健康检查参数
:
script
:自定义检测脚本。interval
:检测间隔。weight
:检测失败时调整优先级。总结
Keepalived 通过 VRRP 协议实现服务器的高可用,通过 LVS 实现负载均衡,两者结合提供了强大的基础设施保障。其核心优势在于 自动故障检测与切换、透明的 VIP 管理 和 灵活的配置,是构建高可用架构的首选开源方案。
Keepalived 配置文件位于 /etc/keepalived/keepalived.conf
,主要包含三部分:
# 全局定义
global_defs {
router_id LVS_DEVEL # 节点标识(唯一)
script_user root # 执行脚本的用户
enable_script_security # 启用脚本安全模式
}
# VRRP 实例(高可用模块)
vrrp_instance VI_1 {
state MASTER # 初始状态:MASTER 或 BACKUP
interface eth0 # 绑定的网卡
virtual_router_id 51 # 虚拟路由 ID(0-255,主备必须相同)
priority 100 # 优先级(数值越大越优先)
advert_int 1 # VRRP 通告间隔(秒)
authentication { # 认证配置(主备必须相同)
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 虚拟 IP 地址(可多个)
192.168.1.100/24 dev eth0 label eth0:0
}
}
# 虚拟服务器(负载均衡模块,可选)
virtual_server 192.168.1.100 80 {
delay_loop 6 # 健康检查间隔
lb_algo rr # 负载均衡算法:rr(轮询)、wrr(加权轮询)、lc(最小连接)
lb_kind NAT # 负载均衡模式:NAT、DR、TUN
persistence_timeout 50 # 会话保持时间(秒)
# 真实服务器列表
real_server 192.168.1.11 80 {
weight 1 # 权重
SSL_GET { # 健康检查方式
url { path "/" digest ff20ad2481f97b1754ef3e12ecd3a9cc }
url { path "/mrtg/" digest 9b3a0c85a8872256d663a3a277a72552 }
connect_timeout 3 # 连接超时
retry 3 # 重试次数
delay_before_retry 3 # 重试间隔
}
}
}
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 检测 Nginx 状态的脚本
interval 2 # 每2秒执行一次
weight -20 # 检测失败时优先级降低20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx # 关联检测脚本
}
virtual_ipaddress {
192.168.1.100/24
}
}
仅需修改 state
和 priority
:
vrrp_instance VI_1 {
state BACKUP
priority 90 # 低于主服务器
# 其他配置与主服务器相同
}
#!/bin/bash
if ! pgrep -x nginx >/dev/null; then
systemctl restart nginx
sleep 2
if ! pgrep -x nginx >/dev/null; then
exit 1 # 退出状态非0表示检测失败
fi
fi
exit 0
权限设置:
chmod +x /etc/keepalived/check_nginx.sh
global_defs {
router_id LVS_LOADBALANCER
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo wrr # 加权轮询
lb_kind DR # 直接路由模式
persistence_timeout 50
real_server 192.168.1.11 80 {
weight 3
SSL_GET {
url { path "/" digest ff20ad2481f97b1754ef3e12ecd3a9cc }
connect_timeout 3
retry 3
}
}
real_server 192.168.1.12 80 {
weight 2
SSL_GET {
url { path "/" digest ff20ad2481f97b1754ef3e12ecd3a9cc }
connect_timeout 3
retry 3
}
}
}
参数 | 说明 | 示例值 |
---|---|---|
router_id |
节点唯一标识 | LVS_DEVEL |
smtp_server |
SMTP 服务器地址(告警邮件用) | 192.168.1.1 |
enable_script_security |
启用脚本安全模式(限制脚本路径) | 无值,直接声明 |
参数 | 说明 | 示例值 |
---|---|---|
state |
初始状态(MASTER/BACKUP) | MASTER |
interface |
绑定的网卡名称 | eth0 |
virtual_router_id |
虚拟路由 ID(0-255) | 51 |
priority |
优先级(值越大越优先) | 100 |
advert_int |
VRRP 通告间隔(秒) | 1 |
nopreempt |
禁止抢占模式(高优先级节点不主动接管) | 无值,直接声明 |
authentication |
认证方式(PASS/HA) | auth_type PASS auth_pass 1111 |
参数 | 说明 | 示例值 |
---|---|---|
script |
检测脚本路径 | “/etc/keepalived/check_nginx.sh” |
interval |
执行间隔(秒) | 2 |
weight |
检测失败时调整的优先级 | -20 |
rise |
连续成功多少次后认为服务正常 | 2 |
fall |
连续失败多少次后认为服务异常 | 2 |
参数 | 说明 | 示例值 |
---|---|---|
lb_algo |
负载均衡算法 | rr(轮询)、wrr(加权轮询)、lc(最小连接) |
lb_kind |
负载均衡模式 | NAT、DR、TUN |
persistence_timeout |
会话保持时间(秒) | 50 |
protocol |
协议类型 | TCP、UDP |
# 启动服务
sudo systemctl start keepalived
# 设置开机自启
sudo systemctl enable keepalived
# 查看状态
sudo systemctl status keepalived
# 查看 VIP 是否绑定(主服务器)
ip addr show eth0 | grep 192.168.1.100
# 测试 VIP 连通性
ping 192.168.1.100
# 在主服务器上停止 Keepalived
sudo systemctl stop keepalived
# 在备服务器上查看 VIP 是否已接管
ip addr show eth0
# 恢复主服务器 Keepalived(若未配置 nopreempt,将重新接管 VIP)
sudo systemctl start keepalived
原因:防火墙阻止 VRRP 协议或 VIP 未正确绑定。
解决方案
# 开放 VRRP 协议(CentOS/RHEL)
sudo firewall-cmd --add-protocol=vrrp --permanent
sudo firewall-cmd --reload
# 关闭 SELinux(临时)
sudo setenforce 0
原因:网络分区导致心跳不通,多个节点同时认为自己是 Master。
解决方案
:
增加冗余网络连接。
使用脚本检测对端状态(如
ping
VIP):
vrrp_script chk_peer {
script "ping -c 3 192.168.1.100 >/dev/null || exit 1"
interval 5
weight -30
}
原因:IPVS 模块未加载或配置错误。
解决方案
# 加载 IPVS 模块
sudo modprobe ip_vs
# 查看 IPVS 规则
sudo ipvsadm -L -n
# 检查 Real Server 配置(确保路由可达)
为不同服务创建独立的 VRRP 实例:
vrrp_instance VI_WEB {
virtual_router_id 51
virtual_ipaddress { 192.168.1.100 }
}
vrrp_instance VI_DB {
virtual_router_id 52
virtual_ipaddress { 192.168.1.101 }
}
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.1.1
smtp_connect_timeout 30
}
监控 MySQL 服务状态:
#!/bin/bash
mysql -h 127.0.0.1 -u monitor -pPASSWORD -e "SELECT 1;" >/dev/null 2>&1
if [ $? -ne 0 ]; then
systemctl restart mysqld
sleep 5
mysql -h 127.0.0.1 -u monitor -pPASSWORD -e "SELECT 1;" >/dev/null 2>&1
if [ $? -ne 0 ]; then
exit 1
fi
fi
exit 0
总结
Keepalived 通过简单的配置即可实现高可用和负载均衡,关键在于理解:
根据实际需求调整配置参数,可构建出适合不同场景的高可用架构。