背景-
我正在尝试将 NAS 与 DR_NAS 同步以实现 HA 目的。
不幸的是,这有一个复杂的问题。
- NAS在阿里云上。他们还不支持 NAStoNAS 同步。
- 我知道的最好方法是在 2 个 NAS 之间安装同步协议,但我无法直接连接到 NAS。阿里巴巴控制着它。
- 我尝试将它们安装在单个系统上,并在两个 NAS 之间使用 lsyncd/rsync。但它失败了。
- lsyncd 的主要作者表示,lsyncd 使用 Inotify Wait,它使用 Linux 内核来监视文件系统。但Linux内核不监视NFS文件系统。它知道服务器本身何时将文件写入 NAS,但不知道其他系统何时写入。
- 因此,我必须在每个将文件写入 NAS 的系统上设置 lsyncd,因为这是 Inotify Wait 知道的唯一方法。
- 已设置同步。如果系统在(PROD NAS):/data/A/中写入文件,lsyncd会检测到它并将其报告给rsync服务器。然后rsync服务器将文件写入相应目录(DR NAS):/data/A/
当前状态 -
它似乎工作得很好,直到有一天我发现同步被破坏了。
看来作者无法同步同一目录。
- 当 SystemA 写入 /data/A 且 SystemB 写入 /data/B 时,rsync 服务器也会执行此操作。
- 当 SystemA 和 SystemB 同时写入 /data/C 时,其中一个同步中断,此后只有一个系统可以写入 /data/C。
问题
- 多个lsyncd客户端可以与rsync服务器同步并使用相同的目录吗?
- 有没有更好的方法来同步两个远程 NFS 目录?
答案1
问题出在“lsyncd 使用 Inotify Wait” - 大概在 /data 目录级别(?),这会导致目标数据发生更改以触发 lsync 程序启动。
如果两个源同时更新同一目标,则即使这些更新有效,您也不能依赖这些更新文件。使用同一目录应该没有问题。
如果 inotify 是在更细粒度的级别(例如文件级别)指定的,那么只要只有一个源正在写入该文件(并且可能有其他程序正在从中读取),那么应该没有问题。
因此,当只有一个 SystemX 写入 /data/X 时,不会发生冲突。
然而,当两个 SystemX 写入 /data/SAME 时,您将错过一些inotify
目录级触发事件,导致 lsync 错过一些更新。
要回答如何同步两个 NAS 目录,需要详细了解您的系统 - 但要定期同步rsync
(单独)针对两个 NAS 系统运行可以工作 - 前提是相应目录中没有重复的文件。
答案2
我找到了在同一目录上写入会导致同步断开的原因。
Rsync 行为:
Rsyncd 是一个由 root 用户运行的守护进程。目录权限在 rsyncd.conf 中配置。如果配置的 UID 与目标目录的 UID 不匹配,即使目标目录具有所有权限,同步也会中断。
我的情况:文件存储在日期滚动目录中,例如 /data/2021/07/20、/data/2021/07/21 等。
尽管系统永远不会写入相同的文件,但它们注定要写入相同的“新”目录下。
例如,
如果其中一台 lsyncd 服务器检测到“source:/data/2021/07/25/A”中有一个新文件,但目录“target:/data/2021/07/25/”尚不存在,则rsync服务器首先会创建一个目录“target:/data/2021/07/25”root权限下,然后复制文件 A。直到文件“A”完全复制后,目录“target:/data/2021/07/25”的权限才会与源的权限匹配。当文件传输时,rsync 将同步目录权限。
由于此行为,可能会发生同步断开。如果源 B 检测到“source:/data/2021/07/25”,而源 A 仍在具有 root 权限的目录下写入,则与源 B 和目标的同步将中断。
我尝试通过提前创建每日目录来解决此问题,但今天其中一个同步在写入 0 字节文件后冻结后被破坏。