keepalived 详解(包含相关概念和示例)

mac2022-06-30  22

keepalived 详解(包含相关概念和示例)

相关概念1、HA Cluster2、VRRP2.1 相关术语 2.2 其它介绍3、mailx3.1 安装3.2 使用 keepalived1、实现方式2、组件介绍3、HA Cluster的配置前提4、keepalived 安装5、keepalived 程序环境6、主配置文件组件部分6.1 配置语法6.2 单主配置示例6.3 双主配置示例 7、通知脚本配置7.1 通知脚本示例7.2 脚本的调用方法7.3 完整的调用方法示例7.4 完整的脚本调用示例 8、虚拟服务器配置8.1 虚拟服务器语法格式8.2 虚拟服务器配置参数8.3 虚拟服务器配置示例(单主模式的keepalive)8.4 虚拟服务器配置示例(双主模式的keepalive) 9、调用外部的辅助脚本进行资源监控(keepalived vrrp_script)9.1 keepalived 的 vrrp_script 详解9.1.1 优先级更新策略9.1.2 vrrp_script中节点权重改变算法9.1.3 Keepalived中Master和Backup角色选举策略 9.2 语法格式9.3 示例

相关概念

1、HA Cluster

1、集群类型:LB(lvs/nginx(http/upstream, stream/upstream))、HAHP 2、单点故障:SPoF:(Single Point of Failure) 3、系统可用性的公式:A=MTBF/MTBF+MTTR4、系统故障:硬件故障(设计缺陷、wear out、自然灾害、……)和 软件故障(设计缺陷) 5、提升系统高用性的解决方案之降低MTTR:采取冗余手段(redundant:active/passive(主备),active/active(双主)) 6、高可用的是“服务”: # HA nginx service:vip/nginx process[/shared storage] # shared storage:NAS(文件共享服务器)或 SAN(存储区域网络,块级别的共享) # Network partition:网络分区 7、Failover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作 8、Failback:故障移回,即某资源的主节点故障后重新修改上线后,将转移至其它节点的资源重新切回的过程 9HA Cluster实现方案: # vrrp协议的实现(keepalived) # ais:完备HA集群(RHCS(cman)、heartbeat、corosync)

2、VRRP

vrrp协议:Virtual Redundant Routing Protocol。

2.1 相关术语

虚拟路由器:Virtual Router 虚拟路由器标识:VRID(0-255) 物理路由器: # master:主设备 # backup:备用设备 # priority:优先级 VIP:Virtual IP VMAC:Virutal MAC (00-00-5e-00-01-VRID)

2.2 其它介绍

通告:进行心跳,优先级等信息周期性进行发送 模式:抢占式,非抢占式 安全工作:认证方式 # 无认证 # 简单字符认证 # MD5 工作模式: # 主/备:单虚拟路径器 # 主/主:主/备(虚拟路径器1),备/主(虚拟路径器2

3、mailx

3.1 安装

[root@neo-neo ~]# yum install mailx -y [root@neo-neo ~]# rpm -ql mailx /bin/mail /bin/mailx /etc/mail.rc /usr/bin/Mail /usr/bin/nail /usr/share/doc/mailx-12.5 /usr/share/doc/mailx-12.5/AUTHORS /usr/share/doc/mailx-12.5/COPYING /usr/share/doc/mailx-12.5/README /usr/share/man/man1/Mail.1.gz /usr/share/man/man1/mail.1.gz /usr/share/man/man1/mailx.1.gz /usr/share/man/man1/nail.1.gz

3.2 使用

[root@neo-neo ~]# echo "hello" | mail -s "hi" root@localhost # 进行邮件发送, -s 指定邮件主题 [root@neo-neo ~]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 2 messages 2 new >N 1 root Thu Oct 3 09:58 18/603 "hi" N 2 root Thu Oct 3 09:58 18/602 "hi" & 2 Message 2: From root@neo-neo.localdomain Thu Oct 3 09:58:44 2019 Return-Path: <root@neo-neo.localdomain> X-Original-To: root@localhost Delivered-To: root@localhost.localdomain Date: Thu, 03 Oct 2019 09:58:44 -0400 To: root@localhost.localdomain Subject: hi User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: root@neo-neo.localdomain (root) Status: R hello & exit You have mail in /var/spool/mail/root

