我正在尝试在两个服务器之间同步内容。这些服务器具有相同的版本(Ubuntu 12.04LTS),并运行此 cron 作业来同步内容:
rsync -arzc --update --delete /htdocs/testing/www/cms_uploads/* [email protected]:/htdocs/testing/www/cms_uploads/
但当我测试该过程时,我得到了一些奇怪的结果,如下所述。
第一次测试
- 上传aaaa.jpg到Node2
- 同步到节点1
- 从节点1删除
- 再次出现在Node1上
- 从节点2删除
- 从 Node1 中删除
第二次测试
- 上传bbbb.png到Node1
- 同步到节点2
- 从节点2删除
- 再次出现在Node2上
- 从节点 1 删除
- 再次出现在Node1上
我想做的就是确保两台服务器上的内容始终完全相同。我究竟做错了什么?
答案1
rsync
未设置为进行双向同步。如果没有特定的帮助(例如从更改的机器同步)和运气好,它无法做到这一点。
需要运气,这样变化才不会频繁且相距甚远。如果 Node1 和 Node2 在下一次同步开始之前(从任一计算机)发生更改,则某些更改会在同步时丢失。
也可以看看这
答案2
你的问题陈述有一些根本性的问题。假设您的服务器处于同步状态,然后您aaaa.jpg
在节点 2 上创建一个文件。下一次同步是否应该从节点 2 中删除该虚假文件(因为它在节点 1 上不存在,因此它一定已被删除),或者应该将文件复制到节点 1(因为节点 1 上不存在该文件,所以必须新建)?
运行同步的顺序将决定每种情况下发生的情况。在许多情况下,这实际上保证不会给出期望的结果。更糟糕的是,如果同步并行运行(以便其中一台主机由其自己的同步作业更新,同时由另一台主机上运行的同步作业遍历),结果将看起来相当随机。
Rsync 本质上是为单向同步而设计的。你不能只运行两个 rsync 作业并希望进行双向同步。
齐奏是一款专为双向同步而设计的文件同步器。这是最适合您任务的工具。设置它并unison -auto remote.example.com://path/to/directory /path/to/directory
在其中一台主机上运行。
无论您使用什么工具,都可能存在冲突,例如,如果同一文件在两台不同的计算机上被两个不同的版本替换。没有好的自动化方法来解决此类冲突,因此需要手动干预。
在大多数设置中,正确的做法是指定一台服务器作为上传位置,并从该主服务器同步所有其他服务器。如果有人将文件上传到从机,则使其将上传中继到主机;不要在本地更改任何内容。每当主服务器上的文件发生变化时,将其推送到从服务器。
答案3
rsync 有一个 -u 选项:
“这会强制 rsync 跳过目标上存在且修改时间比源文件更新的任何文件。(如果现有目标文件的修改时间等于源文件的修改时间) ,如果大小不同,它将被更新。)”因此,包含 1)您给出的命令加上 -u 选项并减去 -c 选项和 2)相同的命令但方向相反的
shell 脚本 可以排序 -完成双向同步,但有两个问题: 1)远程服务器上删除(或重命名)的文件将从本地复制过来 b/c rsync 会认为它在本地找到了新文件, 2)如果同步期间两个位置上的单个文件都会发生更改,只有最新的更改才会被保留。