在本篇文章中,我不会讨论详细的如何搭建基于Sendmail, Postfix, qmail邮件系统的步骤,这方面的文档网上非常多,大家可以通过Google来搜索查询。
一年多前,本人曾管理过一大型商业用途的邮件系统,每天的发送量超过1亿封,这里只是单纯的site邮件,还不包括广告邮件等。这里很想和大家分享一下我的一些关于高可扩展性、高管理性和高性能邮件系统的经验和心得。
1. 分割
对于soft bounce的邮件,目前大部分MTA都有自己的规则,会在未来的几天内对这些soft bounce的邮件不断的重新发送,以提高发送的成功率,造成soft bounce的原因很多,比如网络延迟等等。对于一般的邮件系统来说,这些soft bounce会在成功发送前一直存在于邮件队列中,随着时间的推移,这样会造成邮件队列越来越大,这样就会导致正常的邮件不能很及时的发送给用户。
那么该如何改进呢?这里就要引入一个概念,即fallback,何为fallback呢?简单的讲,就是如果主邮件服务器第一次无法成功发送的话,那么此邮件就会通过fallback机制,将此邮件转发给另外一台邮件服务器,这个邮件服务器专门用来发送这类第一次无法成功投递的邮件。这样的好处就是主邮件服务器的队列基本上会保持在一个稳定的范围内,而不至于过高,这样正常的邮件就能及时的成功发送给用户,而soft bounce的邮件就专门由fallback的邮件服务器来不断重复尝试发送,大家各司其职。
据我所知,当前Sendmail和Postfix都支持这项功能,大家可以去查阅官方文档了解如何实现此功能。
2. 负载均衡
对于一个大型商业用途的邮件系统来说,每天的发送量是非常庞大的,如果单凭两三台服务器是很难支撑这样的负载的,这时候我们就应该考虑采用负载均衡技术来将这些庞大的邮件量均衡的平摊到多台邮件服务器来发送。
举个例子,假设我现在有50台配置很好的主邮件服务器和40台一般配置的fallback邮件服务器,我们可以将这两种功能的邮件服务器划分为两个pool,每个pool拥有自己单独的域名,这里我给主邮件服务器pool建一个域名:mx.vip.isoracle.com,给fallback邮件服务器pool建: fallback.vip.isoracle.com域名。 由应用程序生成的所有邮件都将发送给mx.vip.isoracle.com,所有fallback的邮件都将发送给fallback.vip.isoracle.com,当然,我们需要在负载均衡服务器(比如F5)上做相关的配置,将发送给mx.vip.isoracle.com的邮件分配给mx1.isoracle.coom, mx2.isoracle.com ... mx50.isoracle.com这50台主邮件服务器,同理,将发送给fallback.vip.isoracle.com的邮件分配给fallback1.isoracle.com ... fallback40.isoracle.com这40台fallback邮件服务器。
这样做的好处就是可以大大的提高系统的可扩展性,如果当前邮件系统的容量无法满足日益增长的邮件数的时候,我们就可以很方便往mx.vip.isoracle.com里添加新机器,如果不采用负载均衡技术的话,那么当碰到瓶颈的时候,那么就可能需要重新设计当前邮件系统的构架等,这将是件非常麻烦的事。
如果你目前没有足够预算来购买硬件负载均衡器,比如F5, NetScaler,可以考虑使用Nginx或DNS轮询来实现简单的负载均衡功能。
3. 操作系统和存储
个人感觉Linux操作系统很适合邮件系统,性能和稳定性方面都挺不错的。 至于新出的FreeBSD 7.0, 本人还没有做过相关测试,据官方说明,性能相比之前的版本有很大的提高。
至于存储,最好使用SCSI硬盘来存储邮件队列中的小文件,SCSI硬盘相比SATA或SAS硬盘,占用CPU资源更少。
4. 监控
对于任何一个规范的邮件系统来说,监控系统是非常重要,必不可少的。
一般来讲,我们需要对以下做重点监控:
a 邮件队列,如果某台邮件服务器的队列过高,那么就必须要检查相关的配置和日志,查出问题的原因。
b CPU,内存和load,尤其CPU和load需要重点监控,往往邮件服务器出问题的时候都会从CPU或Load反映出来。
c 存储邮件队列的硬盘的剩余空间
4. 排查问题和生成相关报告
作为一个邮件工程师来说,经常会碰到各种各样的问题,通常我们都需要检查相关时间段内的邮件系统日志,这对于快速诊断和解决问题是非常有帮助的。但是对于大型邮件系统来说,每小时所产生的日志量都是非常庞大的,针对此状况,我曾经写了一个邮件日志分析系统,大致流程就是通过cronjob每隔一小时将每台邮件服务器上的日志传输到一台专门用来存储邮件日志的服务器上来,然后通过Perl和Shell脚本来处理这些日志,最终将处理完的数据存到Oracle数据库中,然后写了一个cgi的web界面,当需要查询日志的时候,只要输入问题发生时间和相关的邮件地址,那么就可以很快的从数据库中查询到详细的日志信息,通过分析这些日志信息,对快速诊断问题是很有帮助的。
在数据库里有相关的邮件系统日志信息的前提下,我们就可以通过RRDTool这类的绘图软件来生成相关的图形报表来显示邮件投递成功率、soft bounce和hard bounce的数量等重要信息。
当然,邮件系统是非常复杂的,这里我也不可能面面俱到,如果你有相关的经验或建议,非常欢迎交流。