Keepalived 服务指南
一、理论知识 & 功能介绍
1. 什么是 Keepalived?
Keepalived 是一个基于 VRRP (Virtual Router Redundancy Protocol, 虚拟路由器冗余协议) 实现的高可用性软件。它主要用于提供服务的故障切换 (Failover) 功能,确保当主服务器发生故障时,备用服务器能够自动接管服务,从而最大限度地减少服务中断时间,提高系统的可用性。
2. 核心功能
- VRRP 实现: 管理虚拟 IP 地址 (Virtual IP, VIP)。多个节点组成一个 VRRP 组,共同虚拟出一个 VIP。其中一个节点作为 Master(主节点),持有并对外宣告该 VIP;其他节点作为 Backup(备节点)监听 Master 的状态。当 Master 失效时,优先级最高的 Backup 会接管 VIP 成为新的 Master。
- 健康检查 (Health Checking): Keepalived 可以监控本地系统或网络服务的状态(例如检查进程是否存在、端口是否可访问、执行自定义脚本等)。如果健康检查失败,Keepalived 可以主动降低自身在 VRRP 组中的优先级,触发主备切换。
- 负载均衡 (Load Balancing): 通过与 LVS (Linux Virtual Server) 集成,Keepalived 也可以作为 LVS 集群的负载均衡器控制节点,管理后端真实服务器的状态。
3. 典型应用场景
- Web 服务器高可用 (如 Nginx, Apache)
- 数据库高可用 (如 MySQL 主从切换)
- 其他需要 VIP 和故障切换的关键服务
二、安装 Keepalived (OpenEuler 下使用 yum)
-
更新软件包索引:
bashsudo yum makecache -
安装 Keepalived:
bashsudo yum install keepalived -
验证安装:
bashkeepalived --version输出类似
Keepalived v2.2.7 (05/22,2023)表示安装成功。 -
设置开机启动 (可选,但推荐):
bashsudo systemctl enable keepalived
三、配置 Keepalived
Keepalived 的主配置文件是 /etc/keepalived/keepalived.conf。配置主要分为两部分:全局定义 (global_defs) 和 VRRP 实例 (vrrp_instance)。以下是一个基本的配置示例,实现一个包含两个节点 (Master 和 Backup) 的 VRRP 组,并监控本地 Nginx 服务。
示例配置 (Master 节点 - 假设 IP: 192.168.1.10):
bash
! Configuration File for keepalived
global_defs {
notification_email {
admin@example.com # 通知邮件接收地址
}
notification_email_from keepalived@example.com # 发件人
smtp_server smtp.example.com # SMTP 服务器
smtp_connect_timeout 30 # SMTP 连接超时
router_id node_master # 本节点标识,需唯一
}
# 定义一个 VRRP 实例,名称是 VI_1
vrrp_instance VI_1 {
state MASTER # 初始状态,本节点是 MASTER
interface ens33 # 绑定 VIP 的网络接口名 (使用 ip addr 查看)
virtual_router_id 51 # 虚拟路由 ID,同一组需相同 (0-255)
priority 100 # 优先级,MASTER 应高于 BACKUP (如 100 > 90)
advert_int 1 # VRRP 通告间隔 (秒)
# 认证信息,同一组需相同
authentication {
auth_type PASS
auth_pass mypassword # 密码,建议复杂
}
# 定义要管理的虚拟 IP (VIP)
virtual_ipaddress {
192.168.1.100/24 # VIP,子网掩码需匹配
}
# 健康检查 - 监控 Nginx 进程
track_script {
chk_nginx
}
}
# 定义健康检查脚本
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 自定义脚本路径
interval 2 # 检查间隔 (秒)
weight -20 # 检查失败时,优先级降低的值 (可能导致切换)
fall 2 # 连续失败几次认为服务 down
rise 2 # 连续成功几次认为服务 up
}
示例配置 (Backup 节点 - 假设 IP: 192.168.1.11): 与 Master 节点配置类似,主要修改 state 和 priority:
bash
global_defs {
router_id node_backup # 修改为唯一标识
... (其他 global_defs 配置)
}
vrrp_instance VI_1 {
state BACKUP # 初始状态为 BACKUP
... (其他配置,interface, virtual_router_id, authentication, virtual_ipaddress 必须与 MASTER 一致)
priority 90 # 优先级低于 MASTER
... (其他配置)
track_script {
chk_nginx
}
}
vrrp_script chk_nginx { ... } # 与 MASTER 相同
Nginx 健康检查脚本 (/etc/keepalived/check_nginx.sh):
bash
#!/bin/bash
# 检查 Nginx 主进程是否在运行
if ! pgrep -x "nginx" > /dev/null; then
exit 1 # 状态异常,返回非0
fi
exit 0 # 状态正常,返回0
重要步骤:
-
将上述配置分别保存到两台服务器的
/etc/keepalived/keepalived.conf文件中。 -
创建健康检查脚本
/etc/keepalived/check_nginx.sh,并赋予可执行权限:bashsudo chmod +x /etc/keepalived/check_nginx.sh -
确保脚本逻辑正确! 此脚本仅检查
nginx进程名,实际应用中可能需要更健壮的检查(如检查端口)。 -
确保防火墙允许 VRRP 协议通信 (通常使用 IP 协议号 112 ) 和组播通信。OpenEuler 防火墙 (
firewalld) 可能需要添加规则:bashsudo firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept' # 允许 VRRP 协议 sudo firewall-cmd --reload -
确保
interface配置项的值 (ens33) 与服务器上的实际网卡名称一致 (使用ip addr命令查看)。
四、启动与验证
-
启动 Keepalived 服务 (两台服务器):
bashsudo systemctl start keepalived -
检查服务状态:
bashsudo systemctl status keepalived查看是否运行正常 (
active (running))。 -
检查 VIP 绑定 (在 Master 节点):
baship addr show ens33 # 替换为你的网卡名输出中应该能看到类似
192.168.1.100/24的 IP 地址绑定在ens33上。 -
模拟故障测试:
- 停止 Master 节点的 Keepalived 服务 (
sudo systemctl stop keepalived) 或 Nginx 服务 (如果配置了健康检查)。 - 观察 Backup 节点的
ip addr show ens33,VIP 应该会转移到 Backup 节点。 - 恢复 Master 节点服务,VIP 应自动切回 (因为 Master 优先级更高)。
- 停止 Master 节点的 Keepalived 服务 (
五、注意事项
- 脑裂 (Split-Brain): 网络分区可能导致多个节点都认为自己是 Master。配置
unicast_peer(单播通信) 或确保网络质量可以减少此风险。 - 脚本权限与路径: 确保健康检查脚本路径正确且可执行。
- 防火墙: VRRP 通信必须畅通。
- 日志: Keepalived 日志通常位于
/var/log/messages或通过journalctl -u keepalived查看,是故障排查的重要依据。 - 虚拟路由 ID (
virtual_router_id): 同一局域网内不同的 VRRP 组必须使用不同的 ID。