您可以使用 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
Run Code Online (Sandbox Code Playgroud)
创建一个通知脚本,如:
#!/bin/bash
# notify.sh
echo $1 $2 is in $3 state > /var/run/keepalive.$1.$2.state
Run Code Online (Sandbox Code Playgroud)
和一个获取状态脚本,如:
#!/bin/bash
# getstate.sh
cat /var/run/keepalive.*.*.state
Run Code Online (Sandbox Code Playgroud)
小智 7
事实证明,通过 SNMP 读取当前状态对我来说是最可靠的。要启用此功能,您必须使用 snmp 支持来启动 keepalived:
并安装 snmpd。
然后,您可以通过以下方式可靠地查询状态
snmpget -Oq -Ov -v2c -cpublic localhost KEEPALIVED-MIB::vrrpInstanceState.1
Run Code Online (Sandbox Code Playgroud)
它也可以通过通知脚本完成,但这些脚本并不总是触发,使状态文件与现实不同步。
在1.3.0版本中,Keepalived 添加了一个 DBus 接口\xe2\x80\xa0来查询 VRRP 状态,使用信号监视 VRRP 事件,甚至在运行时修改一些 VRRP 配置。截至 2021 年,该接口仅用于 VRRP 功能,不会公开与 Keepalived 的 IPVS 子系统相关的任何内容。DBus 支持通过配置文件块enable_dbus
中的选项启用。global_defs
也可以指定一些附加选项(此处未解释)。
dbus-send
您可以使用任何 DBus 客户端/库(例如、gdbus
、 )访问 DBus 接口qdbus
。我在这里使用 systemdbusctl
作为示例,因为它有一个非常好的界面:
# busctl tree org.keepalived.Vrrp1\n\xe2\x94\x94\xe2\x94\x80/org\n \xe2\x94\x94\xe2\x94\x80/org/keepalived\n \xe2\x94\x94\xe2\x94\x80/org/keepalived/Vrrp1\n \xe2\x94\x9c\xe2\x94\x80/org/keepalived/Vrrp1/Instance\n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80/org/keepalived/Vrrp1/Instance/eth0\n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80/org/keepalived/Vrrp1/Instance/eth0/1\n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80/org/keepalived/Vrrp1/Instance/eth0/1/IPv4\n \xe2\x94\x94\xe2\x94\x80/org/keepalived/Vrrp1/Vrrp\n
Run Code Online (Sandbox Code Playgroud)\n有两个接口可用,全局org.keepalived.Vrrp1.Vrrp
接口/org/keepalived/Vrrp1/Vrrp
:
# busctl introspect org.keepalived.Vrrp1 /org/keepalived/Vrrp1/Vrrp org.keepalived.Vrrp1.Vrrp\nNAME TYPE SIGNATURE RESULT/VALUE FLAGS\n.CreateInstance method ssuu - -\n.DestroyInstance method s - -\n.PrintData method - - -\n.PrintStats method - - -\n.ReloadConfig method - - -\n.VrrpReloaded signal - - -\n.VrrpStarted signal - - -\n.VrrpStopped signal - - -\n
Run Code Online (Sandbox Code Playgroud)\n对于每个 VRRP 实例,org.keepalived.Vrrp1.Instance
路径上的接口都按照此模板/org/keepalived/Vrrp1/Instance/<interface>/<virtual-router-id>/<ip-family>
。1
对于 id为eth1
name 的IPv4 VRRP 实例my-instance
,我们得到以下信息:
# busctl introspect org.keepalived.Vrrp1 /org/keepalived/Vrrp1/Instance/eth0/1/IPv4 org.keepalived.Vrrp1.Instance\nNAME TYPE SIGNATURE RESULT/VALUE FLAGS\n.SendGarp method - - -\n.Name property s "my-instance" emits-change\n.State property (us) 2 "Master" emits-change\n.VrrpStatusChange signal u - -\n
Run Code Online (Sandbox Code Playgroud)\n如果您正在使用多个 keepalived 进程并设置该instance
选项,或者如果您正在通过该namespace
选项使用网络命名空间功能,则路径还包括实例和/或命名空间。
要获取特定实例的状态,我们可以使用以下命令
\n# busctl get-property org.keepalived.Vrrp1 /org/keepalived/Vrrp1/Instance/eth0/1/IPv4 org.keepalived.Vrrp1.Instance State\n(us) 2 "Master"\n
Run Code Online (Sandbox Code Playgroud)\n返回的属性是一个 STRUCT,带有状态代码和人类可读的名称。重要的状态是0 "Init"
, 1 "Backup"
, 2 "Master"
, 3 "Fault"
。前三个是官方 RFC 2338 状态,最后一个由 Keepalived 定义。不同版本的 Keepalived 有一些额外的状态。从版本 2.2.4 开始,还有例如97 "Stop"
和98 "Deleted"
。在版本 2.0.0 之前,例如4 "Goto master"
,代码 98 也具有不同的语义98 "Goto fault"
,因此您的代码应该主要依赖于四个主要代码,并且还处理新的状态代码。
您还可以使用 DBus 信号监视状态变化。以下输出显示了启动、引入故障和停止 Keepalived 实例时的 DBus 信号:
\n# busctl monitor --match="type=\'signal\',sender=\'org.keepalived.Vrrp1\'\n\xe2\x80\xa3 Type=signal Endian=l Flags=1 Version=1 Priority=0 Cookie=5\n Sender=:1.80 Path=/org/keepalived/Vrrp1/hades_root/Instance/br_vrrp/67/IPv4 Interface=org.keepalived.Vrrp1.Instance Member=VrrpStatusChange\n UniqueName=:1.80\n MESSAGE "u" {\n UINT32 1;\n };\n\n\xe2\x80\xa3 Type=signal Endian=l Flags=1 Version=1 Priority=0 Cookie=6\n Sender=:1.80 Path=/org/keepalived/Vrrp1/Instance/eth0/1/IPv4 Interface=org.keepalived.Vrrp1.Instance Member=VrrpStatusChange\n UniqueName=:1.80\n MESSAGE "u" {\n UINT32 2;\n };\n\n\xe2\x80\xa3 Type=signal Endian=l Flags=1 Version=1 Priority=0 Cookie=7\n Sender=:1.80 Path=/org/keepalived/Vrrp1/hades_root/Instance/br_vrrp/67/IPv4 Interface=org.keepalived.Vrrp1.Instance Member=VrrpStatusChange\n UniqueName=:1.80\n MESSAGE "u" {\n UINT32 3;\n };\n\n\xe2\x80\xa3 Type=signal Endian=l Flags=1 Version=1 Priority=0 Cookie=8\n Sender=:1.80 Path=/org/keepalived/Vrrp1/hades_root/Instance/br_vrrp/67/IPv4 Interface=org.keepalived.Vrrp1.Instance Member=VrrpStatusChange\n UniqueName=:1.80\n MESSAGE "u" {\n UINT32 1;\n };\n\n\xe2\x80\xa3 Type=signal Endian=l Flags=1 Version=1 Priority=0 Cookie=9\n Sender=:1.80 Path=/org/keepalived/Vrrp1/hades_root/Instance/br_vrrp/67/IPv4 Interface=org.keepalived.Vrrp1.Instance Member=VrrpStatusChange\n UniqueName=:1.80\n MESSAGE "u" {\n UINT32 2;\n };\n\n\xe2\x80\xa3 Type=signal Endian=l Flags=1 Version=1 Priority=0 Cookie=7\n Sender=:1.80 Path=/org/keepalived/Vrrp1/Instance/eth0/1/IPv4 Interface=org.keepalived.Vrrp1.Instance Member=VrrpStatusChange\n UniqueName=:1.80\n MESSAGE "u" {\n UINT32 98;\n };\n\n\xe2\x80\xa3 Type=signal Endian=l Flags=1 Version=1 Priority=0 Cookie=8\n Sender=:1.80 Path=/org/keepalived/Vrrp1/Vrrp Interface=org.keepalived.Vrrp1.Vrrp Member=VrrpStopped\n UniqueName=:1.80\n MESSAGE "" {\n };\n
Run Code Online (Sandbox Code Playgroud)\n我们观察到:
\nINIT
发出状态信号。BACKUP
状态(state BACKUP
使用了配置)。MASTER
状态。FAULT
状态。BACKUP
然后MASTER
再恢复。STOP
状态。VrrpStopped
信号。\xe2\x80\xa0 Keepalived 必须使用此选项来构建才能--enable-dbus
configure
正常工作。然而,大多数二进制发行版现在应该已经启用了它。例如,Debian 和 Ubuntu从软件包版本 1:1.3.9-1 开始就这样做。
如果您发出命令:
journalctl -u keepalived
Run Code Online (Sandbox Code Playgroud)
它列出了状态:
Jul 12 13:45:52 vmt007 Keepalived_vrrp[14335]: VRRP_Instance(VI_INT) Entering MASTER STATE
Run Code Online (Sandbox Code Playgroud)
在从端你可以看到:
Jul 12 13:45:51 vmt008 Keepalived_vrrp[3569]: VRRP_Instance(VI_INT) Entering BACKUP STATE
Run Code Online (Sandbox Code Playgroud)
转储当前状态可以通过向keepalived父进程发送USR2
信号来完成:
kill -USR2 `cat /var/run/keepalived.pid`
Run Code Online (Sandbox Code Playgroud)
见结果/tmp/keepalived.stats
。
注意:如果使用SELinux ( CentOS 7 ),则不允许写入此文件。您可以通过以下准备解决此问题:
touch /tmp/keepalived.stats
chmod go+w /tmp/keepalived.stats
semanage fcontext -a -t keepalived_var_run_t /tmp/keepalived.stats
restorecon /tmp/keepalived.stats
Run Code Online (Sandbox Code Playgroud)
现在尝试再次发送信号。
归档时间: |
|
查看次数: |
43884 次 |
最近记录: |