Heartbeat: построение отказоустойчивого кластера
Yura Volkovich, Minsk, Belarus
LVEE 2012
Report presents an approach to build a cluster for web server, as well as author’s personal experience and some interesting decisions in this matter.
В рамках данной темы под кластером понимается система высокой доступности, т.е. построенная с расчетом того, что она продолжает работать безотказно, даже если какая-то ее часть выходит из строя.
Heartbeat – продукт проекта Linux-HA 1, позволяющий реализовать механизм безотказной работы отдельных частей кластера.
Задача
Решаемая задача заключалась в построении отказоустойчивого кластера из двух web-серверов, которые могут моментально заменить друг друга в случае выхода из строя одного из них. Сервер предназначен для авторизации на таких сайтах, как irr.ru, job.ru и др., аудитория которых насчитывает несколько миллионов пользователей в сутки, поэтому его значимость для компании достаточно велика.
Используемое ПО:
Законченное решение было построено на следующем наборе программных продуктов:
- heartbeat (поднимает виртуальный ip и проверяет доступность соседнего сервера);
- monit 2 (следит за правильной работой демонов, обслуживающих сайт);
- web-сервер (связка nginx 3, php-fpm 4, mongodb 5, memcache 6).
Схема взаимодействия демонов
Для начала поднимаются два сервера NODE_1 и NODE_2, на которых запущена работающая версия сайта. Затем на оба сервера подключается heartbeat. Он должен “держать” виртуальный адрес virt_ip и следить за доступностью соседнего сервера, а при сбое на текущем – передавать virt_ip heartbeat’у соседнего сервера. Однако, этого не достаточно для полного отслеживания того, работает ли сайт, поскольку heartbeat не обладает возможностью проверять работоспособность базы данных mongodb либо других используемых сервисов. Эти задачи можно делегировать демону monit, настроенному для проверки того, работают ли все необходимые демоны.
На данном этапе конфигурация, в принципе, является завершенной, и если какой-то из демонов на мастер-сервере “упадет”, обслуживание сайта немедленно будет перенаправлено на второй сервер. Но, как показала практика, и этого оказывается недостаточно в случае, когда демон работает, но при этом выдает неверные данные, либо просто “зависает”, захватив все наличные ресурсы. Для решения данной проблемы нами было написано несколько небольших скриптов, которые запускаются по cron’у и проверяют такие параметры, как репликацию в memcached и mongodb, отдачу http-трафика через php-fpm и др. менее значительные нюансы. И в случае, если проверка не проходит, в скрипте (как и в monit) выполняется команда hb_standby, которая заставляет heartbeat принудительно отдать virt_ip на slave-сервер, если таковой имеется.
Конфигурация демонов
Ниже приведены ключевые параметры, использованные нами при конфигурировании:
heartbeat
- haresources
passport1.pronto.ru IPaddr::194.87.222.180/27/eth0 nginx
- ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth1 192.168.0.2
auto_failback off
node passport1.pronto.ru passport2.pronto.ru
ping_group ping_nodes 8.8.8.8
respawn hacluster /usr/lib/heartbeat/ipfail
deadping 30
use_logd yes
debug 1
monit
- monitrc
check process nginx
with pidfile "/var/run/nginx.pid"
start program = "/etc/init.d/nginx start"
stop program = "/etc/init.d/nginx stop"
group www
Тестирование
При проверке работоспособности системы мы использовали следующие способы нарушения работоспособности сайта:
- моментальное отключение питания на мастер-ноде;
- падение интерфейса на мастер-ноде;
- падение любого из демонов, обслуживающего сайт;
- нарушение репликации memcached и mongodb.
Результатом любого из перечисленных событий являлось
- моментальное переключение ip-адреса сайта на соседний сервер;
- отправка администраторам уведомлений обо всех событиях.
Ссылки
Текст тезисов доступен под лицензией Creative Commons Attribution-ShareAlike 3.0.