有没有办法使用服务器实例内的命令行查看当前状态(主/备份)?
干杯
你可以使用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支持:
并安装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-send , qdbus , qdbus ) qdbus 。 我在这里使用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> 。