Настройка NUT: правильное отключение слейвов

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

reji
Сообщения: 81

Настройка NUT: правильное отключение слейвов

Сообщение reji »

Здравствуйте, уважаемые форумчане.

Пожалуйста, помогите разобраться, как работает NUT (Network UPS Tools).
В документации описан алгоритм завершения работы мастера и слейвов, но не могу понять, как гарантируется безопасное выключение слейвов, или как установить задержку, чтобы они успели завершить работу.

Вижу 2 пути:
1) Задать FINALDELAY или HOSTSYNC в upsmon.conf у мастера. Стоит ли поставить в HOSTSYNC время, нужное для выключения самого медленного слейва?
В этом случае, получается, серверы будут завершать работу последовательно: сперва слейвы, затем мастер.

2) Задать задержку выключения на самом UPS. Например, у моего UPS есть параметр ups.delay.shutdown, но он не доступен для записи с помощью upsrw. Его значения, 1 минуты, не хватит для завершения работы моих подопечных.

Пытаюсь разобраться с этим в такой среде:
2 сервера в стойке. Оба отвечают за виртуализацию. Бесперебойник APC Smart-UPS SC 1500VA подключен к одному из них. Они могут выключаться довольно долго, в зависимости от того, как долго выключаются виртуалки. Таймаут отключения виртуалок - 3 минуты. Плюс, порядок отключения такой, что сначала выключается большинство VM, потом VM с контроллерами домена. Теоретически серверы при "тупняках" виртуалок могут выключаться больше 6 минут.

Дистрибутив — Debian Wheezy (amd64) с доустановленным Proxmox 3.2.

Настройки NUT на сервере с подключенным UPS (без строк комментариев).
Spoiler

Код: Выделить всё

nut.conf:
MODE=netserver

ups.conf:
[apc]
        driver = apcsmart
        port = /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0
        desc = "APC Smart-UPS SC 1500VA (SC1500I)"
        ignorelb
        override.battery.charge.low = 10
        override.battery.runtime.low = 420

upsd.conf:
LISTEN 0.0.0.0

upsd.users:
[localmon]
        password = pa55word
        upsmon master
[server2]
        password = pa55word
        upsmon slave

upsmon.conf:
MONITOR apc 1 localmon pa55word master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Вывод upsc.
Spoiler

Код: Выделить всё

battery.alarm.threshold: 0
battery.charge: 100.0
battery.charge.low: 10
battery.charge.restart: 00
battery.date: 08/09/12
battery.runtime: 2700
battery.runtime.low: 420
battery.voltage: 26.93
battery.voltage.nominal: 024
device.mfr: APC
device.model: Smart-UPS SC1500
device.serial: серийник
device.type: ups
driver.flag.ignorelb: enabled
driver.name: apcsmart
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0
driver.version: 2.6.4
driver.version.internal: 3.04
input.frequency: 50.00
input.quality: FF
input.sensitivity: H
input.transfer.high: 253
input.transfer.low: 208
input.transfer.reason: line voltage notch or spike
input.voltage: 228.0
input.voltage.maximum: 228.0
input.voltage.minimum: 226.0
output.voltage: 228.0
output.voltage.nominal: 230
ups.delay.shutdown: 060
ups.delay.start: 000
ups.firmware: 738.3.I
ups.id: UPS_IDEN
ups.load: 026.0
ups.mfr: APC
ups.mfr.date: 08/09/12
ups.model: Smart-UPS SC1500
ups.serial: серийник
ups.status: OL
ups.test.interval: 1209600
ups.test.result: NO

Вывод upsrw.
Spoiler

Код: Выделить всё

[battery.date]
Battery change date
Type: STRING
Value: 08/09/12

[ups.id]
UPS system identifier
Type: STRING
Value: UPS_IDEN


P.S. Уже пробовал тушить все, и, вроде бы, выключалось нормально. Но непонимание может потом вылезти боком.
P.S.S. "Слейвом" я обозвал slave, машину, которая питается от UPS, но не управляет им : )
Спасибо сказали:
reji
Сообщения: 81

Re: Настройка NUT: правильное отключение слейвов

Сообщение reji »

reji писал(а):
21.05.2014 09:36
1) Задать FINALDELAY или HOSTSYNC в upsmon.conf у мастера. Стоит ли поставить в HOSTSYNC время, нужное для выключения самого медленного слейва?

HOSTSYNC задает время, в течении которого master ждет реакции от slave. Slave-системы сразу отключаются от upsd, как только видят флаг FSD (forced shutdown), так что задержки тут нет (я неправильно понял документацию).
FINALDELAY работает, но сервера отключаются последовательно: сначала все slave, затем master. Ничего такого, но не устраивало, что нужно ставить большую задержку в моем случае (и уменьшать время, которое сервера могли "повисеть" на батареях).

NUT не может программировать многие параметры моего UPS, но это может делать apctest из пакета apcupsd. Его я и выбрал для решения задачи, но сделал не как описано в варианте 2, а добавил задержку в скрипт /etc/apcupsd/killpower, вызываемый непосредственно перед отдачей UPS'у команды выключиться. Не хотелось ставить фиксированное время — оно может быть довольно большим, поэтому сделал, чтобы время паузы высчитывалось, исходя из времени, уже прошедшего с начала завершения работы системы.

Код: Выделить всё

MAXDELAY=420

if [ -f /etc/apcupsd/powerfail ]; then
        shutdown_start=$(stat -c %Y /etc/apcupsd/powerfail)
        delay=$((MAXDELAY + shutdown_start - $(date +%s)))
        if [ $delay -gt 0 ]; then
                sleep $delay
        fi
fi

Думаю, это же можно было сделать и с NUT, изменив скрипт /etc/init.d/nut-client. Не уверен, оправдан ли этот мудреж : )
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: Настройка NUT: правильное отключение слейвов

Сообщение nerve »

root@proxmox:~# grep START-TIMER /etc/nut/upssched.conf | grep -v "#"
AT ONBATT * START-TIMER shutdownnow 30000

регулируй это значение в зависимости от того сколько держит ИПБ.
соответственно на слейвах значение должно быть такое: время работы ИПБ от батарей минус время выключения слейва минус пара минут на реакцию - минус еще пару минут про запас.
на мастере можно время не считать и выключать по сигналу о полной разрядке, но лучше таки его высчитать и выключаться после слейвов.
Спасибо сказали: