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 小时前
SpringBoot 集成滑块验证码AJ-Captcha行为验证码 Redis分布式 接口限流 防爬虫
java·spring boot·redis·分布式·后端·爬虫·tomcat
野犬寒鸦4 小时前
MySQL索引使用规则详解:从设计到优化的完整指南
java·数据库·后端·sql·mysql
思考的橙子4 小时前
Springboot之会话技术
java·spring boot·后端
兆。7 小时前
电子商城后台管理平台-Flask Vue项目开发
前端·vue.js·后端·python·flask
weixin_437398217 小时前
RabbitMQ深入学习
java·分布式·后端·spring·spring cloud·微服务·rabbitmq
西京刀客12 小时前
Go多服务项目结构优化:为何每个服务单独设置internal目录?
开发语言·后端·golang
李匠202412 小时前
C++GO语言微服务之gorm框架操作MySQL
开发语言·c++·后端·golang
源码云商13 小时前
基于Spring Boot + Vue的高校心理教育辅导系统
java·spring boot·后端
黄俊懿14 小时前
【深入理解SpringCloud微服务】手写实现一个微服务分布式事务组件
java·分布式·后端·spring·spring cloud·微服务·架构师
Themberfue14 小时前
RabbitMQ ②-工作模式
开发语言·分布式·后端·rabbitmq