服务器间实时同步数十万个小文件

服务器间实时同步数十万个小文件

我的任务是创建两台 CentOS 7 服务器,不仅要复制数据库,还要复制文件。现在我的问题是,可能会有数十万个文件,甚至数百万个文件,大小从几 KB 到约 1 GB 不等。

我读过

  • 铭刻
  • lysncd
  • git 附件
  • 奇龙FS

现在我想问一下你曾经使用过或者正在使用过这些工具的经验。在复制和删除方面,文件更改的性能如何?我非常害怕使用任何 rsync,因为我的经验是,它在处理大量小文件时速度不是很快,因此我不能真正使用它进​​行实时文件复制。还是我错了?请证明我错了。:)

或者我可能需要第三和第四台服务器作为文件服务器?如果是,那么问题仍然存在:如何在两台服务器之间实时复制文件?

干杯!

答案1

如果您的服务器在同一个 LAN 上,那么集群文件系统(即:GlusterFS)或共享存储解决方案(即:通过 NFS)应该是更好的选择。

如果您的服务器位于不同位置,并且只有 WAN 连接,则上述解决方案将无法正常工作。在这种情况下,如果你只需要单向复制(即从活动服务器到备份服务器)lsyncd是一个很好的解决方案。另一个解决方案是csync2。最后,另一种可能性是使用DRBD + DRBD Proxy(请注意,其代理组件是一个商业插件)。

最后,如果你的服务器只有 WAN 连接,并且您需要双向复制(即:两个服务器同时处于活动状态),基本上没有灵丹妙药。我会列出一些可能性,但我绝不推荐类似的设置:

  • unison及其实时插件
  • psync,我正是为解决类似的问题而编写的(但请注意,它有自己的特点,我提供没有支持为了它)
  • syncthing使用实时插件(但它有很大的局限性,即它不保留 ACL 也不保留文件的所有者/组)

答案2

我使用 ZFS 文件系统并利用 zfs 发送/接收框架实现其块级复制。

我使用了一个方便的脚本合子根据需要,以 15 秒到每小时或每天的间隔定期执行文件系统同步。

对于您所说的数据集,块级复制将比 rsync 更干净、更准确。

答案3

根据我的经验,分布式文件系统为应用程序提供了简单的复制机制。但是,它们的性能不佳,尤其是当目录变得非常大且包含太多小文件时。这是意料之中的,因为它们需要处理来自多个位置/机器的锁定/共享访问。

在某些情况下,类似 Rsync 的方式可以提供可接受的复制,但会有一定的延迟。它们在读取/写入复制文件夹时不会影响应用程序的性能。

我认为更好的解决方案是提供可从一台服务器访问的共享存储(如果价格合理)。当第一台服务器发生故障时,另一台备用服务器已准备好挂载共享文件夹。无需在服务器之间复制任何数据。

答案4

感谢您的想法。我已经检查并测试了所有想法,并且坚持使用 lsyncd。

原因:

  • 极其容易安装
  • 极其简单的设置
  • 支持单向和双向复制

相关内容