本文主要介绍主流邮件系统(如Exchange、Coremail、Postfix)的数据存储格式,旨在帮助大家对邮件系统的底层结构有更深刻的认识。由于小编能力有限,文中难免存在疏漏与不足之处,恳请各位读者指正。
在开放源代码的世界里,主流电子邮件服务主要有Sendmail、Qmail、Postfix。存储格式最流行的有两种:Mbox和Maildir,它们都是开放的存储格式,因此兼容性比较好。
Mbox格式是在基于UNIX的邮件服务器上存储邮件的传统方式。单独的邮件消息只是简单地连接在一起,并保存在一个文件中。在一条消息结束和下一条消息开始的地方放置一个特殊的标记。只有一个进程可以以读写模式访问Mbox文件。并发访问需要一个锁定机制。任何时候,当有人需要更新Mbox文件时,其他所有人都必须等待更新完成。
Maildirs最初是在Qmail邮件服务器中实现的,据说是为了解决mbox文件的不足之处。单独的邮件消息保存在单独的文件中,每条消息一个文件。每个文件的命名都有明确的方法。向Maildir中添加新邮件的流程也是确定的。不需要锁定。多个进程可以同时使用Maildirs。
Mbx存储格式是UW-IMAP服务器提供的原始Mbox格式的一个略有修改的版本。Mbx邮箱仍然需要锁定。与Mbox格式的主要区别在于,文件中的每条消息之前都有一个记录,该记录携带一些特定于消息的元数据。因此,过去需要重写整个Mbox文件才能执行的一些操作,现在可以通过更新固定大小的头部记录来实现。
主流观点认为Maildir在数据存储安全性、存储效率、并发访问效率、搜索效率、扩展能力方面均要优于Mbox。主要原因在于Mbox是多封邮件存储在一个文件中,涉及到文件锁。Maildir也有自身的缺点,Maildir较依赖文件系统,尤其是依赖对目录的索引能力,用ReiserFS会比较快,对于超大型的Maildir,读写性能将受到考验。相对而言,Mbox则不存在这个问题。
Exchange服务器的存储是由可扩展存储引擎 (ESE)来管理的。这个ESE引擎是微软专门为保存非关系型数据而开发,目前在微软的很多产品中都有广泛的应用,如:AD数据库、DHCP、WINS、SRS等等。ESE是一个数据库引擎,它以逻辑顺序存储信息。可以按顺序检索信息,也可以通过访问定义的索引来检索信息。数据库汇报是使用事务实现的,以确保安全操作。ESE 允许同时访问多个数据库,包括可用于系统恢复的事务日志文件数据库。ESE 可缩放到大型或小型应用程序。
Exchange的数据库是由EDB文件、STM文件和LOG文件组成的(注:不同版本会有不同,请注意甄别)。在这些文件里,微软使用了“B+树”的内部数据结构。ESE的引擎的任务之一,就是当IS服务(Information Store)请求访问数据库的时候,把这些请求转化为对内部数据结构的读写访问。B+树的特点是能够对存储在硬盘上的数据提供快速访问能力。微软利用“B+树”作为ESE的后台结构的主要原因,就是尽可能的提高访问数据时I/O性能。
ESE数据库示例
Coremail作为国内主流的电子邮件系统,据公开资料显示,其采用了独有的“信筒”模型,并结合预读缓写等机制,这一设计极大地减少了实际的磁盘I/O操作次数,使得在相同的硬件设备条件下,Coremail能够实现更高的性能与更强的稳定性。在Coremail系统中,邮件数据通过创新的“信桶”存储机制进行管理,每个“信桶”能够存储多封邮件,并且这些邮件在存储时会应用加密和压缩技术,确保数据安全的同时优化存储效率。用户访问邮件时,只能通过邮件索引来读取相应的邮件数据,这一设计增强了数据访问的安全性和有序性。
Coremail系统将邮件数据和邮件索引数据分开存储,这两部分数据分别由不同的模块负责处理。每个模块都配备了高效的Cache机制,这一特性显著提升了数据的读写速度,为用户带来更加流畅的使用体验。索引与数据分离的设计模式还为Coremail系统提供了邮件数据单副本的能力。这意味着,一封同时发送给多个收件人的邮件,在系统中实际上仅需要在“信桶”中存储一次,之后只需分别更新每位用户的邮件索引即可。这种巧妙的设计模式极大地节约了存储空间,提高了系统资源的利用效率。
Coremail数据存储示意图
注意:上图根据公开资料整理而来,非Coremail官方提供,仅供参考。如需获取更准确的信息,建议联系Coremail官方(www.coremail.cn)获取。
未标注来源的文章均为原创作品,版权所有,转载请注明出处。非原创文章均已标注来源,如有侵权请告知。
如您喜欢本站,可以收藏加关注(扫码关注右上角微信公众号mailabc)。