查看Keepalived的当前状态

Ben*_*Ben 8 backup load-balancing keepalived

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

干杯

dmo*_*ati 9

您可以使用 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:

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

并安装 snmpd。

然后,您可以通过以下方式可靠地查询状态

snmpget -Oq -Ov -v2c -cpublic localhost KEEPALIVED-MIB::vrrpInstanceState.1
Run Code Online (Sandbox Code Playgroud)

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


Seb*_*der 6

数据库总线

\n

在1.3.0版本中,Keepalived 添加了一个 DBus 接口\xe2\x80\xa0来查询 VRRP 状态,使用信号监视 VRRP 事件,甚至在运行时修改一些 VRRP 配置。截至 2021 年,该接口仅用于 VRRP 功能,不会公开与 Keepalived 的 IPVS 子系统相关的任何内容。DBus 支持通过配置文件块enable_dbus中的选项启用。global_defs也可以指定一些附加选项(此处未解释)。

\n

界面

\n

dbus-send您可以使用任何 DBus 客户端/库(例如、gdbus、 )访问 DBus 接口qdbus。我在这里使用 systemdbusctl作为示例,因为它有一个非常好的界面:

\n
# 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

\n
# 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为eth1name 的IPv4 VRRP 实例my-instance,我们得到以下信息:

\n
# 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

查询状态

\n

要获取特定实例的状态,我们可以使用以下命令

\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",因此您的代码应该主要依赖于四个主要代码,并且还处理新的状态代码。

\n

监测信号

\n

您还可以使用 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

我们观察到:

\n
    \n
  1. 当 Keepalived 启动时,不会INIT发出状态信号。
  2. \n
  3. 实例转换到BACKUP状态(state BACKUP使用了配置)。
  4. \n
  5. 实例转换到MASTER状态。
  6. \n
  7. 检测到故障并且实例转换到FAULT状态。
  8. \n
  9. 实例通过转到BACKUP然后MASTER再恢复。
  10. \n
  11. Keepalived 停止,实例转换到该STOP状态。
  12. \n
  13. Keepalived 也会发出全局VrrpStopped信号。
  14. \n
\n
\n

\xe2\x80\xa0 Keepalived 必须使用此选项来构建才能--enable-dbus configure正常工作。然而,大多数二进制发行版现在应该已经启用了它。例如,Debian 和 Ubuntu从软件包版本 1:1.3.9-1 开始就这样做。

\n


eei*_*lar 5

如果您发出命令:

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)


Ser*_*rgA 5

转储当前状态可以通过向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)

现在尝试再次发送信号。