Как стать автором
Обновить
72.27
Zextras
Цифровое рабочее место Zextras

Балансировка нагрузки в Zimbra Open-Source Edition при помощи HAProxy

Время на прочтение 5 мин
Количество просмотров 3.2K
Одной из главных задач при построении масштабных инфраструктур Zimbra OSE является грамотная балансировка нагрузки. Помимо того, что она повышает отказоустойчивость сервиса, без балансировки нагрузки невозможно обеспечить одинаковую отзывчивость сервиса для всех пользователей. Для того, чтобы решить эту задачу, используются балансировщики нагрузки — программные и аппаратные решения, перераспределяющие запросы между серверами. Среди них есть как довольно примитивные, вроде RoundRobin, который просто каждый следующий запрос направляет следующему в списке серверу, а есть и более продвинутые, например HAProxy, который широко применяется в высоконагруженных вычислительных инфраструктурах из-за ряда весомых достоинств. Давайте же посмотрим на то, как можно обеспечить совместную работу балансировщика нагрузки HAProxy и Zimbra OSE.

image

Итак, по условиям задачи нам дана инфраструктура Zimbra OSE, в которой имеются два Zimbra Proxy, два сервера LDAP и LDAP Replica, четыре почтовых хранилища с 1000 почтовых ящиков на каждом и три MTA. Учитывая то, что мы имеем дело с почтовым сервером, на него будет поступать три вида трафика, нуждающегося в балансировке: HTTP для загрузки веб-клиента, а также POP и SMTP для пересылки электронной почты. При этом HTTP-трафик будет уходить на серверы Zimbra Proxy с ip-адресами 192.168.0.57 и 192.168.0.58, а трафик SMTP будет уходить на MTA-серверы с ip-адресами 192.168.0.77 и 192.168.0.78.

Как уже говорилось, для обеспечения равномерного распределения запросов между серверами мы будем использовать балансировщик нагрузки HAProxy, который будет работать на входном узле инфраструктуры Zimbra под управлением Ubuntu 18.04. Установка haproxy в этой операционной системе осуществляется при помощи команды sudo apt-get install haproxy. После этого необходимо в файле /etc/default/haproxy изменить параметр ENABLED=0 на ENABLED=1. Теперь, для того, чтобы убедиться в том, что haproxy работает, достаточно ввести команду service haproxy. В том случае, если эта служба работает, это будет понятно по выводу команды.

Одним из главных недочетов HAProxy является то, что он по умолчанию не передает IP-адрес подключаемого клиента, подменяя его своим собственным. Это может привести к ситуациям, когда присылаемые злоумышленниками письма нельзя будет идентифицировать по IP-адресу, чтобы добавить его в черный список. Впрочем, этот вопрос можно решить. Для этого необходимо отредактировать файл /opt/zimbra/common/conf/master.cf.in на серверах с Postfix и добавить в него следующие строки:

26      inet  n       -       n       -       1       postscreen
        -o postscreen_upstream_proxy_protocol=haproxy
 
466    inet  n       -       n       -       -       smtpd
%%uncomment SERVICE:opendkim%%  -o content_filter=scan:[%%zimbraLocalBindAddress%%]:10030
        -o smtpd_tls_wrappermode=yes
        -o smtpd_sasl_auth_enable=yes
        -o smtpd_client_restrictions=
        -o smtpd_data_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_recipient_restrictions=
        -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
        -o syslog_name=postfix/smtps
        -o milter_macro_daemon_name=ORIGINATING
        -o smtpd_upstream_proxy_protocol=haproxy
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_filter=[%%zimbraLocalBindAddress%%]:10027
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_options=speed_adjust
 
588 inet n      -       n       -       -       smtpd
%%uncomment SERVICE:opendkim%%  -o content_filter=scan:[%%zimbraLocalBindAddress%%]:10030
        -o smtpd_etrn_restrictions=reject
        -o smtpd_sasl_auth_enable=%%zimbraMtaSaslAuthEnable%%
        -o smtpd_tls_security_level=%%zimbraMtaTlsSecurityLevel%%
        -o smtpd_client_restrictions=permit_sasl_authenticated,reject
        -o smtpd_data_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_recipient_restrictions=
        -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
        -o syslog_name=postfix/submission
        -o milter_macro_daemon_name=ORIGINATING
        -o smtpd_upstream_proxy_protocol=haproxy
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_filter=[%%zimbraLocalBindAddress%%]:10027
%%uncomment LOCAL:postjournal_enabled%% -o smtpd_proxy_options=speed_adjust

