Балансировка нагрузки через HAProxy
HAProxy предоставляет единый адрес веб-интерфейса, SMTP или IMAP и направляет новые соединения на доступные узлы Клавдия. Используйте его, если соответствующая роль включена на нескольких узлах.
Перед началом
- Настройте {{ССЫЛКА:install.multinode|многоузловой кластер}}.
- Установите HAProxy и обеспечьте доступ от него к портам нужных служб.
- Подготовьте DNS-имя, например
klavdii.example, и сертификат для этого имени. - Проверьте
SMTP{{ССЫЛКА:install.smtp-service|SMTP}} иIMAP{{ССЫЛКА:install.imap-service|IMAP}} прямым подключением к каждому узлу. - Сохраните копию действующей конфигурации HAProxy.
В примерах узлы имеют адреса 10.0.0.1 и 10.0.0.2. Замените их своими адресами. Порты должны совпадать с [Размещением слушателей] на узлах.
Выберите способ обработки TLS
Для веб-интерфейса ниже используется передача HTTPS без расшифрования на HAProxy: TLS завершается на узле Клавдия. Сертификат на каждом узле должен подходить для общего DNS-имени. Такая схема сохраняет штатную настройку {{ССЫЛКА:install.tls-web|TLS-сертификата публичных служб}}.
Для SMTP и IMAP HAProxy также передаёт TCP-соединение без изменения. Если служба использует TLS или STARTTLS, защищённое соединение устанавливается с узлом Клавдия.
Настройте веб-интерфейс
Добавьте в /etc/haproxy/haproxy.cfg:
frontend klavdii_wui
bind *:443
mode tcp
timeout client 1h
default_backend klavdii_wui_nodes
backend klavdii_wui_nodes
mode tcp
balance leastconn
timeout connect 5s
timeout server 1h
option tcp-check
server node1 10.0.0.1:8001 check inter 5s fall 3 rise 2
server node2 10.0.0.2:8001 check inter 5s fall 3 rise 2
Проверка TCP подтверждает доступность порта, но не готовность базы, хранилища и поиска. Для контроля компонентов используйте {{ССЫЛКА:maintenance.dashboard|панель состояния}} и внешний мониторинг.
Если TLS завершается на HAProxy
Если в вашей инфраструктуре принято расшифровывать HTTPS на балансировщике, замените только блоки веб-интерфейса следующим вариантом:
frontend klavdii_wui
bind *:443 ssl crt /etc/ssl/private/klavdii.pem
mode http
timeout client 1h
default_backend klavdii_wui_nodes
backend klavdii_wui_nodes
mode http
balance leastconn
timeout connect 5s
timeout server 1h
timeout tunnel 1h
option httpchk GET /api/cluster/self-uid
http-check expect status 200
server node1 10.0.0.1:8001 check inter 5s fall 3 rise 2
server node2 10.0.0.2:8001 check inter 5s fall 3 rise 2
Файл klavdii.pem должен содержать сертификат, цепочку и закрытый ключ. В этом варианте порт 8001 на узлах должен принимать HTTP. Если сертификат веб-интерфейса задаётся через KLVD_WEB_SSL_CERT, пустое значение отключает этот файловый источник; сертификат, заданный через веб-интерфейс, необходимо учитывать отдельно. Порядок настройки сертификатов: {{ССЫЛКА:install.tls-web|TLS-сертификат веб-интерфейса и публичных служб}}.
Не меняйте TLS хранилища, Solr, SMTP или IMAP ради балансировки веб-интерфейса. Доступ к незашифрованному порту веб-интерфейса разрешите только из доверенной сети, в том числе от HAProxy.
Перед включением проверки HTTP убедитесь, что прямой запрос /api/cluster/self-uid возвращает 200 без перенаправления на вход. Если установленная версия требует аутентификацию, используйте проверку TCP или доступный для мониторинга маршрут. Ответ 401 не означает, что узел неисправен.
Настройте SMTP
frontend klavdii_smtp
bind *:25
mode tcp
timeout client 10m
default_backend klavdii_smtp_nodes
backend klavdii_smtp_nodes
mode tcp
balance leastconn
timeout connect 5s
timeout server 10m
option tcp-check
server node1 10.0.0.1:25 check inter 5s fall 3 rise 2
server node2 10.0.0.2:25 check inter 5s fall 3 rise 2
Для SMTPS замените порт внешнего слушателя и порты узлов на фактически настроенные, например 465. Одна замена bind не включит TLS на сервере SMTP.
При TCP-проксировании узел видит адрес HAProxy. В разрешённых сетях SMTP учитывайте этот адрес, а доступ отправителей ограничивайте на балансировщике или межсетевом экране.
Настройте IMAP
frontend klavdii_imap
bind *:993
mode tcp
timeout client 1h
default_backend klavdii_imap_nodes
backend klavdii_imap_nodes
mode tcp
balance leastconn
timeout connect 5s
timeout server 1h
option tcp-check
server node1 10.0.0.1:993 check inter 5s fall 3 rise 2
server node2 10.0.0.2:993 check inter 5s fall 3 rise 2
Один IMAP-сеанс обслуживается одним узлом. После отказа этого узла клиент должен переподключиться; существующее соединение не переносится на другой сервер.
Примените и проверьте конфигурацию
-
Проверьте синтаксис:
sudo haproxy -c -f /etc/haproxy/haproxy.cfg -
Если ошибок нет, примените конфигурацию:
sudo systemctl reload haproxy -
Откройте
https://klavdii.example, войдите и найдите тестовое письмо. -
Отправьте тестовое письмо через SMTP и подключитесь к архиву по IMAP через адрес HAProxy.
-
В согласованное окно обслуживания проверьте отказ одного узла. Дождитесь исключения узла из балансировки и повторите подключение.
Один HAProxy остаётся единой точкой отказа. Для отказоустойчивого входа требуется резервирование самого балансировщика. Недоступность общей PostgreSQL или координатора ZooKeeper также не устраняется балансировкой.
{{СКРИНШОТ}}
Если подключение не работает
- Проверьте журнал:
journalctl -u haproxy. - Проверьте адрес, порт, состояние роли и доступность каждого узла с сервера HAProxy.
- При ошибке сертификата проверьте соответствие общего DNS-имени сертификату.
- При проверке HTTP сопоставьте фактический код ответа с
http-check expect.
Распределение с учётом нагрузки
leastconn направляет новое соединение на узел с меньшим числом активных соединений. Для фиксированного соотношения можно задать weight в строках server.
Для динамического веса доступен /api/cluster/load: ответ OK <score>, диапазон оценки 0–400; меньшее значение означает меньшую нагрузку. Такой вариант требует отдельного скрипта, который опрашивает узлы и меняет веса через средства управления HAProxy. Приведённые конфигурации этот скрипт не включают.
Связанные материалы
{{ССЫЛКА:install.integration-zabbix|Мониторинг черезZabbixZabbix}}{{ССЫЛКА:install.integration-prometheus|Мониторинг через Prometheus иGrafanaGrafana}}- Документация HAProxy: параметры конфигурации
Навигация по книге
- Следующая статья: {{ССЫЛКА:install.integration-zabbix|Мониторинг через
ZabbixZabbix}}