Міжнародна конференція розробників
і користувачів вільного програмного забезпечення

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-адреса сайта на соседний сервер;
  • отправка администраторам уведомлений обо всех событиях.

Ссылки

1 http://www.linux-ha.org

2 http://mmonit.com/monit

3 http://sysoev.ru/nginx

4 http://php-fpm.org

5 http://www.mongodb.org

6 http://memcached.org

Лицензия Creative Commons
Текст тезисов доступен под лицензией Creative Commons Attribution-ShareAlike 3.0.