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

参考

相关推荐
金銀銅鐵7 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
念何架构之路8 小时前
go-grpc设计思想
开发语言·后端·golang
system_error_x8 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
步行cgn10 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
码事漫谈11 小时前
AI 读你的提示词,其实很没耐心
后端
用户83562907805111 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我1234512 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
IT_陈寒12 小时前
Java性能优化完全指南
前端·人工智能·后端
电子IT笔记12 小时前
对接群晖NAS,上传和删除踩坑记录
前端·后端
Mk5987812 小时前
P4:把 Agent 的记忆搬进 Redis —— AgentScope-Java 工程化实战
后端