我有两个负载均衡的服务器,每个服务器运行与各种基于PHP的网站完全相同的副本。
当想要更改内容时,访问其网站的管理员用户(或多个管理员用户)可能会命中一个或另一个服务器,例如上传图像,从媒体库中删除文件等
这些操作意味着服务器中的一个或另一个或两个服务器彼此不同步,需要重新连接。
目前我正在使用--delete选项查看rsync,但我不确定它如何对要删除的文件与服务器之间创建的新文件作出反应。
即。如果我删除服务器A上的文件和服务器B的rsync文件也应该从服务器B删除(因为它不再存在于A)但是如果我单独上传文件到服务器B以及从服务器删除文件在运行同步之前,上传到服务器B的文件是否也会被删除,因为它在服务器A上不存在?
Web上的一些教程处理主从类型场景,其中服务器B是服务器A的镜像,这个过程正常工作,但在我的情况下,两个服务器实际上是大师彼此镜像。
我认为 rsync保存了它正在处理的文件的本地历史记录,因此可能能够优雅地处理这个问题,但不确定是否确实如此,或者它是否有危险单凭这一点?
有没有更好的方法来处理这个问题?
答案 0 :(得分:4)
我对之前的回答不满意。听起来太像人们必须已经发明了一种方法来做到这一点。
好像有!查看Unison。它有一个GUI和一切。
答案 1 :(得分:0)
首先,如果您正在进行双向rsync(即首先以一种方式运行,然后运行另一种方式),那么您需要使用--update
,并且需要使两台服务器上的时钟精确对齐。如果两个服务器都写入同一个文件,则最后一次写入将获胜,并且先前的写入将丢失。
其次,我不认为你可以使用删除。反正不是直接的。 rsync保留的唯一状态是文件系统本身的状态,如果这是一个移动目标,那么它就会混淆。
我建议您在删除文件时将其名称写入文件。然后,而不是使用rsync --delete
,例如使用cat deleted-files | ssh serverb xargs rm -v
手动执行。
所以,你的过程看起来像这样:
ServerA:
rsync -a --update mydir serverB:mydir
cat deleted-files | ssh serverB xargs rm -v
ServerB:
rsync -a --update mydir serverA:mydir
cat deleted-files | ssh serverA xargs rm -v
显然,这两个同步不能同时运行,而且我已经停止了其他重要的rsync选项:你可能想要考虑--delay-updates
,--partial-dir
和其他人。