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

参考

相关推荐
终身学习基地1 小时前
第二篇:go包管理
开发语言·后端·golang
图南随笔2 小时前
Spring Boot(二十一):RedisTemplate的String和Hash类型操作
java·spring boot·redis·后端·缓存
吃饭了呀呀呀2 小时前
🐳 《Android》 安卓开发教程 - 三级地区联动
android·java·后端
shengjk12 小时前
SparkSQL Join的源码分析
后端
Linux编程用C2 小时前
Rust编程学习(一): 变量与数据类型
开发语言·后端·rust
uhakadotcom2 小时前
一文读懂DSP(需求方平台):程序化广告投放的核心基础与实战案例
后端·面试·github
吴生43963 小时前
数据库ALGORITHM = INSTANT 特性研究过程
后端
程序猿chen3 小时前
JVM考古现场(十九):量子封神·用鸿蒙编译器重铸天道法则
java·jvm·git·后端·程序人生·java-ee·restful
Chandler243 小时前
Go:接口
开发语言·后端·golang