查看Keepalived的当前状态

有没有办法使用服务器实例内的命令行查看当前状态(主/备份)?

干杯

你可以使用notify命令来写出一个状态文件。

# for ANY state transition. # "notify" script is called AFTER the # notify_* script(s) and is executed # with 3 arguments provided by keepalived # (ie don't include parameters in the notify line). # arguments # $1 = "GROUP"|"INSTANCE" # $2 = name of group or instance # $3 = target state of transition # ("MASTER"|"BACKUP"|"FAULT") notify /path/notify.sh 

创build一个通知脚本,如:

 #!/bin/bash # notify.sh echo $1 $2 is in $3 state > /var/run/keepalive.$1.$2.state 

获取状态脚本,如:

 #!/bin/bash # getstate.sh cat /var/run/keepalive.*.*.state 

通过SNMP读取当前状态已被certificate是最可靠的。 要启用此function,您必须先启用snmp支持:

  • 将-x添加到deamon选项(请参阅基于RedHat的系统上的/ etc / sysconfig / keepalived)

并安装snmpd。

然后您可以可靠地通过查询状态

 snmpget -Oq -Ov -v2c -cpublic localhost KEEPALIVED-MIB::vrrpInstanceState.1 

它也可以通过通知脚本来完成,但是这些并不总是触发,使状态文件与现实不同步。

对于版本1.3.0,keepalived添加了一个DBus接口,可以使用configuration文件的global_defs块中的enable_dbus选项启用(但是,在configuration过程中必须使用--enable-dbus构build选项启用该接口,不是这样,如果你正在使用二进制包)。

您可以使用任何DBus客户端/库(例如dbus-sendqdbusqdbusqdbus 。 我在这里使用systemd的busctl作为例子,因为它有一个非常漂亮的界面:

 # busctl tree org.keepalived.Vrrp1 └─/org └─/org/keepalived └─/org/keepalived/Vrrp1 ├─/org/keepalived/Vrrp1/Instance │ └─/org/keepalived/Vrrp1/Instance/eth0 │ └─/org/keepalived/Vrrp1/Instance/eth0/1 │ └─/org/keepalived/Vrrp1/Instance/eth0/1/IPv4 └─/org/keepalived/Vrrp1/Vrrp 

有两个接口可用,全局org.keepalived.Vrrp1.Vrrp on /org/keepalived/Vrrp1/Vrrp

 # busctl introspect org.keepalived.Vrrp1 /org/keepalived/Vrrp1/Vrrp org.keepalived.Vrrp1.Vrrp NAME TYPE SIGNATURE RESULT/VALUE FLAGS .CreateInstance method ssuu - - .DestroyInstance method s - - .PrintData method - - - .PrintStats method - - - .ReloadConfig method - - - .VrrpReloaded signal - - - .VrrpStarted signal - - - .VrrpStopped signal - - - 

而根据这个模板/org/keepalived/Vrrp1/Instance/<interface>/<virtual-router-id>/<ip-family> org.keepalived.Vrrp1.Instance ,path上的org.keepalived.Vrrp1.Instance接口在foreach VRRP实例中/org/keepalived/Vrrp1/Instance/<interface>/<virtual-router-id>/<ip-family> org.keepalived.Vrrp1.Instance 。 对于名为my-instance eth1上ID为1的IPv4 VRRP实例,我们得到以下内容:

 # busctl introspect org.keepalived.Vrrp1 /org/keepalived/Vrrp1/Instance/eth0/1/IPv4 org.keepalived.Vrrp1.Instance NAME TYPE SIGNATURE RESULT/VALUE FLAGS .SendGarp method - - - .Name property s "my-instance" emits-change .State property (us) 2 "Master" emits-change .VrrpStatusChange signal u - - 

为了得到这个特定实例的状态,我们可以使用下面的命令

 # busctl get-property org.keepalived.Vrrp1 /org/keepalived/Vrrp1/Instance/br_vrrp/67/IPv4 org.keepalived.Vrrp1.Instance State (us) 2 "Master" 

返回的属性是一个STRUCT,带有状态码和人类可读的名称。 状态为0 "Init"1 "Backup"2 "Master"3 "Fault"4 "Goto master"98 "Goto fault" 。 最后三个州是内部和官方RFC 2338状态。

如果使用多个keepalived进程并设置instance选项,或者如果将networking名称空间function与namespace选项配合使用,则path前缀会更改/org/keepalived/Vrrp1/<namespace>/<interface>