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

情况如下:

复制然后通过networking(仅)从活动邮件服务器同步到另一个服务器。

邮件服务器是活的,意味着许多文件(邮件)正在被更改,删除和创build。 我已经尝试了rsync,但它非常缓慢,一段时间后,我得到:

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

由于服务器是活的,我不希望显着增加服务器上的负载。

哪一个是最好的select,最好是每种方法的优缺点。

重要事实:

  • 一千五百万个电子邮件文件(大部分小)
  • 1,45 TB的数据

更新

目的:迁移到新的服务器

ETA:尽快

更新2

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

更新3

我宁愿开源解决scheme。

一种方法是使用灭亡 POP / IMAP连接处理,然后设置您的Postfix将SMTP路由到旧的或新的服务器,这取决于用户邮箱的位置。 这样,您可以一次性迁移您的服务器一个邮箱,而不会停机。

当然,你可以设置一个计划的维护rest,然后rsync文件。 虽然复制1500万个文件需要一段时间。 根据您的服务器和主要的I / O系统,这可能有助于并行运行多个rsync进程; 一个以[ae]开始复制文件/目录,第二个以[fj]开头,第三个以[kp]开头等等。

但做了两次类似的事情,我会build议采取灭绝的方法。 初步设置后,真正把迁移的痛苦带走。

编辑:你问了更多关于灭绝安装的信息,你明白了。

你需要有一个中央的地方,你有你的用户帐户信息存储。 这可以是MySQL,PostgreSQL,OpenLDAP或其他。 我一直使用OpenLDAP取得巨大​​成功。 无论如何,您需要有一个数据库表/ LDAP模式,其中包含用户名和用户邮箱所在的服务器名称。 有Perdition迁移utils可用,这将帮助您在初始设置。

然后,Perdition收到POP / IMAP连接,从LDAP或其他任何地方查找用户位置,并透明地代理用户邮件客户端和实际服务器之间的stream量。 Postfix也可以从LDAP / SQL中查找这个实际的服务器位置,并在那里发送邮件。

这里是关于Perdition + LDAP设置的PDF文件 , 这里是Postfix LDAP手册 。

接下来,只需创build一个迁移脚本,通过IMAP与imapsync或类似的util一个接一个地复制邮箱,并在每次成功迁移邮箱后,只需更新OpenLDAP或关于用户邮箱位置的任何中心位置。

编辑#2:我所说的imapsync是免费软件,并从他们的软件包储存库大多数Linux发行版中可用。 您要求我详细说明rsync方法; 如果你selectimapsync或者rsync,没关系,基本原理是一样的。 您只需使用bash,Perl或其他您熟悉的语言创build脚本。 这是一些伪代码。

 @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); } 

你可以看看在分布式文件系统上托pipe服务器。 您可以使用DRBD来执行文件系统复制。 您当前的服务器可以使用辅助服务器(您已经拥有作为新服务器)的主服务器。 如果小学失败,中学将成为主要的。 您可以在当前服务器上实施DRBD,并且在不知不觉中,初始同步将在背景中透明地(不停机)发生到辅助服务器(新服务器)。 没有要手动复制的文件。 – http://www.drbd.org/

  1. 将电子邮件的MXlogging更改为指向新的电子邮件服务器,将电子邮件路由到新的服务器。

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

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

这个配方对我很好用:

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

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

在gzip中,您可以使用不同的压缩级别, 其中-1表示最快的压缩方法(较less压缩),-9或–best表示最慢的压缩方法(最佳压缩)。 默认的压缩级别是-6(即,以速度为代价偏向高压缩)。 – gzip 手册页。

2.使用rsync守护进程

数据复制后,rsync作业更容易,通过使用rsync守护进程(假设您处于受控环境中,因为数据未encryption),整体性能要好得多。

由于我不得不处理大量的小文件,所以我禁用了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创build一个锁文件,并注意如果第一个未完成,则不会启动第二个rsync cronjob。 此外,由于我不想锤击服务器,所以我将rsync的调度优先级修改为19,至less是有利的。 最后,我redirectrsync输出覆盖日志文件(以保持它的大小)。 警告 :在rsync中使用-v可能会导致巨大的日志文件。

每个rsync进程的持续时间大约需要16-30分钟,这取决于服务器的负载。