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

При этом проблема резервного питания решается адекватно рентабельности проекта и, так сказать, географических аспектов, т.е. использование бензиновых или дизельных генераторов для поддержания работы ЦОДа является нерентабельным даже без учета стоимости самого оборудования. Тем не менее, аварийное выключение серверов при пропадании напряжения в сети не желательно. Вы рискуете потерей некоторых файлов на диске, а также задержкой при включении вследствие автоматической проверки файловой системы некорректно завершившего работу сервера.

Каково же решение проблемы? Я предлагаю бюджетный вариант, основанный на автоматическом выключении основных серверов на интервале отсутствия напряжения сети. Для этого необходим один постоянно включенный сервер, назовем его сервером мониторинга, запитанный от источника бесперебойного питания с большой энергоемкостью, который каким-то образом осуществляет мониторинг наличия напряжения в питающей сети. Также необходимо обеспечить питание основных серверов в течении нескольких минут. Собственно говоря, идея проста: при пропадании напряжении сети на время, допустим, 60 сек, сервер мониторинга выключает основные сервера. При появлении напряжения в питающей сети, сервер мониторинга также с некоторой задержкой посылает серверам команду пробуждения по сети.

Аппаратно комплекс представляет собой сервер мониторинга на основе экономичной платформы, т.е. это может быть система на основе процессора Intel Atom или старенький хост на основе Intel Pentium III и i815. Энергопотребление такого компьютера составляет приблизительно 20-40 Вт. При питании его от ИБП с двумя аккумуляторными батареями 65 А*ч 12 В теоретически обеспечивается более чем 36 часов работы в автономном режиме. Этого вполне достаточно для отработки плановых или аварийных выключений электроэнергии продолжительностью до 12 часов, что наиболее вероятно в настоящее время. Современный производительный сервер потребляет приблизительно 150-180 Вт, таким образом на самый бюджетный ИБП мощностью 420 Вт (600 ВАР) может вытянуть только 2 сервера. Задача такого ИБП состоит в том, чтобы «продержаться» в течении 4-5 минут, пока сервера корректно завершат работу. Далее важно понимать один момент. Некоторые полагают, что в выключенном состоянии, но при подаче напряжения на плату от БП ATX, такой БП не потребляет энергии, а если и потребляет, то пренебрежимо мало. Это заблуждение, опровергнуть которое запросто можно, вооружившись амперметром переменного тока. В зависимости от «железа» различные сервера потребляют ток от 30 до 100 (!!) миллиампер, что соответствует 7,5-25 Вт. Именно поэтому подключение серверов к энергоемкому ИБП — непозволительная роскошь. Энергоемкость типового ИБП с аккумуляторной батареей 12 В, 7 А*ч составляет 75 Вт*ч. Из них за 5 минут работы серверов потребляется 25 Вт*ч. Оставшиеся 50 В*ч способны поддержать питание выключенных серверов максимум полтора-два часа. Далее ИБП просто выключится вследствие разряда аккумулятора до критического минимума и далее автоматически включится, при появлении напряжения в питающей сети, соответственно включаться и сервера (в BIOS разрешено автоматическое включение после возобновления питания). Если же напряжение в сети появится до момента выключения ИБП, сервера не смогут включится самостоятельно, именно тут нам поможет технология Wake on Lan.

На сервере мониторинга необходимо запустить скрипт, контролирующий напряжение питающей сети с некоторой дискретностью, скажем раз в 10 секунд. При пропадании напряжения на 6 интервала серверам посылается команда выключения по ssh. При появлении напряжения с задержкой 6 интервала серверам генерируется пакет пробуждения для серверов. В качестве датчика мониторингового сервера можно использовать ИБП с интерфейсом мониторинга (как сделал я), либо, совсем по-нищебродски, просто взять какой нибудь SOHO-маршрутизатор/модем, запитанный от сети, и контролировать его по icmp или по статуса сетевого интерфейса.

#!/usr/bin/perl

(LOG, ">> /var/log/ups.log");

my $int_on_bat = 0;
my $int_on_line = 0;
my $int_all = 0;

while ($int_all($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = ();
$mon=$mon+1;
$year=$year+1900;
if ($mday < 10) { $mday = '0'.$mday; }
if ($mon < 10) { $mon = '0'.$mon; }
$data = "$mday-$mon-$year $hour:$min:$sec";
$cmd = '/usr/local/bin/upsc PowerMust | /usr/bin/grep "ups.status:" | /usr/bin/awk '."'".'{ print $2 }'."'";
my $status = `$cmd`;
LOG "$data - $status \t takt`s on battery: $int_on_bat, takt`s on line: $int_on_line";
($status);
if ($status eq 'OB') {
$int_on_bat++;
$int_on_line = 0;
} else {
$int_on_bat = 0;
$int_on_line ++;
}
if ($int_on_bat == 6) {
LOG " 60 sec after line off\n";
("/usr/bin/su -l si -c '/usr/bin/ssh -l si 192.168.0.3 /usr/local/bin/sudo shutdown -p now'");
("/usr/bin/su -l si -c '/usr/bin/ssh -l si 192.168.0.4 /usr/local/bin/sudo shutdown -p now'");
("/usr/bin/touch /var/run/192.168.0.3.shut");
("/usr/bin/touch /var/run/192.168.0.4.shut");
LOG " Shutdown servers\n";
} else {
LOG "\n";
}
if ($int_on_line == 6) {
LOG " 60 sec after line on\n";
("/usr/local/bin/nut/wakeonlan.sh &");
("/bin/rm -f /var/run/192.168.0.3.shut");
("/bin/rm -f /var/run/192.168.0.4.shut");
LOG " WakeOnLan message send for servers\n";
}
(10);
$int_full++;
}
__END__

Создаем файл /usr/local/bin/nut/wakeonlan.sh следующего содержания:

#!/bin/sh

/usr/local/bin/wakeonlan -i 192.168.0.3 -p 40000 6c:62:8d:92:21:b6
/usr/local/bin/wakeonlan -i 192.168.0.4 -p 40000 00:19:d2:ce:b2:e8

0

Естественно, что необходимо поставить порт /usr/ports/net/wakeonlan, либо просто добавить пакет (pkg_add -r wakeonlan).
Добавляем задачу в crontab каждый час:

1 * * * * root /usr/local/etc/nut/ups.pl >/dev/null 2>&1

Вот и всё. Теперь мы имеем минимальный простой и минимальный ущерб от пропадания напряжения в питающей ЦОД сети.