grommunio 提高邮箱性能
它已包含在社区版本中,不久将打包提供给所有 grommunio 客户:由于 grommunio 处理电子邮件邮箱数据库的方式发生了改变,团队将受益于邮箱性能的显著提高。
问题很复杂,但很普遍:过去,当许多客户同时访问单个邮箱时,用户可能会经历较长的等待时间,例如,当几个用户同时对一个邮箱进行较长时间的搜索查询时,如准备会议时。造成这种情况的原因是希望数据保持一致:一次只能有一个客户访问邮箱中的数据并进行修改,之后才轮到下一个客户,否则就有可能出现不一致的情况。这种 “串行 “访问(即一个接一个地访问)可能会耗费很长时间,尤其是在数据集较大的情况下(有许多客户端希望同时访问)。这个问题不仅限于 grommunio,原则上也适用于所有网络和邮件服务:如果想获得一致的数据,就必须一个接一个地处理访问;如果想获得高性能,就必须并行处理访问。grommunio 采用了其中一种智能解决方案,从而大大提高了性能。
只写不读:串行还是并行?
问题的解决方案:区分写访问和只读访问。服务器可以允许多个客户端同时并行只读访问(如邮件客户端更新共享文件夹),也可以进行缓存。只有写入(即一个客户端的独占访问)时才需要 “单一真实源”,否则可能会出现数据不一致或一个客户端覆盖另一个客户端所做更改的情况。
要在技术上实现这一点,需要对 grommunio(或其他邮件和数据库服务器)的工作原理有一定的了解。在 grommunio 中有一个中央 MySQL 数据库,用于存放元数据和用户元数据缓存,即一个包含所有数据的大表,例如,包括用户信息目录和用户邮箱的具体位置分配。
每个用户还有一个 SQLite 数据库,其中包含具体的用户数据,包括所有电子邮件。对于单个用户来说,它也是邮箱的核心组成部分,但如果同时有大量请求进来,它也会成为瓶颈。不过,该系统非常灵活,而且经过实践证明,它可以根据需要进行扩展,是 grommunio 高邮箱性能的重要组成部分。
不过,如果客户端在较大的邮箱中执行搜索等操作,在搜索请求完全处理完毕之前,其他请求将被阻止。在服务器端,这是通过 Mutex来实现的,其他客户端必须等待,在最坏的情况下,会出现超时—这意味着用户会收到一条错误信息。
邮箱访问流程—典型服务器](/img/posts/24-06-19_Mailbox-Access-Flow-typical_server.png)
典型 exmdb 服务器互斥体的问题:线程 1 锁定静态项并使用共享资源,而线程 2 被静态项阻塞,必须等待。
由于管理服务器会根据情况做出决定,因此邮箱性能得到了提高
由于静态项对于搜索查询或类似的只读访问并无实际意义,因为数据库不会被更改,因此 grommunio 的开发人员采用了一种解决方案来消除这一瓶颈。为此,开发人员改造了管理服务器(exmdb)。管理服务器非常复杂,而且已经协调了 120 多个功能的访问。为了将只读访问并行化,开发人员必须修改 18,000 多行代码。以前,每个邮箱都有一个静态互斥器(Mutex)来防止冲突,但偶尔也会造成拥塞,而新系统则不使用 “大型 “静态互斥器来管理,而是检查每个请求,并根据情况决定是否可以安全地并行化。
邮箱访问流程 - 适配服务器](/img/posts/24-06-19_Mailbox-Access-Flow-adapted_server.png)
改进后的 exmdb 服务器:线程 1 和线程 2 可从共享资源中获得更快的响应。
“事实证明,这种方法明显更快、更灵活,每个使用共享邮箱的团队都能明显感觉到,尤其是在日常工作中。一个典型的例子是团队会议的联合筹备,所有与会者都希望在会议前的几个小时内快速更新彼此的信息。但这只是其中一个例子,用户还热情地告诉我们,其他情况也因这一改变而大大加快了速度。“grommunio 首席技术官 Michael Kromer 说。
了解其他 grommunio 功能。