通过网络从实时服务器复制/同步电子邮件

通过网络从实时服务器复制/同步电子邮件

场景如下:

通过网络(仅)从实时邮件服务器复制并同步到另一台服务器。

邮件服务器处于活动状态,这意味着许多文件(邮件)正在被更改、删除和创建。我尝试过 rsync,但它非常慢,一段时间后我得到:

警告:某些文件在传输之前消失(代码 24)在 main.c(1040) [sender=3.0.5]

由于服务器处于活动状态,我不希望显著增加服务器的负载。

哪个是最佳选择,最好说明每种方法的优缺点。

重要事实:

  • 1500 万个电子邮件文件(大部分为小型文件)
  • 1.45 TB 数据

更新

目的:迁移到新服务器

预计到达时间:尽快

更新 2

服务器限制: 实时邮件服务器在旧的软件和硬件中运行,我不会冒险在那里安装任何东西。

更新 3

我更喜欢开源解决方案。

答案1

一种方法是使用毁灭用于 POP/IMAP 连接处理,然后只需设置 Postfix 以将 SMTP 路由到旧服务器或新服务器(具体取决于用户邮箱所在的位置)。这样,您就可以一次实时迁移一个邮箱,而无需停机。

当然,您可以设置定期维护中断,然后只需 rsync 文件即可。不过,复制 1500 万个文件将需要一段时间。根据您的服务器以及 I/O 系统,并行运行多个 rsync 进程可能会有所帮助;一个进程复制以 [ae] 开头的文件/目录,第二个进程复制以 [fj] 开头的文件/目录,第三个进程复制以 [kp] 开头的文件/目录,依此类推。

但是我做过两次类似的事情,所以我推荐 Perdition 方法。初始设置后,它确实消除了迁移的痛苦。

编辑:您要求提供有关 Perdition 设置的更多信息,您已经得到了。

您需要有一个集中位置来存储您的用户帐户信息。可以是 MySQL、PostgreSQL、OpenLDAP 或其他东西。我一直使用 OpenLDAP 并取得巨大成功。无论如何,您需要有一个数据库表/LDAP 模式,其中包含用户名和用户邮箱所在的服务器名称。有毁灭迁移工具这将有助于您进行初始设置。

然后,Perdition 接收 POP/IMAP 连接,从 LDAP 或其他位置查找用户位置,并透明地代理用户邮件客户端和实际服务器之间的流量。Postfix 还可以从 LDAP/SQL 查找此实际服务器位置并将邮件发送到那里。

这是有关 Perdition + LDAP 设置的 PDF这是 Postfix LDAP 手册

接下来只需创建一个迁移脚本,使用 IMAP 或类似实用程序逐个复制邮箱imapsync,每次成功迁移邮箱后,它只需更新 OpenLDAP 或有关用户邮箱位置的任何中心位置。

编辑#2:imapsync我所说的是免费软件,在大多数 Linux 发行版中都可以从其软件包存储库获得。您要求我详细说明rsync方法;无论您选择 imapsync 还是 rsync,基本原理都是一样的。您只需使用 bash、Perl 或其他您熟悉的语言创建一个脚本。以下是一些伪代码。

@accounts = fetch_all_the_account_names_from_ldap();
for (@accounts) {
    rsync -avP /var/spool/mail/$user $newserver:/var/spool/mail/
    update_user_location_in_ldap($user, $newserver);
}

答案2

您可以考虑在分布式文件系统上托管服务器。您可以使用 DRBD 执行文件系统复制。您当前的服务器可以作为主服务器,并带有辅助服务器(您已经将其作为新服务器)。如果主服务器发生故障,辅助服务器将成为主服务器。您可以在当前服务器上实施 DRBD,初始同步将在后台透明地(无停机时间)发生在辅助服务器(新服务器)上,而您不会注意到。您无需手动复制任何文件。--http://www.drbd.org/

答案3

  1. 通过更改相关域的 MX 记录以指向新的电子邮件服务器,将电子邮件路由到新服务器。

  2. 移动所有用户邮箱内容并将所有电子邮件客户端指向新服务器。

  3. 通过任何您希望的方式将旧服务器上剩余的电子邮件转移到新服务器。

答案4

这个食谱对我来说很有效:

1.复制第一批文件示例:

tar c dir/* |gzip - | ssh user@host 'cd /dir/ && tar xz'

在 gzip 中你可以有不同的压缩级别,其中 -1 表示最快的压缩方法(压缩程度较低),-9 或 --best 表示最慢的压缩方法(压缩程度最高)。默认压缩级别为 -6(即以牺牲速度为代价,偏向高压缩)。– gzip压缩男人页。

2.使用 rsync 守护进程

数据被复制后,rsync 工作变得更容易,并且通过使用 rsync 守护进程(假设您处于受控环境中,因为数据未加密),整体性能会好得多。

由于我必须处理大量小文件,因此我禁用了 rsync 压缩,如果不进行压缩,处理速度会快约 40%。

3.每隔 x 小时执行一次 cronjob,以在远程服务器上始终获得更新版本。

0 */03 * * * flock -n /Any_Dir/rsync.lock -c "nice -n 19 rsync --password-file=/rsync.passwd --delete-during -ra /source_dir/ user@rsync_server::ModuleName > /var/log rsync_cgp.log" 2>&1

在我的示例中,我每 3 小时启动一次 rsync 进程,使用 flock 创建锁定文件,并注意如果第一个 rsync cronjob 未完成,则不会启动第二个 rsync cronjob。此外,由于我不想对服务器造成太大影响,我将 rsync 的调度优先级修改为 19 - 最不有利。最后,我重定向 rsync 输出以覆盖日志文件(以使其保持较小)。警告:在 rsync 中使用 -v 可能会导致产生巨大的日志文件。

每个 rsync 过程持续时间约为 16-30 分钟,具体取决于服务器的负载。

相关内容