您可以使用 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\nRun 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 - - -\nRun Code Online (Sandbox Code Playgroud)\n对于每个 VRRP 实例,org.keepalived.Vrrp1.Instance路径上的接口都按照此模板/org/keepalived/Vrrp1/Instance/<interface>/<virtual-router-id>/<ip-family>。1对于 id为eth1name 的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 - -\nRun 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"\nRun 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 };\nRun 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 次 |
| 最近记录: |