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

参考

相关推荐
吴佳浩3 小时前
Python入门指南(六) - 搭建你的第一个YOLO检测API
人工智能·后端·python
踏浪无痕4 小时前
JobFlow已开源:面向业务中台的轻量级分布式调度引擎 — 支持动态分片与延时队列
后端·架构·开源
Pitayafruit4 小时前
Spring AI 进阶之路05:集成 MCP 协议实现工具调用
spring boot·后端·llm
ss2735 小时前
线程池:任务队列、工作线程与生命周期管理
java·后端
不像程序员的程序媛5 小时前
Spring的cacheEvict
java·后端·spring
踏浪无痕5 小时前
JobFlow 实战:无锁调度是怎么做到的
后端·面试·架构
shoubepatien5 小时前
JAVA -- 11
java·后端·intellij-idea
喵个咪6 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:kratos-bootstrap 入门教程(类比 Spring Boot)
后端·微服务·go
uzong6 小时前
从大厂毕业后,到小公司当管理,十年互联网老兵的思维习惯阶段复盘
后端
追逐时光者6 小时前
一个 WPF 开源、免费的 SVG 图像查看控件
后端·.net