场景如下:
通过网络(仅)从实时邮件服务器复制然后同步到另一台服务器。
邮件服务器处于活动状态,这意味着大量文件(邮件)正在被更改、删除和创建。我试过 rsync 但它非常慢,一段时间后我得到:
警告:某些文件在 main.c(1040) [sender=3.0.5] 传输之前就消失了(代码 24)
由于服务器是实时的,我不希望显着增加服务器上的负载。
哪个是最好的选择,最好考虑每种方法的优缺点。
重要事实:
- 1500 万个电子邮件文件(大部分是小文件)
- 1,45 TB 数据
更新
目的:迁移到新服务器
预计到达时间:尽快
更新 2
服务器限制: 实时邮件服务器运行在旧的软件和硬件上,我不会冒险在那里安装任何东西。
更新 3
我更喜欢开源解决方案。
一种方法是使用Perdition进行 POP/IMAP 连接处理,然后根据用户邮箱所在的位置,将 Postfix 设置为将 SMTP 路由到旧服务器或新服务器。通过这种方式,您可以在不停机的情况下一次迁移您的服务器一个邮箱。
当然你可以设置一个预定的维护中断,然后只同步文件。不过,复制 1500 万个文件需要一段时间。根据您的服务器,主要是 I/O 系统,并行运行多个 rsync 进程可能会有所帮助;一个复制文件/目录以 [ae] 开头,第二个以 [fj] 开头,第三个以 [kp] 开头,依此类推。
但是做了两次类似的事情,我会推荐 Perdition 方法。初始设置后,它真正消除了迁移的痛苦。
编辑:您询问了有关 Perdition 设置的更多信息,您知道了。
您需要有一个中心位置来存储您的用户帐户信息。这可以是 MySQL、PostgreSQL、OpenLDAP 或其他。我一直使用 OpenLDAP 并取得了巨大的成功。无论如何,您需要有一个数据库表/LDAP 架构,其中包含用户名和用户邮箱所在的服务器名称。有可用的Perdition 迁移实用程序,可帮助您进行初始设置。
然后 Perdition 接收 POP/IMAP 连接,从 LDAP 或其他任何地方查找用户位置,并透明地代理用户邮件客户端和实际服务器之间的流量。Postfix 还可以从 LDAP/SQL 中查找这个实际的服务器位置并将邮件发送到那里。
这是关于 Perdition + LDAP 设置的 PDF,这是 Postfix LDAP 手册。
接下来只需创建一个迁移脚本,该脚本通过 IMAP
imapsync
或类似的 util 一个一个地复制邮箱,并且在每次成功的邮箱迁移之后,它只应该更新 OpenLDAP 或关于用户邮箱位置的任何中心位置。编辑 #2:我所说的imapsync是免费软件,在大多数 Linux 发行版中都可以从它们的软件包存储库中获得。您要求我详细说明
rsync
方法;不管你选择imapsync还是rsync,基本原理都是一样的。您只需使用 bash、Perl 或您觉得合适的其他语言创建一个脚本。这是一些伪代码。您可以考虑在分布式文件系统上托管服务器。您可以使用 DRBD 执行文件系统复制。您当前的服务器可以是主服务器和辅助服务器(您已经将其作为新服务器)。如果主要失败,次要将成为主要。您可以在当前服务器上实施 DRBD,并且初始同步将在后台透明地(无停机时间)发生到辅助(新服务器),而您不会注意到。您无需手动复制任何文件。-- http://www.drbd.org/
通过更改相关域的 MX 记录以指向新电子邮件服务器,将电子邮件路由到新服务器。
移动所有用户邮箱内容并将所有电子邮件客户端定向到新服务器。
通过您希望的任何方式将旧服务器上的所有剩余电子邮件传输到新服务器。
这个食谱对我很有效:
1.复制第一批文件示例:
在 gzip 中,您可以有不同的压缩级别,其中 -1 表示最快的压缩方法(较少压缩),-9 或 --best 表示最慢的压缩方法(最好的压缩)。默认压缩级别为 -6(即以牺牲速度为代价偏向于高压缩)。- gzip手册页。
2.使用rsync守护进程
复制数据后,rsync 作业更容易,并且通过使用 rsync 守护进程(假设您处于受控环境中,因为数据未加密)整体性能要好得多。
由于我不得不处理大量小文件,因此我禁用了 rsync 压缩,在没有压缩的情况下,处理速度提高了约 40%。
3. 每 x 小时进行一次 cronjob,以便在远程服务器上始终更新版本。
在我的示例中,我每 3 小时启动一个 rsync 进程,使用 flock 创建一个锁定文件,并注意如果第一个未完成,则不会启动第二个 rsync cronjob。此外,由于我不想破坏服务器,我将 rsync 的调度优先级修改为 19 - 最不受欢迎。最后我重定向 rsync 输出覆盖日志文件(以保持它的小尺寸)。注意:在 rsync 中使用 -v 可能会产生一个巨大的日志文件。
每个 rsync 进程持续时间大约需要 16-30 分钟,具体取决于服务器的负载。