keepalived

1、实现方式

vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务:

基于vrrp协议完成地址流动为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)为ipvs集群的各RS做健康状态检测基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务

2、组件介绍

核心组件

vrrp stack ipvs wrapper checkers

控制组件:配置文件分析器

IO复用器

内存管理组件

分为两大层:内核空间(Kernel Space)、用户空间(User Space)

IPVS(IP Virtual Server): 实现传输层负载平衡,也称为第4层交换

NETLINK: 用于在内核和用户空间进程之间传输信息

Keepalived 分为3个守护进程:

父进程: 很简单,负责 fork 子进程,并监视子进程健康(图中 WatchDog 周期性发送检测包,需要的话重启子进程)子进程A: 负责VRRP框架(图中 VRRP Stack)子进程B: 负责健康检查(图中 Checkers)

3、HA Cluster的配置前提

各节点时间必须同步(使用 ntp, chrony 进行实现)确保iptables及selinux不会成为阻碍各节点之间可通过主机名互相通信(对KA并非必须):(建议使用/etc/hosts文件实现)确保各节点的用于集群服务的接口支持MULTICAST通信(使用D类地址:224-239)

4、keepalived 安装

CentOS 6.4 以上的版本随base仓库提供。

5、keepalived 程序环境

主配置文件:/etc/keepalived/keepalived.conf 主程序文件:/usr/sbin/keepalived Unit File:keepalived.service Unit File的环境配置文件:/etc/sysconfig/keepalived

6、主配置文件组件部分

TOP HIERACHY # GLOBAL CONFIGURATION # Global definitions # Static routes/addresses # VRRPD CONFIGURATION # VRRP synchronization group(s):vrrp同步组 # VRRP instance(s):每个vrrp instance,即一个vrrp路由器 # LVS CONFIGURATION # Virtual server group(s) # Virtual server(s):ipvs集群的vs和rs

6.1 配置语法

配置虚拟路由器:

vrrp_instance <STRING> { .... }

配置虚拟路由器的专用参数:

state MASTER|BACKUP # 当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP interface IFACE_NAME # 绑定为当前虚拟路由器使用的物理接口 virtual_router_id VRID # 当前虚拟路由器的惟一标识,范围是0-255 priority 100 # 当前主机在此虚拟路径器中的优先级;范围1-254 advert_int 1 # vrrp通告的时间间隔; authentication { # 配置认证方式,支持8个简单字符的认证方式 auth_type AH|PASS auth_pass <PASSWORD> } virtual_ipaddress { # 配置 VIP <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 } track_interface { # 配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态在 eth0 eth1 ... } nopreempt # 定义工作模式为非抢占模式 preempt_delay 300 # 抢占式模式下,节点上线后触发新选举操作的延迟时长 定义通知脚本: # notify_master <STRING>|<QUOTED-STRING> # 当前节点成为主节点时触发的脚本 # notify_backup <STRING>|<QUOTED-STRING> # 当前节点转为备节点时触发的脚本 # notify_fault <STRING>|<QUOTED-STRING> # 当前节点转为“失败”状态时触发的脚本 # notify <STRING>|<QUOTED-STRING> # 通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

6.2 单主配置示例

! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19 } vrrp_instance VI_1 { state BACKUP interface eno16777736 virtual_router_id 14 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.91/16 dev eno16777736 } }

6.3 双主配置示例

! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.91/16 dev eno16777736 } } vrrp_instance VI_2 { state BACKUP interface eno16777736 virtual_router_id 15 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 578f07b2 } virtual_ipaddress { 10.1.0.92/16 dev eno16777736 } }

7、通知脚本配置

7.1 通知脚本示例

#!/bin/bash # contact='root@localhost' notify() { local mailsubject="$(hostname) to be $1, vip floating" local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1" echo "$mailbody" | mail -s "$mailsubject" $contact } case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;; esac

7.2 脚本的调用方法

# 需要配置在 VRRP_INSTANCE 的上下文中 notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"

7.3 完整的调用方法示例

