Балансировка на натоварването в Zimbra Open-Source Edition с помощта на HAProxy

Една от основните задачи при изграждането на мащабни инфраструктури Zimbra OSE е правилното балансиране на натоварването. Освен че повишава устойчивостта на услугата, без балансировка на натоварването е невъзможно да се осигури еднаква реакция на услугата за всички потребители. За да се реши този проблем, се използват балансировачи на натоварването — софтуерни и хардуерни решения, които переразпределят заявките между сървърите. Сред тях има както доста примитивни, като RoundRobin, който просто насочва всяка следваща заявка към следващия в списъка сървър, така и по-напреднали, например HAProxy, който се използва широко в високо натоварени изчислителни инфраструктури поради редица значителни предимства. Нека да разгледаме как може да се осигури съвместна работа между балансировача на натоварването HAProxy и Zimbra OSE.

Балансировка на натоварването в Zimbra Open-Source Edition с помощта на HAProxy

И така, според условията на задачата имаме инфраструктура 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. Това е необходимо, за да се уверим, че заедно с TCP пакетите се прехвърля и оригиналният IP адрес на тяхния изпращач, в съответствие с извършените от нас промени в настройките на Postfix.

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

При всякакви въпроси, свързани с Zextras Suite, можете да се свържете с представителя на компанията "Zextras" Екатерина Триандафилиди на електронната поща katerina@zextras.com

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster