6 Настройка балансировщиков нагрузки
Зачем нужен балансировщик перед MySQL-кластером
У нас есть кластер MySQL с двумя узлами: sql1.example.com и sql2.example.com. Без единого адреса приложения вынуждены напрямую распределять нагрузку между узлами. Это усложняет конфигурацию и увеличивает риск простоев: если один узел недоступен, клиенты, направленные на него, перестанут работать.
Решение — поставить перед кластером виртуальный IP, за которым стоят балансировщики. Балансировщик распределяет запросы между узлами и при падении одного узла перенаправляет трафик на работующий. Чтобы сам балансировщик не стал единой точкой отказа, используем два сервера loadb1.example.com и loadb2.example.com в active/passive (горячий резерв).
Важно: оба балансировщика должны поддерживать IPVS (IP Virtual Server) в ядре. IPVS реализует балансировку на транспортном уровне прямо в ядре Linux.
6.1 Установка Ultra Monkey
Ниже — пошаговая инструкция для loadb1.example.com и loadb2.example.com.
1) Включение модулей IPVS
Сначала загрузите модули в текущую сессию:
modprobe ip_vs_dh
modprobe ip_vs_ftp
modprobe ip_vs
modprobe ip_vs_lblc
modprobe ip_vs_lblcr
modprobe ip_vs_lc
modprobe ip_vs_nq
modprobe ip_vs_rr
modprobe ip_vs_sed
modprobe ip_vs_sh
modprobe ip_vs_wlc
modprobe ip_vs_wrrЧтобы модули подгружались при загрузке системы, добавьте их в /etc/modules:
vi /etc/modulesСодержимое файла должно включать следующие строки:
ip_vs_dh
ip_vs_ftp
ip_vs
ip_vs_lblc
ip_vs_lblcr
ip_vs_lc
ip_vs_nq
ip_vs_rr
ip_vs_sed
ip_vs_sh
ip_vs_wlc
ip_vs_wrr2) Подключение репозиториев и установка Ultra Monkey
Отредактируйте /etc/apt/sources.list и добавьте репозитории Ultra Monkey (не удаляйте существующие репозитории):
vi /etc/apt/sources.listДобавьте строки:
deb http://www.ultramonkey.org/download/3/ sarge main
deb-src http://www.ultramonkey.org/download/3 sarge mainЗатем обновите индексы пакетов и установите пакеты:
apt-get update
apt-get install ultramonkey libdbi-perl libdbd-mysql-perl libmysqlclient14-devВо время установки может появиться предупреждение о libsensors3 и поддержке датчиков в ядре. Это можно проигнорировать, если вы не используете аппаратные датчики:
¦ libsensors3 not functional ¦
¦ ¦
¦ It appears that your kernel is not compiled with sensors support. As a ¦
¦ result, libsensors3 will not be functional on your system. ¦
¦ ¦
¦ If you want to enable it, have a look at "I2C Hardware Sensors Chip ¦
¦ support" in your kernel configuration. ¦При появлении вопросов установки отвечайте, как в исходной инструкции:
Do you want to automatically load IPVS rules on boot?
<– No
Select a daemon method.
<– none
3) Обновление Perl-модуля DBD::mysql
Пакет libdbd-mysql-perl в дистрибутивных репозиториях может быть несовместим с MySQL 5. Установите более новую версию DBD::mysql из CPAN (пример для версии в инструкции):
cd /tmp
wget http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-3.0002.tar.gz
tar xvfz DBD-mysql-3.0002.tar.gz
cd DBD-mysql-3.0002
perl Makefile.PL
make
make installПримечание: можно установить более новую версию DBD::mysql через cpan или apt, если она доступна для вашей системы.
4) Включение пересылки пакетов (IP forwarding)
Отредактируйте /etc/sysctl.conf и включите IP forwarding:
vi /etc/sysctl.confДобавьте или отредактируйте строку:
# Enables packet forwarding
net.ipv4.ip_forward = 1Примените изменения:
sysctl -pНастройка heartbeat и ldirectord (кратко)
Ultra Monkey обеспечивает интеграцию heartbeat (мониторинг состояния вторичного балансировщика и свободы виртуального IP) и ldirectord (сам механизм балансировки запросов на уровне IPVS). В типовой конфигурации:
- Один узел (loadb1) держит виртуальный IP и обрабатывает трафик (active).
- Второй узел (loadb2) периодически проверяет состояние active; при падении — захватывает virtual IP (passive → active).
- ldirectord распределяет входящие соединения по реальным бэкенд-узлам (sql1, sql2) на основании выбранной схемы (round-robin, least-conn и т.д.).
Полные конфигурационные файлы зависят от вашей сети и политики проверки состояния (check scripts, port checks, tcp-checks). Проверьте примеры в /etc/ultramonkey/ и документацию ldirectord.
Важные замечания
Важно: перед тем как вводить балансировщики в продуктив, прогоните нагрузочные тесты и сценарии переключения. Проверяйте сетевую маршрутизацию, firewall и правила NAT, чтобы виртуальный IP был доступен только тем хостам, которым разрешён доступ к MySQL.
Примечание: при использовании MySQL-кластера убедитесь, что клиентские приложения корректно работают при переключении соединений (timeout, retry, connection pooling).
Чек-лист для развёртывания (роль: инженер платформы)
- Убедиться, что ядро поддерживает IPVS или собрать ядро с нужными опциями.
- [ ] Загрузить модули ipvs* и добавить их в /etc/modules.
- Настроить репозитории и установить ultramonkey + зависимости.
- Переустановить/обновить DBD::mysql, если требуется совместимость с MySQL 5.
- Включить net.ipv4.ip_forward и применить sysctl.
- Настроить heartbeat для управления виртуальным IP в active/passive.
- Настроить ldirectord с health-check для sql1/sql2.
- Протестировать failover и восстановление вручную.
- Настроить мониторинг и алерты на падение виртуального IP или service-level.
Чек-лист для разработчика приложения
- Использовать виртуальный IP балансировщика в конфигурации БД.
- Готовность к кратковременным сбоям — реализовать повторные попытки подключения.
- Проверить поведение connection pool при сбросе соединений.
Критерии приёмки
- Виртуальный IP корректно находится на active-балансировщике при нормальном состоянии.
- При выключении active балансировщика virtual IP автоматически переносится на passive в пределах ожидаемого RTO.
- ldirectord распределяет трафик между sql1 и sql2 согласно выбранной политике.
- Приложения продолжают выполнять запросы к БД без ручной перенастройки.
- Мониторинг фиксирует переключения и отправляет уведомления.
Альтернативные подходы
- keepalived + IPVS или keepalived + HAProxy: keepalived предоставляет VRRP для виртуального IP и может работать с IPVS; HAProxy выполняет балансировку на уровне приложения (L7).
- Hardware LB: использовать физические балансировщики (F5 и т. п.) при высоких SLA и сетевых требованиях.
Когда Ultra Monkey может не подойти
- Если требуется сложная балансировка на уровне HTTP/SQL (L7) с глубоким разбором протокола — лучше HAProxy.
- Если инфраструктура требует централизованного управления конфигурацией LB (например, в облаке) — использовать нативные облачные LB-сервисы.
Технический шпаргалка (cheat sheet)
Команды для проверки:
# Проверить, загружены ли модули IPVS
lsmod | grep ip_vs
# Убедиться, что виртуальный IP присутствует (после конфигурации)
ip addr show
# Проверить правила IPVS
ipvsadm -L -n
# Перезапустить ultramonkey или связанные сервисы
service ultramonkey restart
service ldirectord restart
service heartbeat restartОтладка и типичные проблемы
Проблема: virtual IP не переходит на standby.
- Проверить связь heartbeat между узлами (firewall, ICMP/UDP порты).
- Проверить права на управление IP (capabilities, systemd unit).
Проблема: соединения закрываются при failover.
- Настроить более мягкие таймауты на клиентской стороне и implement retry logic.
Проблема: ldirectord не видит backend-узлы.
- Убедиться, что health-check скрипты корректны и порты слушаются на sql1/sql2.
Мини-методология развертывания (шаги)
- Подготовить образы/шаблоны ОС с поддержкой IPVS.
- Развернуть два балансировщика и два MySQL-узла в изолированной сети тестирования.
- Настроить IPVS-модули и установить Ultra Monkey.
- Настроить heartbeat/ldirectord и прописать virtual IP.
- Выполнить тесты отказоустойчивости и нагрузочные тесты.
- Перенести в продакшн поэтапно, отслеживая SLA.
Риски и смягчение
- Риск: балансировщики находятся в одной сети/рубежном оборудовании — единая точка отказа. Смягчение: географически/сегментарно распределить балансировщики.
- Риск: некорректные health-checks маскируют проблемы бэкенда. Смягчение: использовать более строгие проверки (проверка SQL-запросом в дополнение к TCP-port check).
Итог
Установка Ultra Monkey с IPVS, heartbeat и ldirectord даёт простой путь к отказоустойчивой балансировке MySQL-кластера на уровне сети. Главное — правильно настроить модули ядра, health-checks, поведение клиентов при переключениях и протестировать все сценарии.
Важно: рассмотрите альтернативы (keepalived + HAProxy или облачные LB) если вам нужны L7-возможности или централизованное управление.
flowchart TD
A[Запрос клиента] --> B{Балансировщик active}
B -->|ldirectord| C[sql1.example.com]
B -->|ldirectord| D[sql2.example.com]
B --> E{Active упал?}
E -->|да| F[Standby захватывает virtual IP]
F --> BПохожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента