keepalived之vrrp_script详解

通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup。当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。因此可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt解决异常恢复后再次抢占的问题。

1、vrrp_script能做什么

keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务进程,比如说nginx,keepalived+nginx实现nginx的负载均衡高可用,如果nginx异常,仅仅keepalived保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换。这个时候,我们可以通过编写脚本对业务进程进行检测监控

例如:编写个简单脚本查看haproxy进程是否存活

#!/bin/bash
count = `ps aux | grep -v grep | grep haproxy | wc -l`
if [ $count > 0 ]; then
    exit 0
else
    exit 1
fi

在keepalived的配置文件中增加相应配置项

vrrp_script checkhaproxy
{
    script "/home/check.sh"
    interval 3
    weight -20
}

vrrp_instance test
{
    ...
    
    track_script
    {
        checkhaproxy
    }
    
    ...
}

2、优先级更新策略

keepalived会定时执行脚本对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加

如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少

其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

这里需要注意的是:

1) 优先级不会不断的提高或者降低

2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight

3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况

这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

3、vrrp_script中节点权重改变算法

在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。

3.1、不设置weight

在vrrp_script模块中,如果不设置“weight”选项值,那么集群优先级的选择将由Keepalived配置文件中的“priority”值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置“weight”值来实现。

3.2、设置weight

vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败;

  1. weight 为正时脚本检测成功时此weight会加到priority上,检测失败时不加;

    1. 主失败:

      1. 主 priority < 从 priority + weight 时会切换。

    2. 主成功:

      1. 主 priority + weight > 从 priority + weight 时,主依然为主

  2. weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight)

    1. 主失败:

      1. 主 priority – abs(weight) < 从priority 时会切换主从

    2. 主成功:

      1. 主 priority > 从priority 主依然为主

4、配置不抢占nopreempt带来的问题

例如:A,B两台keepalived

A的配置大概为:

vrrp_script checkhaproxy
{
    script "/etc/check.sh"
    interval 3
    weight -20

}

vrrp_instance test
{
    ....
    
    state backup
    priority 80
    nopreempt

    track_script
    {
        checkhaproxy
    }

    ....
}

B的配置大概为:

vrrp_script checkhaproxy
{
    script "/etc/check.sh"
    interval 3
    weight -20
}

vrrp_instance test
{
    ....
    
    state backup
    priority 70

    track_script
    {
        checkhaproxy
    }

    ....
}

A,B同时启动后,由于A的优先级较高,因此通过选举会成为master。当A上的业务进程出现问题时,优先级会降低到60。此时B收到优先级比自己低的vrrp广播包时,将切换为master状态。那么当B上的业务出现问题时,优先级降低到50,尽管A的优先级比B的要高,但是由于设置了nopreempt,A不会再抢占成为master状态。

所以,可以在检测脚本中增加杀掉keepalived进程(或者停用keepalived服务)的方式,做到业务进程出现问题时完成主备切换。

5、参考文章

keepalived之vrrp_script总结keepalived之vrrp_script总结 - hncscwc的个人空间 - OSCHINA - 中文开源技术交流社区

Keepalived双主模型中vrrp_script中权重改变故障排查Keepalived双主模型中vrrp_script中权重改变故障排查_小小忍者的技术博客_51CTO博客

Keepalived中Master和Backup角色选举策略Keepalived中Master和Backup角色选举策略_服务器应用_Linux公社-Linux系统门户网站



#!/bin/bash
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then                            
    exit 1
else
    exit 0
fi

例子:
[root@bogon ~]# cat /opt/mqm_check/mqm_check.sh
#!/bin/bash
A=`ps -C runmqchi --no-header |wc -l` 
if [ $A -eq 0 ];then
        exit 1
else
        exit 0
fi
[root@bogon ~]# cat /etc/keepalived/keepalived.conf
vrrp_script chk_http_port {
    script "/opt/mqm_check/mqm_check.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    virtual_router_id 61
    priority 90
## nopreempt
    unicast_src_ip 192.168.207.232
    unicast_peer {
       192.168.207.231
    }
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.207.233 dev ens192 label ens192:1
    }
    track_script
    {
       chk_http_port
    }
}
[root@bogon ~]# systemctl restart keepalived
[root@bogon ~]# ip a|grep 23
    inet 192.168.207.232/24 brd 192.168.207.255 scope global noprefixroute ens192
    inet 192.168.207.233/32 scope global ens192:1
[root@bogon ~]# ps -C runmqchi --no-header |wc -l
1

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
keepalived 中,"vrrp_script" 和 "track_script" 的用法有一些区别。 "vrrp_script" 的用法如下: ``` vrrp_script <script_name> { script <path_to_script> interval <check_interval> weight <weight> fall <fall_threshold> rise <rise_threshold> } ``` 其中,各个参数的含义如下: - `<script_name>`: 脚本的名称,可以是任意字符串,用于标识该脚本。 - `<path_to_script>`: 脚本的路径,可以是相对或绝对路径,指定要运行的脚本。 - `<check_interval>`: 检查脚本的时间间隔,单位为秒,默认为 2 秒。 - `<weight>`: 脚本的权重,用于计算服务的权重和优先级,默认为 1。 - `<fall_threshold>`: 连续检测到故障的阈值,达到该阈值后,将认为服务出现故障,默认为 1。 - `<rise_threshold>`: 连续检测到服务恢复的阈值,达到该阈值后,将认为服务已经恢复正常,默认为 1。 "track_script" 的用法如下: ``` track_script { <script_name> } ``` 其中, `<script_name>` 是要监控的脚本的名称,必须与 "vrrp_script" 中指定的脚本名称相同。在配置文件中指定 "track_script" 时,不需要再指定脚本路径、时间间隔、权重、阈值等参数,这些参数已经在 "vrrp_script" 中指定过了。 因此,"vrrp_script" 和 "track_script" 的主要区别在于用法,"vrrp_script" 需要指定脚本路径、时间间隔、权重、阈值等参数,"track_script" 只需要指定要监控的脚本名称即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值