Keepalived 检查和通知脚本

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 终端节点成功使用它。

参考

相关推荐
报错小能手20 分钟前
Go 语言结构 基础语法
开发语言·后端·golang
暗黑小白21 分钟前
参数从哪来、何时来 —— 提取时机与平台化 Slot 管理
人工智能·后端·大模型·ai agent
程序员鱼皮1 小时前
DeepSeek Harness 最新邪修曝光!被吹成核弹的极简模式,真的夯吗?
前端·后端·ai编程
Gopher_HBo1 小时前
请求绑定与校验
后端
长栎1 小时前
你写的撤销功能,99% 是伪 Memento——Undo 不是存个备份那么简单
后端
笨鸟飞不快2 小时前
RocketMQ Lite Topic 流程梳理与设计解读
后端·rocketmq
步行cgn2 小时前
MyBatis 查询结果字段为 null?一文讲透下划线命名与驼峰映射问题
后端
技术长镜头2 小时前
别再只会“加索引”:从磁盘页到 B+Tree,彻底理解 MySQL 索引的设计与运行
后端·mysql
生锈的键盘2 小时前
gRPC 多路复用全链路拆解:从客户端到服务端,中间隔着 ELB 和 Nginx 到底是怎么玩的?
后端
laity172 小时前
python发光表白爱心(从零到一实现)
前端·后端