具有HAProxy的Zimbra开源版中的负载平衡

构建大型Zimbra OSE基础架构的主要任务之一是有效的负载平衡。 除了增加服务的容错能力外,如果没有负载平衡,就不可能为所有用户提供相同的服务响应能力。 为了解决此问题,使用了负载平衡器-在服务器之间重新分配请求的软件和硬件解决方案。 其中有一些相当原始的请求,例如RoundRobin,它仅将每个下一个请求发送到列表中的下一个服务器,还有更高级的请求,例如HAProxy,由于具有许多显着的优势而广泛用于高负载的计算基础架构中。 让我们看一下HAProxy和Zimbra OSE负载平衡器如何协同工作。

图片

因此,根据任务的条件,我们获得了Zimbra OSE基础结构,其中有两个Zimbra代理,两个LDAP和LDAP副本服务器,四个邮件存储库(每个存储有1000个邮箱)和三个MTA。 考虑到我们正在处理电子邮件服务器,它将收到需要平衡的三种流量:用于下载Web客户端的HTTP,以及用于发送电子邮件的POP和SMTP。 同时,HTTP流量将流向IP地址为192.168.0.57和192.168.0.58的Zimbra代理服务器,而SMTP流量将流向IP地址为192.168.0.77和192.168.0.78的MTA服务器。

如前所述,为了确保服务器之间请求的均匀分配,我们将使用HAProxy负载平衡器,该负载平衡器将在运行Ubuntu 18.04的Zimbra基础结构的输入节点上运行。 使用sudo apt-get install haproxy命令在此操作系统上安装haproxy 。 之后,在/ etc / default / haproxy文件中,ENABLED = 0参数更改为ENABLED = 1 。 现在,要确保haproxy正常运行,只需输入service haproxy命令 。 如果该服务有效,则将在命令输出中将其清除。

HAProxy的主要缺点之一是,默认情况下,它不传输连接的客户端的IP地址,而是用自己的IP地址代替它。 这可能导致无法通过IP地址识别攻击者发送的信件并将其添加到黑名单的情况。 但是,此问题可以解决。 为此,请在具有Postfix的服务器上编辑文件/opt/zimbra/common/conf/master.cf.in并向其中添加以下行:

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的传入流量。 保存文件后,应使用zmmtactl restart命令在所有服务器上重新启动Postfix。

之后,让我们开始设置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设置所做的更改,将发送方的原始IP地址与TCP数据包一起发送。

现在,已经对HAProxy进行了所有必要的更改,您可以使用service haproxy restart命令重新启动服务并开始使用它。

有关Zextras Suite的所有问题,您可以通过电子邮件katerina@zextras.com与Zextras代表联系,Ekaterina Triandafilidi。

Source: https://habr.com/ru/post/zh-CN479536/


All Articles