Keepalived 是构建服务器高可用(HA)架构的核心组件,基于 VRRP 协议实现故障自动切换,并通过健康检查机制确保服务持续可用。其设计初衷是解决传统静态路由存在的单点故障问题,能够在个别节点发生宕机时,保障整个网络服务不中断运行。
Keepalived 的高可用能力依赖于两大关键技术:
这两者协同工作,构成了完整的高可用解决方案。
VRRP(Virtual Router Redundancy Protocol)是 Keepalived 实现 IP 冗余的核心协议。它将多台物理服务器虚拟成一个逻辑上的“虚拟路由器”,对外暴露统一的虚拟 IP 地址(VIP),从而避免因单一节点故障导致服务中断。
在 VRRP 架构中,节点分为两类:Master(主节点) 和 Backup(备节点)。正常情况下由 Master 节点承载业务流量,Backup 节点处于监听状态。节点之间的主备关系通过优先级(取值范围 0–255)决定,优先级最高者成为 Master。当主节点失效时,优先级次高的 Backup 节点立即接管 VIP,实现服务恢复。
Master 节点会周期性地发送组播心跳报文(默认每秒一次)。Backup 节点若连续 3 秒未收到心跳,则判定 Master 故障,随即触发 VIP 绑定到本地网卡的操作——即“IP 漂移”。该过程对客户端透明,无需重新配置网络连接。
Keepalived 依靠三大核心模块协同运作,共同完成高可用功能:
在两台待部署的节点上执行以下命令进行安装:
# 安装 Keepalived 及相关依赖
yum -y install keepalived libnl3-devel ipset-devel -v
# 启动服务并设置开机自启
systemctl enable --now keepalived
# 查看服务运行状态
systemctl status keepalived
/etc/keepalived/keepalived.conf
Keepalived 的主要配置文件包含三个关键区块:
global_defsvrrp_instancevirtual_server
该部分定义了 Keepalived 的全局性参数,包括通知机制、节点标识、VRRP 默认行为等。
global_defs {
# 邮件告警接收列表
notification_email {
acassen@firewall.loc
sysadmin@firewall.loc
}
notification_email_from admin@example.com # 告警发送邮箱
smtp_server 192.168.200.1 # SMTP 服务器地址
smtp_connect_timeout 30 # 连接超时时间(秒)
# 节点及 VRRP 基础设置
router_id LVS_DEVEL # 当前节点唯一标识(集群内应不同)
vrrp_skip_check_adv_addr # 跳过 VRRP 通告地址检查,提升效率
vrrp_strict # 启用严格模式,遵循标准协议规范
vrrp_garp_interval 0 # ARP 报文发送间隔(0 表示默认)
vrrp_gna_interval 0 # 免费 ARP 发送间隔(支持毫秒级)
}
# 全局生效的组播地址设置
vrrp_mcast_group4 224.0.0.18 # IPv4 组播地址(需集群一致)
vrrp_mcast_group6 ff02::12 # IPv6 组播地址
# 进程调度优化
vrrp_priority 10 # 设置 VRRP 进程调度优先级(-20~19)
以上配置项可根据实际环境调整,例如关闭邮件通知或修改组播地址以适应特定网络策略。
VRRP守护进程(VRRPD)的配置主要涵盖两个关键部分:健康检查脚本与实例同步组,分别用于实现服务状态监测和多个VRRP实例之间的联动控制。
vrrp_script
vrrp_script <SCRIPT_NAME> {
script "/path/to/script.sh"
interval 1
timeout 3
weight -20
rise 2
fall 3
user root root
init_fail
}
vrrp_sync_group
通过同步组可将多个VRRP实例绑定为一个逻辑单元,确保主备切换时所有关联实例同步动作。
vrrp_sync_group VG_1 {
group {
VI_1
VI_2
}
}
vrrp_instance中定义的名称完全一致。此部分定义单个VRRP集群的基本参数,是实现IP地址漂移功能的核心配置项,包含角色设定、虚拟IP、认证机制等。
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200/24
192.168.1.201/24
}
nopreempt
preempt_delay 5
track_script {
check_nginx
}
notify_master /opt/to_master.sh
notify_backup /opt/to_backup.sh
smtp_alert
}
ip addr命令查看可用网卡。该模块集成LVS负载均衡能力,用于定义虚拟服务的IP地址、端口以及后端真实服务器(RS)的相关设置。
virtual_server 192.168.1.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR # 转发模式(推荐使用DR模式,也可选NAT或TUN)
persistence_timeout 50 # 设置会话保持时长,单位为秒,HTTP服务通常设为50秒
protocol TCP # 指定协议类型,支持TCP、UDP和SCTP,此处使用TCP
# 配置后端真实服务器信息
real_server 192.168.1.100 80 {
weight 1 # 定义权重值,数值越大转发优先级越高,缺省为1
inhibit_on_failure # 当服务器检测失败时,将其权重置为0,而不是从集群中移除
notify_up /opt/rs_up.sh # 在服务器恢复正常后执行指定脚本
notify_down /opt/rs_down.sh # 当服务器故障时触发的脚本执行
# 健康检查策略配置(三选一:HTTP_GET、SSL_GET 或 TCP_CHECK)
HTTP_GET {
url {
path /index.html # 设定健康检查请求的URL路径
digest e93e7f6c # 页面内容摘要值,可通过genhash工具生成
status_code 200 # 期望返回的状态码,如200表示服务正常
}
connect_timeout 3 # 连接超时时间,单位为秒
nb_get_retry 3 # 请求失败后的重试次数
delay_before_retry 3 # 每次重试之间的间隔时间(秒)
}
}
# 备用服务器配置:当所有真实服务器均不可用时启用
sorry_server 192.168.1.250 80
sorry_server_inhibit # 启用备用服务器的故障抑制机制,避免其被误判为失效
/etc/keepalived/keepalived.conf
real_server 健康检查方式说明
HTTP_GET / SSL_GET:
适用于Web类服务,通过发送HTTP/HTTPS请求并验证响应来判断服务状态。其中SSL_GET用于加密的HTTPS服务检测,需确保能正确获取指定页面的内容与状态码。
TCP_CHECK:
适用于任意基于TCP的服务,仅检测目标IP和端口是否可连接,不涉及应用层内容。其参数结构与HTTP_GET相似,但不包含URL、digest等应用层相关配置。
# 示例:TCP_CHECK 的实际配置
real_server 192.168.1.101 80 {
weight 1
TCP_CHECK {
connect_ip 192.168.1.101 # 指定进行连通性检测的IP地址,默认为RS自身IP
connect_port 80 # 检测的目标端口,默认与RS端口一致
connect_timeout 3 # 连接超时时间(秒)
retry 3 # 最大重试次数
delay_before_retry 3 # 重试前等待的时间间隔(秒)
}
}
扫码加好友,拉您进群



收藏