[root@Neo_Neo keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id Neo_Tang vrrp_mcast_group4 224.0.0.58 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 33 priority 96 advert_int 1 authentication { auth_type PASS auth_pass JIAOTANG } virtual_ipaddress { 192.168.1.99/24 dev ens33 label ens33:0 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }

7.4 完整的脚本调用示例

### 节点 1 [root@Neo_Neo keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id Neo_Tang vrrp_mcast_group4 224.0.0.58 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 33 priority 96 advert_int 1 authentication { auth_type PASS auth_pass JIAOTANG } virtual_ipaddress { 192.168.1.99/24 dev ens33 label ens33:0 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } ### 节点 2 [root@Neo_Tang keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id neo-neo vrrp_mcast_group4 224.0.0.58 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 33 priority 100 advert_int 1 authentication { auth_type PASS auth_pass JIAOTANG } virtual_ipaddress { 192.168.1.99/24 dev ens33 label ens33:0 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } ### 节点之间进行主备倒换时,查看邮件服务器是否能够成功收到邮件 [root@Neo_Tang keepalived]# systemctl start keepalived.service [root@Neo_Tang keepalived]# systemctl status keepalived.service ● keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2019-10-04 11:22:55 EDT; 5s ago Process: 7450 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS) Main PID: 7451 (keepalived) CGroup: /system.slice/keepalived.service ├─7451 /usr/sbin/keepalived -D ├─7452 /usr/sbin/keepalived -D └─7453 /usr/sbin/keepalived -D Oct 04 11:22:55 Neo_Tang Keepalived_vrrp[7453]: VRRP_Instance(VI_1) Transition to MASTER STATE Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: VRRP_Instance(VI_1) Entering MASTER STATE Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: VRRP_Instance(VI_1) setting protocol VIPs. Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: Sending gratuitous ARP on ens33 for 192.168.1.99 Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.1.99 Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: Sending gratuitous ARP on ens33 for 192.168.1.99 Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: Sending gratuitous ARP on ens33 for 192.168.1.99 Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: Sending gratuitous ARP on ens33 for 192.168.1.99 Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: Sending gratuitous ARP on ens33 for 192.168.1.99 Oct 04 11:22:56 Neo_Tang Keepalived_vrrp[7453]: Opening script file /etc/keepalived/notify.sh Hint: Some lines were ellipsized, use -l to show in full. [root@Neo_Tang keepalived]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 2 messages 1 new 1 root Thu Oct 3 09:58 19/613 "hi" >N 2 root Fri Oct 4 11:22 18/702 "Neo_Tang to be master, vip floating" & 2 Message 2: From root@Neo_Tang.localdomain Fri Oct 4 11:22:57 2019 Return-Path: <root@Neo_Tang.localdomain> X-Original-To: root@localhost Delivered-To: root@localhost.localdomain Date: Fri, 04 Oct 2019 11:22:56 -0400 To: root@localhost.localdomain Subject: Neo_Tang to be master, vip floating User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: root@Neo_Tang.localdomain (root) Status: R 2019-10-04 11:22:56: vrrp transition, Neo_Tang changed to be master & exit

8、虚拟服务器配置

8.1 虚拟服务器语法格式

virtual_server IP port | virtual_server fwmark int { ... real_server { ... } ... }

8.2 虚拟服务器配置参数

delay_loop <INT> # 服务轮询的时间间隔 lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 定义调度方法 lb_kind NAT|DR|TUN # 集群的类型 persistence_timeout <INT> # 持久连接时长 protocol TCP # 服务协议,仅支持TCP sorry_server <IPADDR> <PORT> # 备用服务器地址和端口 real_server <IPADDR> <PORT> # 真实服务器地址和端口 { weight <INT> notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机的健康状态检测方法 } HTTP_GET|SSL_GET # 应用层检测参数说明 HTTP_GET|SSL_GET { url { path <URL_PATH> # 定义要监控的URL status_code <INT> # 判断上述检测机制为健康状态的响应码 digest <STRING> # 判断上述检测机制为健康状态的响应的内容的校验码 } nb_get_retry <INT> # 重试次数 delay_before_retry <INT> # 重试之前的延迟时长 connect_ip <IP ADDRESS> # 向当前RS的哪个IP地址发起健康状态检测请求 connect_port <PORT> # 向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址 bind_port <PORT> # 发出健康状态检测请求时使用的源端口 connect_timeout <INTEGER> # 连接请求的超时时长 } TCP_CHECK # 传输层检测参数说明 TCP_CHECK { connect_ip <IP ADDRESS> # 向当前RS的哪个IP地址发起健康状态检测请求 connect_port <PORT> # 向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址 bind_port <PORT> # 发出健康状态检测请求时使用的源端口 connect_timeout <INTEGER> # 连接请求的超时时长 }

8.3 虚拟服务器配置示例(单主模式的keepalive)

! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.93/16 dev eno16777736 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 10.1.0.93 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.0.69 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.0.71 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } } TCP_CHECK使用示例: TCP_CHECK { nb_get_retry 3 delay_before_retry 2 connect_timeout 3 }

