前面已经发过两篇Keepalived系列的文章了,今天这个系列再发最后一篇。Keepalived使用方式前两篇已经说的比较细了,今天主要是汇总下延迟切换方面的信息。我们想要的效果是,一般因为网络波动、误触网线短暂影响,比如10秒以内的影响都不让keepalived切换状态,而真正的故障,如服务器宕机,网络长时间故障,这种情况下再切换状态。

keepalived 状态切换 执行脚本 keepalived切换通知_默认值

Keepalived 是用于实现负载均衡和高可用性的软件。它使用 VRRP 协议来选举一个节点为 Master,其他节点为 Backup。当 Master 节点发生故障时,Backup 节点将接管虚拟 IP 地址并提供服务。

Keepalived 提供了一些参数来控制切换状态的延迟。这些参数包括:

  • advert_int: 指定 Keepalived 发送 VRRP 通告消息的频率。默认值为 1 秒。
  • interface_up_down_delays: 指定接口状态变化的通知延迟。默认值为 0 秒。
  • delay: 指定在切换状态之前的延迟。

advert_int 参数控制 Keepalived 发送 VRRP 通告消息的频率。默认值为 1 秒。这意味着 Keepalived 将每秒发送一次 VRRP 通告消息。

interface_up_down_delays 参数指定接口状态变化的通知延迟。默认值为 0 秒。这意味着 Keepalived 将立即通知其他节点接口状态发生变化。

delay 参数指定在切换状态之前的延迟。默认值为 0 秒。这意味着 Keepalived 将立即切换状态。

延迟切换状态的优点

延迟切换状态可以防止 Keepalived 在故障或其他问题发生时做出错误的决策。例如,如果 Keepalived 在接口状态变化后立即切换状态,而接口状态变化是暂时的,那么 Keepalived 可能会将 Master 节点切换为 Backup。这可能会导致服务中断。

延迟切换状态的配置

要配置延迟切换状态,您可以使用以下方法:

  • 使用 advert_int 参数来降低 VRRP 通告消息的频率。 例如,将 advert_int 参数设置为 5 秒,将导致 Keepalived 每 5 秒发送一次 VRRP 通告消息。这将给 Backup 节点足够的时间来确定 Master 节点是否真的发生故障。
  • 使用 interface_up_down_delays 参数来增加接口状态变化的通知延迟。 例如,将 interface_up_down_delays 参数设置为 10 秒,将导致 Keepalived 在接口状态变化后等待 10 秒才通知其他节点。这将给 Keepalived 足够的时间来确定接口状态变化是否是永久性的。
  • 使用 delay 参数来指定在切换状态之前的延迟。 例如,将 delay 参数设置为 5 秒,将导致 Keepalived 在切换状态之前等待 5 秒。这将给 Keepalived 足够的时间来确定切换状态是否是正确的。

示例

以下是配置延迟切换状态的示例:




global_defs {
    notification_email {
        root@example.com
    }
}
interface_up_down_delays {
    eth0 10
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 10
    delay 10
}

在上述配置中,Keepalived 将每 5 秒发送一次 VRRP 通告消息。在接口状态变化后,Keepalived 将等待 10 秒才通知其他节点。在切换状态之前,Keepalived 将等待 5 秒。

结论

Keepalived 提供了一些参数来控制切换状态的延迟。通过正确配置这些参数,我们可以防止 Keepalived 在故障或其他问题发生时做出错误的决策。

keepalived 状态切换 执行脚本 keepalived切换通知_Backup_02

最后再给一个检测VIP的脚本,供参考。

#!/bin/bash
###############################################################
## Running by root, Install on keepalived server
## Function : keepalived script of checking vip services
## For All of Linux
###############################################################


DATE=`date '+%Y-%m-%d %T'`
SERVICE=grafana
CONF_FILE="/etc/keepalived/config/keepalived_grafana.conf"
VIP_EXIST=`ip a|grep 192.168.1.30|wc -l`
GRAFANA_SERVICE=`ps ax|grep grafana-server|grep -v grep|wc -l`
ZOMBIE=`ps ax|grep grafana-server|grep -v 'grep'|awk '{print $3}'`


CHECK_VIP()
{
    if [ $VIP_EXIST -eq 1 ] && [ $GRAFANA_SERVICE -eq 1 ]; then 
        echo "## $DATE : [DEBUG] 11 VIP and grafana are running"
        #if [ $ZOMBIE != 'Ssl' ] || [[ ! $ZOMBIE =~ 'D|R' ]]; then
        #    systemctl restart grafana-server
        #fi
    elif [ $VIP_EXIST -eq 1 ] && [ $GRAFANA_SERVICE -eq 0 ]; then
        echo "## $DATE : [WARN] 10 VIP is running, but grafana-server is down , restart grafana-server..."
        systemctl restart grafana-server
    elif [ $VIP_EXIST -eq 0 ] && [ $GRAFANA_SERVICE -eq 1 ]; then
        echo "## $DATE : [WARN] 01 VIP is down, but grafana is running, shutdown grafana-server..."
        systemctl stop grafana-server
    elif [ $VIP_EXIST -eq 0 ] && [ $GRAFANA_SERVICE -eq 0 ]; then
        echo "## $DATE : [DEBUG] 00 VIP and grafana are not running"
    else
        echo "what the fuck....."
    fi
           
} >> /var/log/keepalived_grafana.log


CHECK_VIP

✨✨感谢阅读,欢迎关注✨✨