在两个 Linux 服务器之间同步相同的目录

在两个 Linux 服务器之间同步相同的目录

有两台 RHEL 7.2 linux 服务器位于不同的地方。两者具有相同的目录结构。要求是保持两台服务器的某些目录同步,即 server1 中的任何修改都应反映在 server2 中,反之亦然,但如果某些文件在本地被删除,则不应该也从远程服务器中删除。如果在这两个服务器之间的链接断开时某些文件被修改,则应在链接建立后立即复制它。要实现以下脚本,请执行以下操作:

#!/bin/bash
EVENTS="CREATE,MOVED_TO,MODIFY"
inotifywait -e "$EVENTS" -m -r --format '%w%f' --fromfile list.txt|
while read FILE; do
    echo $FILE
    returnvalue=1
    while [[ $returnvalue -ne 0  ]]
    do
        rsync -azr $FILE backupserver:/$FILE
        returnvalue=$?
        echo $returnvalue
        if [[ $returnvalue -ne 0 ]]
        then
            sleep 60
        fi
   done
done

list.txt包含所有要监控的目录。这是在两台服务器上运行的脚本。

问题 : 每当在 server1 中进行某些修改时,它都会检测到并将其复制到 server2返回码0。但是在 server2 中检测到这是新的修改,并且它尝试复制回 server1,因为该文件存在于 server1 中 rsync 返回错误代码23,因此程序会卡住。

这个问题的最佳解决方案是什么?

笔记:我们不能使用 --ignore-existing 选项,因为两个地方都存在相同的文件,如果内容发生更改,则需要更新该文件。

答案1

** 首先想到这可能是 rsync 选项问题 ** 现在我的想法不同了!

答案:使用本地锁来索取复制权

如果您没有一个目录,我建议进行一个简单的测试 - 首先 - 只需使用默认值,然后看看哪里不能按预期工作。

**删除了rsync的东西**

好的 - 备份 4 个步骤,然后再看一次。

也许问题是循环逻辑:

  • ServerA 有更改(更改为 LARGEFILE),它开始复制它。
  • 现在,在 ServerB 上,LARGEFILE 在 rsync/rcp 复制期间是新的/修改的,并尝试“立即”将其复制回来

我怀疑这种“即时性”是问题的根源。

我的建议是添加某种类型的“LOCK”文件:

  • 将锁放置在本地
  • 检查远程锁定,如果在远程找到,则删除本地锁定并忽略本地 inotify
  • 如果在远程找不到,则开始文件复制,复制完成后删除锁定

答案2

MODIFY您可以通过等待(打开可写后关闭的文件)来代替等待事件close_write,这将确保您不会尝试 rsync 仍在更改的文件。

答案3

该问题是由于其他答案中建议的临时文件创建造成的。当我添加后就解决了--temp-dir=/tmp作为 rsync 选项。

相关内容