Есть ли способ просмотреть текущее состояние (основное / резервное) с помощью командной строки внутри экземпляра сервера?
Ура
Вы можете использовать команду 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:
и установите 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
Извините, но это не сработает, если в последней строке возникнут ошибки.