Назад | Перейти на главную страницу

Просмотр текущего состояния 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

Создайте сценарий уведомления, например:

#!/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 оказалось для меня самым надежным. Чтобы включить это, вы должны запустить keepalived с поддержкой snmp:

  • добавьте -x к параметрам deamon (см. / etc / sysconfig / keepalived в системах на базе RedHat)

и установите snmpd.

Затем вы можете надежно запросить статус через

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

Это также можно сделать с помощью сценариев уведомлений, но они не всегда срабатывают, в результате чего файл состояния не синхронизируется с реальностью.

Если вы дадите команду:

journalctl -u keepalived

в нем указано состояние:

Jul 12 13:45:52 vmt007 Keepalived_vrrp[14335]: VRRP_Instance(VI_INT) Entering MASTER STATE

со стороны рабов можно увидеть:

Jul 12 13:45:51 vmt008 Keepalived_vrrp[3569]: VRRP_Instance(VI_INT) Entering BACKUP STATE

Сброс текущего состояния можно сделать, отправив USR2 сигнал к оставайся живым родительский процесс:

kill -USR2 `cat /var/run/keepalived.pid`

Посмотреть результат в /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

Теперь попробуйте отправить сигнал еще раз.

В версии 1.3.0 в keepalived добавлен интерфейс DBus, который можно включить с помощью enable_dbus вариант в global_defs блок конфигурационного файла (однако интерфейс должен быть включен с помощью --enable-dbus вариант сборки во время configure(что может быть не так, если вы используете бинарный пакет).

Вы можете получить доступ к интерфейсу DBus с помощью любого клиента / библиотеки DBus (например, dbus-send, gdbus, 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 на /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    -         -            -

И для каждого экземпляра VRRP org.keepalived.Vrrp1.Instance интерфейс на путях согласно этому шаблону /org/keepalived/Vrrp1/Instance/<interface>/<virtual-router-id>/<ip-family> org.keepalived.Vrrp1.Instance. Для экземпляра IPv4 VRRP с идентификатором 1 на eth1 названный my-instance, получаем следующее:

# 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"

Возвращаемое свойство - это СТРУКТУРА с кодом состояния и понятным для человека именем. Состояния 0 "Init", 1 "Backup", 2 "Master", 3 "Fault", 4 "Goto master" и 98 "Goto fault". Последние три состояния являются внутренними и официальными состояниями RFC 2338.

Если вы используете несколько процессов keepalived и установите instance вариант или если вы используете функцию сетевого пространства имен с namespace опция, префикс пути меняется /org/keepalived/Vrrp1/<namespace>/<interface>.

Я использую эту простую строку:

service keepalived status | tail -1

Извините, но это не сработает, если в последней строке возникнут ошибки.