Keepalived 是 VRRP(虚拟路由器冗余协议)协议的 Linux 实现,旨在使 IP 具有高可用性 - 即所谓的 VIP(虚拟 IP)。
此外,守护程序还能够使用"Linux 虚拟服务器"(IPVS) 提供负载平衡机制。
在这篇博文中,我将介绍一个几乎未被记录的功能:检查脚本和通知脚本。 这些脚本可用于定期检查您想要的任何内容,以确保 VRRP 主节点位于正确的节点上,并在状态发生变化时采取措施。
1. VRRP 的工作原理
通常,VRRP 协议确保参与节点之一为 master。备份节点侦听来自优先级较高的节点的多播数据包。
如果备份节点在超过广播计时器三倍的时间内无法接收 VRRP 播发,则备份节点将采用主状态并将配置的 IP 分配给自身。
如果有多个具有相同优先级的备份节点,则 IP 最高的备份节点将赢得选举。
没有可用的屏蔽机制。如果两个参与节点看不到彼此,则两者都将具有主状态,并且都将携带相同的 IP。
当我在寻找一种方法来检测哪个应该保持 master 或放弃他的 master 状态时,我发现了"Check Script"(检查脚本)机制。
2. Check Script
检查脚本是用您选择的语言编写的脚本,会定期执行。此脚本需要有一个返回值:
- 0 表示 "一切都很好"
- 1(或不是 0)表示 "something went wrong"
脚本的定义如下:
vrrp_script chk_myscript { script "/usr/local/bin/mycheckscript.sh" interval 2 # check every 2 seconds fall 2 # require 2 failures for KO rise 2 # require 2 successes for OK }
如您在示例中所见,可以指定间隔(以秒为单位),也可以指定脚本在执行任何动作之前需要成功或失败的次数。
该脚本可以检查您想要的任何内容。以下是一些想法:
-
守护程序 X 是否正在运行?
-
远程开关 Y 上的接口 X 是否打开?
-
8.8.8.8 这个 IP 地址是可以 ping 通的吗?
-
是否有足够的磁盘空间来运行我的应用程序?
此脚本定义现在可以在 vrrp_instance 中使用:
bash
vrrp_instance MyVRRPInstance {
state MASTER
interface eth0
virtual_router_id 5
priority 200
advert_int 1
virtual_ipaddress {
192.168.1.1/32 dev eth0
}
track_script {
chk_myscript
}
}
一旦 track_script 返回 2 次 0 以外的其他代码:
- VRRP 实例就会将状态更改为 FAULT,
- 从 eth0 中删除 IP 192.168.1.1 并停止发送多播 VRRP 数据包。
3. Notify Script
通知脚本可用于执行其他作,而不仅仅是删除 IP 或将 IP 添加到接口。
It can f.e. start or stop a daemon, depending on the VRRP state. And this is how it's defined in the Keepalived configuration:
例如,它可以启动或停止守护进程,具体取决于 VRRP 状态。这是它在 Keepalived 配置中的定义方式:
bash
vrrp_instance MyVRRPInstance {
[...]
notify /usr/local/bin/keepalivednotify.sh
}
在任何状态更改后,使用以下参数调用该脚本:
-
$1 = "GROUP" or "INSTANCE"
-
$2 = name of group or instance
-
$3 = target state of transition ("MASTER", "BACKUP", "FAULT")
转换的目标状态("MASTER"、"BACKUP"、"FAULT")
下面是一个示例脚本:
bash
#!/bin/bash
TYPE=$1
NAME=$2
STATE=$3
case $STATE in
"MASTER") /etc/init.d/apache2 start
exit 0
;;
"BACKUP") /etc/init.d/apache2 stop
exit 0
;;
"FAULT") /etc/init.d/apache2 stop
exit 0
;;
*) echo "unknown state"
exit 1
;;
esac
使用这些通知脚本的一个示例是拥有高可用性 IPsec 网关(启动和停止 IPsec 进程)。我们正在 nine.ch 客户 IPSec 终端节点成功使用它。
参考
-
1: www.keepalived.org/ "Keepalived website"