8.4 虚拟服务器配置示例(双主模式的keepalive)

! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from kaadmin@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.67 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 44 priority 100 advert_int 1 authentication { auth_type PASS auth_pass f1bf7fde } virtual_ipaddress { 172.16.0.80/16 dev eno16777736 label eno16777736:0 } track_interface { eno16777736 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 { state BACKUP interface eno16777736 virtual_router_id 45 priority 98 advert_int 1 authentication { auth_type PASS auth_pass f2bf7ade } virtual_ipaddress { 172.16.0.90/16 dev eno16777736 label eno16777736:1 } track_interface { eno16777736 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } virtual_server fwmark 3 { delay_loop 2 lb_algo rr lb_kind DR nat_mask 255.255.0.0 protocol TCP sorry_server 127.0.0.1 80 real_server 172.16.0.69 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 2 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.0.6 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 2 nb_get_retry 3 delay_before_retry 3 } } }

9、调用外部的辅助脚本进行资源监控(keepalived vrrp_script)

keepalived 调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整。

分为两步:

先定义一个脚本调用此脚本

9.1 keepalived 的 vrrp_script 详解

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

9.1.1 优先级更新策略

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

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

这里需要注意的是:

优先级不会不断的提高或者降低可以编写多个检测脚本并为每个检测脚本设置不同的weight不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况

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

9.1.2 vrrp_script中节点权重改变算法

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

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

在vrrp_script模块中,如果设置“weight”选项值,vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败。

weight 为正时,脚本检测成功时此weight会加到priority上,检测失败时不加; 1、主失败: 主 priority < 从 priority + weight 时会切换 2、主成功: 主 priority + weight > 从 priority + weight 时,主依然为主 weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight) 1、主失败: 主 priority – abs(weight) < 从priority 时会切换主从 2、主成功: 主 priority > 从priority 主依然为主

9.1.3 Keepalived中Master和Backup角色选举策略

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

在一个一主多备的Keepalived集群中,“priority”值最大的将成为集群中的Master节点,而其他都是Backup节点。在Master节点发生故障后,Backup节点之间将进行“民主选举”,通过对节点优先级值“priority”和““weight”的计算,选出新的Master节点接管集群服务。

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

9.2 语法格式

vrrp_script <SCRIPT_NAME> { script "" # 脚本名称或脚本内容 interval INT # 运行脚本的间隔时间 weight -INT # 权重减去INT的值 } track_script { # 在 VRRP 实例中进行脚本调用 SCRIPT_NAME_1 SCRIPT_NAME_2 ... }

9.3 示例

! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19 } vrrp_script chk_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" # 脚本内容 # 存在 down 文件,则异常退出,并执行以下命令(失败) # 不存在 down 文件,则正常退出(成功) interval 1 # 每 1 秒检测一次 weight -5 # 如果检测失败,则权重 -5 fall 1 # 如果检测失败 1 次,则权重 -5 rise 1 # 如果检测成功 1 次,则恢复 权重 } vrrp_script chk_nginx { script "killall -0 nginx && exit 0 || exit 1" # 脚本内容 # 存在 nginx 进程,则正常退出(成功) # 不存在 nginx 进程,则异常退出(失败) interval 1 # 每 1 秒检测一次 weight -5 # 如果检测失败(非 0),则权重 -5 fall 2 # 如果检测失败(非 02 次,则权重 -5 rise 1 # 如果检测成功(为 01 次,则恢复 权重 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.93/16 dev eno16777736 } track_script { chk_down chk_nginx } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
最新回复(0)