搭建高可用的邮件服务器集群

大家好!从今天开始,我将用一系列文章,详细介绍如何搭建一个有高可用和容错能力的邮件服务器集群。我将使用三台节点服务器,一步步构筑出邮件服务器集群。

邮件服务器和普通网站服务器不同,服务器间的同步需求非常高,包括各种文件、数据、消息队列、索引、垃圾邮件规则,等等。如果使用传统的Postfix + MySQL架构,那么邮件服务器集群的搭建是非常困难的。因此,在这个系列中,我将使用Stalwart Mail Server这套专门为集群优化的邮件服务器系统来实现高可用的邮件服务器集群部署。

整套教程将包括下面一系列的文章:

  1. 邮件服务器集群的架构与基本设置(本文)
  2. FoundationDB数据库集群的部署
  3. ElasticSearch全文索引数据库集群的部署
  4. Redis缓存数据库集群的部署
  5. Stalwart Mail Server的集群部署与配置
  6. HAProxy均衡负载节点的部署(可选)

下面,就开始本系列的第一个部分。本文作者为香菇肥牛,原文链接为https://qing.su/article/high-availability-mail-server-cluster-stalwart-mail.html, 转载请注明原文链接,谢谢。


1. 邮件服务器集群的架构

对于传统的基于Exim/Sendmail/Postfix的邮件服务器而言,搭建集群是非常困难的,其主要的难点就在于服务器间的实时数据同步。和普通网站服务器不同,邮件服务器需要同步的数据种类非常多,包括各种文件、数据、消息队列、索引、垃圾邮件规则等。传统的邮件服务器系统缺少对于这些信息的精细调度。因此,我们通常的做法是建立一台主服务器和一台副服务器(通过MX优先级来调控)。当主服务器宕机时,用户无法使用邮件服务,但是这期间收到的邮件会暂时存在服务器的发信队列中;当主服务器恢复后,再由副服务器将队列中的邮件转发至主服务器,因此不会漏掉收信。

这种简易的failover方案显然是不完美的。首先,如果主服务器硬盘损坏,那么用户的邮件就丢失了。其次,主服务器宕机期间,用户无法实时收发邮件。

而使用Stalwart Mail Server, 我们可以轻松地构建出一套完整的高可用的邮件服务器集群。Stalwart程序对于集群化部署的支持非常优异。以三节点集群部署的Stalwart集群为例,当一台服务器宕机时,另外两台服务器可以继续工作,不会受到影响,而用户可以无感知地进行邮件收发。如果一台服务器的硬盘损坏,那么更换硬盘且接入节点后,另外两台服务器会逐渐恢复这台服务器的数据。

下图是整个集群的完整架构。

实现这个集群,我们需要部署:1, FoundationDB数据库集群; 2, ElasticSearch全文索引数据库集群; 3, Redis缓存数据库集群; 4, Stalwart收发服务器集群; 5, S3存储集群.  我们还可以配置负载均衡节点,但这不是必须的。而S3存储集群我们可以使用Cloudflare R2, BackBlaze B2等现成的服务,当然您也可以使用MinIO来部署自己的S3存储集群(MinIO集群不包含在本教程系列中)。

在本系列的接下来几篇文章中,我们将一步步完整实现上面整个集群的搭建。


2. 服务器硬件配置与域名解析

邮件服务器集群对于服务器的硬件需求较高。以3节点的集群为例,每个节点建议配备2核CPU与8 GB或更高的内存。如果您需要添加负载均衡节点,那么每个HAProxy节点需要1核CPU与2 GB以上的内存。

本系列的文章中,全部服务器均为Debian 12操作系统;您可以按照自己的操作习惯使用其他系统。

节点服务器可以做内网互联,也可以直接在公网互联。如果公网互联,那么最好是选择距离相对较近的服务器,否则网络会比较慢。

假设您的域名为qing.su, 三台服务器的公网IP分别为 77.77.77.77, 88.88.88.88, 99.99.99.99.  请分别解析一个A记录至这三个IP地址。比如,我做了下面的解析。

节点代号DNS 记录类型解析域名解析地址
AA记录mxa.qing.su77.77.77.77
BA记录mxb.qing.su88.88.88.88
CA记录mxc.qing.su99.99.99.99

 

本系列的其余文章中,将统一使用上面的示例域名与IP,不再进行额外说明。


3. 防火墙及其他设置

任何一个系统,安全性都是重中之重。邮件服务器集群更是如此。建议给您的服务器设置好SSH密钥登录、禁止密码登录,并且配置好fail2ban.

在邮件服务器集群中,每台节点服务器之间都需要进行大量的通信。一般来说,这些通信端口只需要这几台节点能互相访问即可。为了更好的安全性,我们应该屏蔽其他地址访问这些通信端口。因此,我们需要配置防火墙规则。

1
apt-get install -y iptables-persistent

首先,每台节点服务器可以允许其他两台服务器访问其全部端口。以节点A (77.77.77.77)为例,允许另外两台服务器(B (88.88.88.88), C (99.99.99.99))访问其端口。

1
2
-A INPUT -s 88.88.88.88 -j ACCEPT
-A INPUT -s 99.99.99.99 -j ACCEPT

同时,节点服务器需要允许80, 443, 8080 (Stalwart Webadmin),22 (SSH), 以及邮件收发相关的端口25, 465, 143, 993, 4190. 以25端口为例,

1
-A INPUT -p tcp --dport 25 -j ACCEPT

完整的防火墙规则如下,请自行修改,以符合您自己的需求。编辑文件 /etc/iptables/rules.v4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
*filter
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 8080 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p udp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -s 88.88.88.88 -j ACCEPT
-A INPUT -s 99.99.99.99 -j ACCEPT
-A INPUT -p tcp --dport 25 -j ACCEPT
-A INPUT -p tcp --dport 465 -j ACCEPT
-A INPUT -p tcp --dport 143 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT
-A INPUT -p tcp --dport 4190 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables blocked: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT

然后导入规则使其生效。

1
iptables-restore < /etc/iptables/rules.v4

如果您的服务器有IPv6, 那么也需要设置对应的IPv6规则。不过,对于邮件服务器来说,更好的选择是直接禁用IPv6.

1
2
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
sysctl -p

 


至此,我们介绍了Stalwart 邮件服务器集群的整体架构,并详细描述了服务器需求及相关的基础设置。下一篇文章,我们将介绍邮件服务器集群中最重要的组件,FoundationDB数据库集群的部署

本文作者为香菇肥牛,原文链接为https://qing.su/article/high-availability-mail-server-cluster-stalwart-mail.html, 转载请注明原文链接,谢谢。