За счет этого мы откроем порты 26, 466 и 588, которые будут принимать входящий трафик из HAProxy. После того как файлы будут сохранены, следует перезапустить Postfix на всех серверах с помощью команды zmmtactl restart.

После этого приступим к настройке HAProxy. Для этого сперва создадим резервную копию файла с настройками cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak. Затем откроем в текстовом редакторе исходный файл /etc/haproxy/haproxy.cfg и начнем поэтапно добавлять в него необходимые настройки. Первым блоком станет добавление сервера, снимающего логи, установка максимально разрешенного числа одновременных подключений, а также указание имени и группы пользователя, к которому будет относиться исполняемый процесс.

global
    user daemon
    group daemon
    daemon
    log 127.0.0.1 daemon
    maxconn 5000
    chroot /var/lib/haproxy

Цифра в 5000 одновременных подключений появилась неспроста. Поскольку в нашей инфраструктуре 4000 почтовых ящиков, необходимо предусмотреть вероятность того, что все они одновременно зайдут в свою рабочую почту. Кроме того, необходимо оставить небольшой запас на тот случай, если их число увеличится.

Теперь добавим блок с настройками по умолчанию:

defaults
        timeout client 1m
        log global
        mode tcp
        timeout server 1m
        timeout connect 5s

В этом блоке задается максимальное время ожидания клиента и сервера, чтобы разрывать соединение при его истечении, а также задается режим работы HAProxy. В нашем случае балансировщик нагрузки работает в режиме TCP, то есть просто передает пакеты TCP не анализируя их содержимое.

Далее мы добавим правила для соединений на различных портах. Например, если порт 25 используется для SMTP-подключений и передачи почты, то имеет смысл перенаправлять подключения к нему на MTA, имеющиеся в нашей инфраструктуре. Если же соединение идет на порту 80, то это http-запрос, который необходимо переправить на Zimbra Proxy.

Правило для порта 25:

frontend smtp-25
bind *:27
default_backend backend-smtp-25
 
backend backend-smtp-25
server mta1 192.168.0.77:26 send-proxy
server mta2 192.168.0.78:26 send-proxy

Правило для порта 465:

frontend smtp-465
bind *:467
default_backend backend-smtp-465

backend backend-smtp-465
server mta1 192.168.0.77:466 send-proxy
server mta2 192.168.0.78:466 send-proxy

Правило для порта 587:

frontend smtp-587
bind *:589
default_backend backend-smtp-587
 
backend backend-smtp-587
server mail1 192.168.0.77:588 send-proxy
server mail2 192.168.0.78:588 send-proxy

Правило для порта 80:

frontend http-80
bind    *:80
default_backend http-80
 
backend http-80
mode tcp
server zproxy1 192.168.0.57:80 check
server zproxy2 192.168.0.58:80 check

Правило для порта 443:

frontend https
bind  *:443
default_backend https-443
 
backend https-443
mode tcp
server zproxy1 192.168.0.57:80 check
server zproxy2 192.168.0.58:80 check

Обратите внимание, что что в правилах для пересылки TCP-пакетов к MTA рядом с их адресами стоит параметр send-proxy. Это нужно для того, чтобы, в соответствии с внесенными нами ранее изменений в настройки Postfix, вместе с TCP-пакетами пересылался и оригинальный IP-адрес его отправителя.

Теперь, когда все необходимые изменения в HAProxy внесены, можно перезапустить сервис при помощи команды service haproxy restart и приступать к его использованию.

По всем вопросам, связанными c Zextras Suite вы можете обратиться к Представителю компании «Zextras» Екатерине Триандафилиди по электронной почте ekaterina.triandafilidi@zextras.com
Теги:
Хабы:
+5
Комментарии 0
Комментарии Комментировать

Публикации

Информация

Сайт
zextras.com
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Индия
Представитель
Триандафилиди Екатерина