Балансаванне нагрузкі ў 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/XNUMX. Усталяванне 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 і прыступаць да яго выкарыстання.

Па ўсіх пытаннях, звязаных з Zextras Suite вы можаце звярнуцца да Прадстаўніка кампаніі «Zextras» Кацярыны Трыяндафілідзі па электроннай пошце. [электронная пошта абаронена]

Крыніца: habr.com

Дадаць каментар