AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 417767
Accepted
pl1nk
pl1nk
Asked: 2012-08-16 03:55:17 +0800 CST2012-08-16 03:55:17 +0800 CST 2012-08-16 03:55:17 +0800 CST

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

  • 772

场景如下:

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

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

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

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

哪个是最好的选择,最好考虑每种方法的优缺点。

重要事实:

  • 1500 万个电子邮件文件(大部分是小文件)
  • 1,45 TB 数据

更新

目的:迁移到新服务器

预计到达时间:尽快

更新 2

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

更新 3

我更喜欢开源解决方案。

email-server
  • 4 4 个回答
  • 704 Views

4 个回答

  • Voted
  1. Janne Pikkarainen
    2012-08-16T04:44:15+08:002012-08-16T04:44:15+08:00

    一种方法是使用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 手册。

    接下来只需创建一个迁移脚本,该脚本通过 IMAPimapsync或类似的 util 一个一个地复制邮箱,并且在每次成功的邮箱迁移之后,它只应该更新 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);
    }
    
    • 3
  2. Chida
    2012-08-16T05:24:12+08:002012-08-16T05:24:12+08:00

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

    • 1
  3. joeqwerty
    2012-08-16T06:43:54+08:002012-08-16T06:43:54+08:00
    1. 通过更改相关域的 MX 记录以指向新电子邮件服务器,将电子邮件路由到新服务器。

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

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

    • 0
  4. Best Answer
    pl1nk
    2012-08-25T03:22:28+08:002012-08-25T03:22:28+08:00

    这个食谱对我很有效:

    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 的调度优先级修改为 19 - 最不受欢迎。最后我重定向 rsync 输出覆盖日志文件(以保持它的小尺寸)。注意:在 rsync 中使用 -v 可能会产生一个巨大的日志文件。

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

    • 0

相关问题

  • 寻找开源电子邮件归档应用程序 [关闭]

  • 防止您看起来像垃圾邮件发送者的最佳做法 [重复]

  • 什么是允许POP邮箱用户打开和关闭Vaction AutoReply的快速且易于理解的PROCMAIL方式

  • 邮件服务器设置

  • 电子邮件标题包含在电子邮件正文中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve