keepalived安装配置详解
-------------------------------------------------------------------------------
Keepalived、LVS、Nginx 三者结合可构建 “高可用 + 高性能 + 灵活七层处理” 的负载均衡架构,广泛用于高并发业务场景(如电商、支付系统)。三者分工明确:
- LVS:作为四层(TCP/UDP)负载均衡器,负责高性能流量分发(基于内核态,支持百万级并发);
- Nginx:作为七层(HTTP/HTTPS)负载均衡器,负责复杂路由(如域名、URL 匹配)、缓存、SSL 卸载等;
- Keepalived:提供高可用保障,通过 VRRP 实现 LVS/Nginx 节点的故障自动转移,避免单点故障。
一、典型架构设计
常见架构为 “LVS 四层负载 + Nginx 七层负载 + Keepalived 高可用”,整体分为三层:
-
接入层(VIP + Keepalived):
- 两台节点(MASTER/BACKUP)部署 Keepalived,共享一个虚拟 IP(VIP),作为用户访问的唯一入口;
- Keepalived 监控 LVS 和 Nginx 状态,故障时自动将 VIP 漂移到健康节点。
-
四层负载层(LVS):
- 部署在 Keepalived 节点上,通过 LVS-DR(直接路由)模式分发流量(性能最优),将请求转发到后端 Nginx 集群;
- 采用轮询(rr)或加权轮询(wrr)算法,基于源 IP 或端口实现简单负载均衡。
-
七层负载层(Nginx):
- 接收 LVS 转发的流量,基于 HTTP 协议特性(如域名、路径、Cookie)进行精细化路由;
- 后端对接应用服务器(如 Tomcat、Node.js),并提供缓存、压缩、SSL 终止等功能。
二、组件协同流程
- 用户通过 VIP 访问服务,请求首先到达持有 VIP 的 MASTER 节点(由 Keepalived 管理);
- MASTER 节点的 LVS 接收请求,根据预设算法(如 rr)将流量转发到后端 Nginx 节点;
- Nginx 对请求进行七层处理(如路径匹配),转发到对应的应用服务器;
- 若 MASTER 节点故障(如 LVS 崩溃、Nginx 宕机),Keepalived 检测到异常后,触发 VIP 漂移到 BACKUP 节点,由 BACKUP 接管服务,整个过程用户无感知。
三、具体配置步骤
1. 环境规划(示例)
节点角色 | IP 地址 | 部署组件 | 说明 |
---|---|---|---|
MASTER | 192.168.1.100 | Keepalived + LVS + Nginx | 主节点,初始持有 VIP |
BACKUP | 192.168.1.101 | Keepalived + LVS + Nginx | 备用节点,故障时接管 VIP |
VIP | 192.168.1.200 | - | 对外服务的虚拟 IP |
Nginx 节点 1 | 192.168.1.102 | Nginx | 后端七层负载节点 |
Nginx 节点 2 | 192.168.1.103 | Nginx | 后端七层负载节点 |
2. 安装组件(所有节点)
bash
# 安装 Keepalived、LVS 工具、Nginx
yum install -y keepalived ipvsadm nginx
systemctl enable --now keepalived nginx # 启动并设置开机自启
3. 配置 LVS(MASTER 和 BACKUP 节点)
LVS 采用 DR 模式(直接路由),避免流量回环,需在 LVS 节点和 Nginx 节点分别配置。
(1)LVS 节点配置(MASTER/BACKUP)
bash
# 临时配置 LVS 规则(MASTER 和 BACKUP 需一致)
ipvsadm -A -t 192.168.1.200:80 -s rr # 添加虚拟服务(VIP:80),采用轮询算法
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.102:80 -g # 添加后端 Nginx 节点1(DR模式)
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.103:80 -g # 添加后端 Nginx 节点2(DR模式)
# 保存配置(永久生效)
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm # 启动 LVS 服务
(2)Nginx 节点配置(192.168.1.102/103)
DR 模式下,Nginx 节点需绑定 VIP(仅用于接收 LVS 转发的流量,不响应 ARP 广播):
bash
# 创建 VIP 绑定脚本
cat > /etc/init.d/bind_vip.sh << 'EOF'
#!/bin/bash
VIP=192.168.1.200
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP # 绑定 VIP 到回环接口
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p > /dev/null 2>&1
EOF
# 执行脚本并设置开机自启
chmod +x /etc/init.d/bind_vip.sh
/etc/init.d/bind_vip.sh
echo "/etc/init.d/bind_vip.sh" >> /etc/rc.local
chmod +x /etc/rc.local
4. 配置 Nginx(192.168.1.102/103)
Nginx 作为七层负载均衡,转发请求到应用服务器(示例:转发到 2 台 Tomcat):
nginx
# /etc/nginx/nginx.conf
http {
upstream app_servers {
server 192.168.1.201:8080; # 应用服务器1
server 192.168.1.202:8080; # 应用服务器2
keepalive 32; # 长连接优化
}
server {
listen 80;
server_name example.com; # 绑定域名
location / {
proxy_pass http://app_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
重启 Nginx:
systemctl restart nginx
5. 配置 Keepalived(实现 LVS/Nginx 高可用)
(1)MASTER 节点(192.168.1.100)配置
conf
# /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_MASTER
}
# 健康检查脚本:监控 LVS 和 Nginx 状态
vrrp_script check_lvs_nginx {
script "/etc/keepalived/check_service.sh" # 自定义检查脚本
interval 2 # 检查间隔(秒)
weight -20 # 检查失败时,优先级降低 20
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # 绑定的网卡
virtual_router_id 51
priority 100 # 优先级高于 BACKUP
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200/24 dev eth0 label eth0:0 # VIP
}
track_script {
check_lvs_nginx # 关联健康检查脚本
}
}
(2)BACKUP 节点(192.168.1.101)配置
与 MASTER 基本一致,仅修改
router_id
和 priority
:conf
global_defs {
router_id LVS_BACKUP
}
# 健康检查脚本与 MASTER 相同
vrrp_script check_lvs_nginx {
script "/etc/keepalived/check_service.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90 # 优先级低于 MASTER
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200/24 dev eth0 label eth0:0
}
track_script {
check_lvs_nginx
}
}
(3)健康检查脚本(/etc/keepalived/check_service.sh
)
bash
#!/bin/bash
# 检查 LVS 服务是否运行
if ! ipvsadm -Ln &> /dev/null; then
exit 1 # LVS 故障,返回非 0 触发优先级降低
fi
# 检查 Nginx 服务是否运行
if ! ps -C nginx &> /dev/null; then
systemctl restart nginx # 尝试重启 Nginx
sleep 2
if ! ps -C nginx &> /dev/null; then
exit 1 # 重启失败,返回非 0
fi
fi
exit 0 # 健康状态
赋予执行权限:
chmod +x /etc/keepalived/check_service.sh
6. 重启服务并验证
bash
# 重启 Keepalived 使配置生效
systemctl restart keepalived
# 验证 VIP 绑定(MASTER 节点应持有 VIP)
ip addr show eth0 | grep 192.168.1.200
# 验证 LVS 规则
ipvsadm -Ln # 应显示后端 Nginx 节点
# 测试故障转移:停止 MASTER 节点的 Keepalived,检查 BACKUP 节点是否接管 VIP
systemctl stop keepalived # 在 MASTER 执行
ip addr show eth0 | grep 192.168.1.200 # 在 BACKUP 节点检查
四、架构优势与注意事项
优势
- 高性能:LVS 工作在内核态,处理能力远超 Nginx,适合高并发场景;
- 高可用:Keepalived 实现 VIP 漂移,避免单点故障,故障转移时间 < 1 秒;
- 灵活扩展:Nginx 处理七层路由,支持复杂业务规则(如灰度发布、路径转发);
- 可扩展性:后端 Nginx 和应用服务器可横向扩容,应对流量增长。
注意事项
- 网络配置:LVS-DR 模式要求所有节点在同一局域网,且 VIP 需绑定到 Nginx 节点的回环接口;
- 配置一致性:MASTER 和 BACKUP 节点的 LVS 规则、Keepalived 认证信息必须完全一致;
- 健康检查:脚本需覆盖关键服务(LVS、Nginx),避免 “假活” 状态(如进程存在但端口不可用);
- ARP 抑制:Nginx 节点需配置 ARP 忽略 / 公告参数,防止 VIP 地址冲突。
总结
Keepalived + LVS + Nginx 组合兼顾了性能、灵活性和高可用性,是企业级负载均衡架构的经典方案。通过 LVS 处理四层流量分发,Nginx 实现七层精细化控制,Keepalived 保障整体可用性,可支撑百万级并发场景,适合对稳定性和性能要求极高的业务。
-------------------------------------------------------------------------------
Keepalived 是一款基于 VRRP(虚拟路由冗余协议)的高可用解决方案,主要用于实现服务器的故障自动转移,确保服务持续可用。它常与 LVS、Nginx 等配合,构建高可用集群。以下是详细的安装与配置步骤:
一、安装 Keepalived
1. 环境说明
- 操作系统:CentOS 7/8 或 Ubuntu 20.04/22.04(以 CentOS 7 和 Ubuntu 为例)
- 节点规划(示例):
- MASTER 节点:192.168.1.100(主节点,优先级更高)
- BACKUP 节点:192.168.1.101(备用节点,优先级较低)
- 虚拟 IP(VIP):192.168.1.200(对外提供服务的统一 IP)
2. 安装步骤
(1)CentOS 系统
bash
# 安装依赖(如需编译安装)
yum install -y gcc openssl-devel libnl3-devel net-snmp-devel
# 直接通过 yum 安装(推荐)
yum install -y keepalived
# 启动并设置开机自启
systemctl start keepalived
systemctl enable keepalived
(2)Ubuntu 系统
bash
# 更新软件源
apt update
# 安装 keepalived
apt install -y keepalived
# 启动并设置开机自启
systemctl start keepalived
systemctl enable keepalived
二、核心配置文件解析
Keepalived 的主配置文件为
/etc/keepalived/keepalived.conf
,主要包含 3 部分:global_defs
(全局配置)、vrrp_instance
(VRRP 实例配置)、virtual_server
(虚拟服务器配置,可选)。1. 基础配置示例(MASTER 节点)
conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id LVS_MASTER # 节点标识(唯一,如 LVS_MASTER/LVS_BACKUP)
script_user root # 脚本执行用户
enable_script_security # 启用脚本安全检查
}
# VRRP 实例配置(定义一个高可用组)
vrrp_instance VI_1 {
state MASTER # 节点角色(MASTER/BACKUP)
interface eth0 # 绑定的网卡(通过 ifconfig 查看实际网卡名)
virtual_router_id 51 # 虚拟路由 ID(0-255,同一集群需一致)
priority 100 # 优先级(MASTER 需高于 BACKUP,如 100 vs 90)
advert_int 1 # 心跳间隔(秒,MASTER 向 BACKUP 发送通告的频率)
# 认证配置(同一集群需一致)
authentication {
auth_type PASS # 认证方式(PASS 或 AH)
auth_pass 1111 # 认证密码(仅前 8 位有效)
}
# 虚拟 IP(VIP),可配置多个
virtual_ipaddress {
192.168.1.200/24 dev eth0 label eth0:0 # VIP 及子网掩码
}
# (可选)状态切换时执行的脚本(如通知、日志记录)
notify_master "/etc/keepalived/notify.sh master" # 成为主节点时执行
notify_backup "/etc/keepalived/notify.sh backup" # 成为备用节点时执行
notify_fault "/etc/keepalived/notify.sh fault" # 故障时执行
}
# (可选)虚拟服务器配置(如需结合 LVS 负载均衡)
# virtual_server 192.168.1.200 80 {
# delay_loop 6 # 健康检查间隔(秒)
# lb_algo rr # 负载均衡算法(rr 轮询、wrr 加权轮询等)
# lb_kind DR # 转发模式(DR/NAT/TUN)
# persistence_timeout 50 # 会话保持时间(秒)
# protocol TCP # 协议
# # 后端真实服务器
# real_server 192.168.1.102 80 {
# weight 1 # 权重(越高优先被分配)
# TCP_CHECK {
# connect_port 80 # 检查端口
# connect_timeout 3 # 连接超时(秒)
# retry 3 # 重试次数
# delay_before_retry 3 # 重试间隔(秒)
# }
# }
# }
2. BACKUP 节点配置(与 MASTER 对比)
仅需修改以下参数,其余配置与 MASTER 保持一致:
conf
global_defs {
router_id LVS_BACKUP # 节点标识改为 LVS_BACKUP
}
vrrp_instance VI_1 {
state BACKUP # 角色改为 BACKUP
priority 90 # 优先级低于 MASTER(如 90)
# 其他参数(virtual_router_id、authentication 等)必须与 MASTER 一致
}
三、关键配置项说明
-
global_defs
:router_id
:节点唯一标识,用于区分不同节点。script_user
:执行脚本的用户(通常为 root)。
-
vrrp_instance
:state
:角色(MASTER 或 BACKUP),但实际角色由priority
决定(优先级高的为 MASTER)。interface
:必须与节点实际网卡名一致(如 eth0、ens33),可通过ip addr
查看。virtual_router_id
:同一高可用集群的节点必须相同(0-255)。priority
:MASTER 优先级需高于 BACKUP(如 100 vs 90),故障恢复后 MASTER 会抢占 VIP(可通过nopreempt
关闭抢占)。advert_int
:心跳间隔,默认 1 秒,MASTER 定期发送心跳包告知存活状态。authentication
:集群内节点通信的认证方式,auth_pass
两端必须一致。virtual_ipaddress
:虚拟 IP(VIP),客户端通过此 IP 访问服务,故障时会自动漂移到健康节点。
四、状态切换脚本(可选)
当节点角色切换时(如 MASTER 故障变为 BACKUP),可通过脚本执行通知(如发送邮件、记录日志)。示例脚本
/etc/keepalived/notify.sh
:bash
#!/bin/bash
# 状态切换通知脚本
VIP=192.168.1.200
LOG_FILE=/var/log/keepalived_notify.log
# 记录日志
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 状态切换为: $1, VIP: $VIP" >> $LOG_FILE
# 发送邮件通知(需安装 mailutils 或 postfix)
# echo "Keepalived 状态切换为 $1,VIP: $VIP" | mail -s "Keepalived 状态通知" admin@example.com
赋予脚本执行权限:
bash
chmod +x /etc/keepalived/notify.sh
五、防火墙与 SELinux 配置
-
开放 VRRP 协议(必做):VRRP 使用组播通信(224.0.0.18),需允许相关流量:bash
# CentOS 7(firewalld) firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept' firewall-cmd --reload # Ubuntu(ufw) ufw allow proto vrrp from any to any
-
关闭 SELinux(可选,避免权限问题):bash
setenforce 0 # 临时关闭 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久关闭(需重启)
六、验证与测试
1. 查看服务状态
bash
systemctl status keepalived # 检查服务是否正常运行
2. 验证 VIP 分配
- MASTER 节点应绑定 VIP:
bash
ip addr show eth0 # 查看是否有 192.168.1.200
inet 192.168.1.200/24 scope global secondary eth0:0
3. 故障转移测试
- 手动停止 MASTER 节点的 keepalived 服务:
bash
systemctl stop keepalived
- 在 BACKUP 节点查看 VIP 是否漂移:
bash
ip addr show eth0 # 此时 192.168.1.200 应出现在 BACKUP 节点
- 恢复 MASTER 节点服务后,VIP 会自动漂移回(默认开启抢占模式):
bash
systemctl start keepalived
七、常见问题排查
-
VIP 未漂移:
- 检查
virtual_router_id
、authentication
是否在集群内一致。 - 确认防火墙是否开放 VRRP 协议。
- 查看日志:
tail -f /var/log/messages
(CentOS)或tail -f /var/log/syslog
(Ubuntu)。
- 检查
-
服务启动失败:
- 检查配置文件语法错误:
keepalived -t -f /etc/keepalived/keepalived.conf
。 - 确认网卡名(
interface
)是否正确。
- 检查配置文件语法错误:
-
抢占模式问题:
- 若希望 MASTER 恢复后不抢占 VIP(避免业务中断),可在
vrrp_instance
中添加nopreempt
(仅对 BACKUP 节点有效)。
- 若希望 MASTER 恢复后不抢占 VIP(避免业务中断),可在
总结
Keepalived 通过 VRRP 协议实现 VIP 漂移,核心是配置一致的虚拟路由 ID、认证信息,以及合理的优先级。结合状态切换脚本和健康检查,可构建稳定的高可用集群。实际使用中需根据业务场景(如是否结合 LVS)调整
virtual_server
配置。-------------------------------------------------------------------------------
Keepalived 是一款基于 VRRP(虚拟路由冗余协议)的高可用解决方案,其架构设计围绕 “高可用冗余” 和 “服务健康检查” 两大核心目标,通过模块化设计实现灵活、可靠的集群管理。以下从整体架构、核心模块、工作流程及扩展能力四个维度解析其设计逻辑。
一、整体架构概述
Keepalived 的架构采用 分层模块化设计,核心目标是实现 “虚拟 IP(VIP)漂移” 和 “服务健康监控”,确保当主节点故障时,备用节点能自动接管服务。其整体架构可概括为:“核心控制层 + 协议实现层 + 健康检查层 + 扩展接口层”
各层职责如下:
- 核心控制层:负责全局配置解析、模块调度和状态管理;
- 协议实现层:基于 VRRP 协议实现节点冗余和 VIP 管理;
- 健康检查层:监控后端服务 / 节点的可用性,触发故障转移;
- 扩展接口层:通过脚本或插件支持自定义逻辑(如通知、复杂检查)。
二、核心模块详解
Keepalived 由三个核心模块构成,各模块独立封装且通过内部接口协同工作:
1. 核心组件(Core Module)
作用:作为整个系统的 “大脑”,负责全局初始化、配置解析、模块协调和信号处理。
- 配置解析:读取
/etc/keepalived/keepalived.conf
,解析全局参数(global_defs
)、VRRP 实例(vrrp_instance
)、虚拟服务器(virtual_server
)等配置,转化为内存数据结构; - 模块调度:启动并管理 VRRP 模块和健康检查模块,协调两者的状态交互(如健康检查失败时通知 VRRP 模块触发切换);
- 信号处理:响应外部信号(如
SIGTERM
终止信号、SIGHUP
重载配置信号),执行对应操作(如重启服务、重新加载配置)。
2. VRRP 协议模块(VRRP Module)
作用:基于 VRRP 协议实现节点冗余和 VIP 漂移,是高可用的核心载体。
- VRRP 实例管理:每个
vrrp_instance
对应一个独立的虚拟路由集群(可配置多个实例,实现多组服务冗余)。实例包含节点角色(MASTER/BACKUP)、优先级、心跳间隔、认证信息等参数; - 状态选举机制:
- MASTER 节点定期(
advert_int
间隔)发送 VRRP 通告报文(组播地址224.0.0.18
),告知自身存活状态; - BACKUP 节点若在超时时间内未收到 MASTER 报文,触发选举:优先级最高的节点成为新 MASTER,绑定 VIP 并接管服务;
- MASTER 节点定期(
- VIP 管理:MASTER 节点通过
ip addr
命令将 VIP 绑定到指定网卡(如eth0:0
),BACKUP 节点不绑定 VIP;当角色切换时,自动添加 / 删除 VIP 绑定; - 抢占模式控制:支持 “抢占”(默认)和 “非抢占”(
nopreempt
配置)模式。非抢占模式下,故障恢复的原 MASTER 不会抢回 VIP,避免业务中断。
3. 健康检查模块(Check Module)
作用:监控后端服务(如 Nginx、MySQL)或节点的可用性,为 VRRP 模块提供故障判断依据。
- 检查方式:支持多种灵活的健康检查机制:
- TCP 检查:通过建立 TCP 连接检测端口是否存活(如检查 80 端口);
- HTTP/HTTPS 检查:发送 HTTP 请求并验证响应码(如
200 OK
); - 脚本检查:执行自定义脚本(如
check_nginx.sh
),通过脚本退出码(0 为健康,非 0 为故障)判断状态; - SMTP/PING 检查:针对邮件服务或节点网络连通性的专用检查;
- 故障处理:若检查到服务故障,健康检查模块会通知 VRRP 模块:
- 若当前节点是 MASTER,可主动降低自身优先级(
weight
配置),触发 VIP 漂移; - 若配合 LVS,会从负载均衡列表中移除故障节点。
- 若当前节点是 MASTER,可主动降低自身优先级(
三、模块间交互流程
Keepalived 各模块通过 “事件驱动” 机制协同工作,典型流程如下:
-
初始化阶段:
- Core 模块解析配置文件,初始化 VRRP 实例和健康检查规则;
- VRRP 模块根据优先级选举 MASTER/BACKUP 角色,MASTER 绑定 VIP;
- 健康检查模块启动对后端服务的监控。
-
正常运行阶段:
- MASTER 节点的 VRRP 模块定期发送心跳报文;
- 健康检查模块持续监控服务,若正常则不干预;
- BACKUP 节点监听 MASTER 心跳,维持备用状态。
-
故障发生阶段:
- 场景 1:MASTER 节点故障(如宕机):
- 场景 2:MASTER 节点服务故障(如 Nginx 崩溃):
- 场景 1:MASTER 节点故障(如宕机):
-
故障恢复阶段:
- 原 MASTER 节点恢复后,若为 “抢占模式”,会因优先级更高重新成为 MASTER 并夺回 VIP;
- 若为 “非抢占模式”,原 MASTER 作为 BACKUP 运行,不干扰当前 MASTER。
四、与外部组件的集成设计
Keepalived 并非孤立运行,其架构设计预留了与其他组件的集成接口,常见场景包括:
-
与 LVS(Linux Virtual Server)集成:Keepalived 最初为 LVS 设计,通过
virtual_server
配置管理 LVS 负载均衡规则。健康检查模块检测到后端 Real Server 故障时,会自动从 LVS 集群中移除该节点,避免流量分配到故障节点。 -
与 Nginx/HAProxy 集成:通过脚本检查(如
pidof nginx
)监控反向代理服务状态,当 Nginx 故障时,触发 Keepalived 状态切换,确保 VIP 漂移到正常节点的 Nginx 服务。 -
与云平台 / 容器集成:支持通过自定义脚本调用云平台 API(如 AWS EC2、阿里云 ECS),实现跨主机 / 跨区域的 VIP 管理(如修改路由表指向健康节点)。
五、架构优势
- 轻量级:C 语言开发,无依赖,资源占用低(内存通常 < 10MB);
- 高可靠:模块化设计降低耦合,单一模块故障不影响整体;
- 灵活性:支持多实例、多 VIP、自定义检查脚本,适应复杂场景;
- 快速切换:基于 VRRP 协议,故障转移时间通常 < 1 秒(取决于
advert_int
配置)。
总结
Keepalived 的架构以 “VRRP 协议为核心、健康检查为依据、模块化设计为支撑”,通过简洁高效的模块协作实现服务高可用。其设计既保证了基础冗余能力的稳定性,又通过扩展接口满足了复杂业务场景的需求,是中小规模高可用集群的优选方案。
-------------------------------------------------------------------------------