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

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

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

И така, според условията на проблема ни е дадена Zimbra OSE инфраструктура, която има два Zimbra Proxies, два 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 load balancer, който ще работи на входния възел на инфраструктурата на Zimbra, работеща с Ubuntu 18.04. Инсталирането на haproxy на тази операционна система се извършва с помощта на командата sudo apt-get инсталирайте haproxy. След това е необходимо във файла /etc/default/haproxy промяна на параметъра РАЗРЕШЕН=0 на РАЗРЕШЕН=1. Сега, за да се уверите, че haproxy работи, просто въведете командата услуга 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, до техните адреси е параметърът изпрати-прокси. Това е необходимо, така че в съответствие с промените, които направихме по-рано в настройките на Postfix, оригиналният IP адрес на неговия подател също се изпраща заедно с TCP пакетите.

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

За всички въпроси, свързани със Zextras Suite, можете да се свържете с представителя на Zextras Екатерина Триандафилиди по имейл [имейл защитен]

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

Добавяне на нов коментар