与远程服务器有效同步 100 万个文件的选项?

Zil*_*nas 27 optimization synchronization rsync

在我工作的一家公司,我们有一种叫做“播放列表”的东西,它是每个约 100-300 字节的小文件。他们大约有一百万。其中每小时大约有 100,000 次更换。这些播放列表需要每小时上传到不同大陆的 10 个其他远程服务器,理想情况下需要在 2 分钟内快速上传。在 master 上删除的文件也会在所有副本上删除,这一点非常重要。我们目前使用 Linux 作为我们的基础设施。

我正在考虑尝试使用 -W 选项进行 rsync 复制整个文件而不比较内容。我还没有尝试过,但也许对 rsync 有更多经验的人可以告诉我这是否是一个可行的选择?

还有哪些值得考虑的选择?

更新:我选择了 lsyncd 选项作为答案,但这只是因为它是最受欢迎的。其他建议的替代方案也以它们自己的方式有效。

fak*_*ker 39

由于即时更新也是可以接受的,您可以使用lsyncd
它监视目录(inotify)并将rsync更改为奴隶。
在启动时它会做一个 full rsync,所以这需要一些时间,但之后只传输更改。
目录的递归监视是可能的,如果从属服务器关闭,将重试同步直到它回来。

如果这一切都在单个目录(或静态目录列表)中,您还可以使用incron
缺点是它不允许递归查看文件夹,您需要自己实现同步功能。

  • 实际上,它在 *目录* 上执行了一个 `iontify`,而不是单个文件。您可以查看多少个目录?检查`/proc/sys/fs/inotify/max_user_watches`(通常为8192)。 (2认同)
  • 使用大约 50k 个目录,inotify 很可能无法很好地扩展。当我们在 2009 年尝试使用 100k 目录的类似方法时,内核方式需要很长时间才能订阅所有目录。至于@OldPro,它对我们不起作用。 (2认同)

Ste*_*day 11

考虑使用分布式文件系统,例如GlusterFS。在设计时考虑了复制和并行性,GlusterFS 可以比涉及 inotify 和rsync.

对于这个特定用例,可以构建一个包含 10 个副本的 10 服务器 GlusterFS 卷(即每台服务器 1 个副本/块),这样每个副本将是卷中所有其他副本的精确镜像。GlusterFS 会自动将文件系统更新传播到所有副本。

每个位置的客户端都会联系他们的本地服务器,因此对文件的读取访问会很快。关键问题是写入延迟是否可以保持在可接受的低水平。回答这个问题的唯一方法就是尝试一下。


Sve*_*ven 8

我怀疑rsync是否会以正常方式解决此问题,因为扫描一百万个文件并将其与远程系统进行 10 次比较需要很长时间。我会尝试实现一个类似的系统,该系统inotify保留修改后的文件列表并将它们推送到远程服务器(如果这些更改无论如何都没有以其他方式记录)。然后,您可以使用此列表快速识别需要传输的文件 - 甚至可以使用 rsync(或更好的 10 个并行实例)。

编辑:通过一些工作,您甚至可以使用这种 inotify/log watch 方法在修改发生后立即复制文件。


Lad*_*ada 5

还有一些选择:

  • 每当您在主服务器上删除或添加文件时,将作业插入RabbitMQGearman以异步关闭并删除(或添加)所有远程服务器上的相同文件。
  • 将文件存储在数据库中并使用复制来保持远程服务器同步。
  • 如果您有 ZFS ,则可以使用 ZFS 复制
  • 某些 SAN 具有文件复制功能。我不知道这是否可以通过 Internet 使用。