![服务器间实时同步数十万个小文件](https://linux22.com/image/697005/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%97%B4%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%E6%95%B0%E5%8D%81%E4%B8%87%E4%B8%AA%E5%B0%8F%E6%96%87%E4%BB%B6.png)
我的任务是创建两台 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。
原因:
- 极其容易安装
- 极其简单的设置
- 支持单向和双向复制