目录
1、Introduce
keepalived是一个用于实现高可用性和负载均衡的开源软件。它提供了一种轻量级的方式来管理多个服务器,并确保它们在故障发生时继续正常工作。keepalived 通常用于构建高可用性的网络服务,如Web服务器、数据库服务器等。
下面以最简单的 Nginx 部署架构作业为例。下图中,44.101作为网关节点,当该节点出现故障后,整个系统都将无法提供服务,无法实现高可用。

为实现高可用,我们可以设置多台备用机,使用虚拟 IP 对外提供服务(使用 keepalived 实现),keepalived 负责维护 VIP 真实映射的 Nginx 服务器 IP。当正在被使用的 nginx 服务器出现故障时,keepalive 将会把 vip 重新映射到备机上,进行故障转移,对于使用 VIP 的用户而言是透明的。

2、基本使用
(1)安装
需要在实现高可用的 Nginx 服务器上都安装 KeepAlived。keepalived 程序可以实现进程级的检测,注意 keepalived 检测的是 keepalived 进程。具体解释可以参考 (3)使用教程。
Nginx 的安装存在两种方法:可以直接在线安装,例如 yum install keepalived;也可以从 Keepalived for Linux 下载源码后编译安装。
(2)配置文件
因为我是使用 yum 直接在线安装的,keepalived 的配置文件默认在 /etc/keepalived/keepalived.conf 下。我们需要在所有高可用节点内都进行配置。
下面只介绍最简单的必要配置,参数介绍详见注释。
bash
# 下面只介绍必要的配置选项
global_defs{
# 可自定义,每个节点需要不一样
router_id lb111
}
# 实例名可自定义
vrrp_instance test{
# 主节点只能有一个,从节点需要为 BACKUP
state MASTER
# 当前机器网卡,对外的
interface ens33
virtual_router_id 51
# 竞选时的优先级,备用机可以适当降低
priority 100
# 检测间隔时间
advert_int 1
# 认证,同组内要保持一致
authentication{
auth_type PASS
auth_pass 1111
}
# vip,虚拟 IP
virtual_ipaddress{
192.168.4.200
}
}
(3)使用教程
配置文件编辑好之后,可以使用 systemctl start keepalived 启动高可用服务。
如下图所示,启动后,使用 ip addr 可以在 mater 节点上查询到 vip,直接 ping vip 也是可以通的。



当 master 节点 down 掉之后,vip 会漂移到备用节点。此时 Vip 也是可以 ping 通的,对用户是透明的。

Keepalive 实现高可用,是通过检测互相的 keepalive 进程是否在线实现的,所以对于 nginx 进程不在线了,keepalive 仍在线的场景是无法检测出来的。这样场景需要自定义常驻的检测shell脚本,当检测到 nginx 进程不存在时,直接 kill 或 stop 掉 keepaliced 进程。

bash
#!/bin/bash
# 循环检测 nginx 服务是否存在
while true; do
# 检查 nginx 服务状态
nginx_status=$(systemctl is-active nginx.service)
# 如果 nginx 服务状态为 active,则表示 nginx 服务正在运行
if [ "$nginx_status" != "active" ]; then
echo "Nginx 服务未运行,停止 keepalived 服务"
# 停止 keepalived 服务
systemctl stop keepalived.service
break
fi
# 每秒钟检测一次
sleep 1
done