同步 2 个远程文件夹

同步 2 个远程文件夹

我们有 2 台 Drupal 服务器,它们read/write各自拥有同一个文件夹的副本(sites/default/files对于那些了解的人来说,这个文件夹Drupal就是这个)。这两个文件夹应该同步。我一直在研究一些选项,以下是我发现的:

选项 1:双向 Rsync :不可选
您需要rsync双向运行,因为两个文件夹都会被修改。只要文件被修改,一切都会正常进行,因为您可以使用-u检查更新时间的标志,并且仅在源比目标更新时才进行修改。但是,由于rsync没有保留被删除的文件的历史记录以及删除时间,因此rsync不知道如何处理在一侧删除的文件,不知道是否应该将它们保留在另一侧(因为最近更新)还是也将其丢弃。

选项 2:网络共享:可以,但存在 I/O 等待性能问题
一个选项是设置网络共享,这样就无需同步。缺点是需要等待 I/O,因为两个服务器都read/write在同一磁盘上。

选项 3:具有主副本的第三台服务器:可以,但存在潜在的性能/竞争条件问题 另一个选项是让第三个服务器保存文件夹的主副本。每当在一台 Drupal 服务器上进行更改时,Drupal 服务器文件夹就会被rsync同步到主副本,从而避免选项 1 中提出的问题。但是,要使此方法有效,您需要按照 Drupal 服务器上发生的顺序将更改同步到主副本,从而引发以下问题:
-P1:如果你将所做的每个更改都同步到主服务器,并且更改频繁发生,则服务器可能会因同步过程而变得非常忙碌
-P2:即使您按顺序启动同步作业,由于各种因素(进程执行速度、网络延迟……),您也无法保证文件最终会在主副本上按顺序同步。

Q1:如何解决问题 P1 和 P2?
问题 2:还有其他方法可以保持 2 个远程文件夹同步吗?

附加信息:

server OS:                   Ubuntu server 10.04 LTS
Drupal v:                    Drupal 6.X
Size of sites/default/files: 4.5G

更新 1:Unison 测试

我测试了一下Unison,对于已删除的文件,它并没有像我预期的那样工作:

[1] 设置目录

FOLDER1     FOLDER2
file1 (new)     (empty)

[2] 齐奏(unison FOLDER1 FOLDER2

FOLDER1        FOLDER2            
file     ---->            file1

=> file1 从 FOLDER1 复制到 FOLDER2

[3] 更新目录

FOLDER1     FOLDER2
file1 (removed) file1 (modified)

[4] 再次运行 Unison ( unison FOLDER1 FOLDER2)

FOLDER1        FOLDER2            
deleted  <-?-> changed    file1  [] 
No default command [type '?' for help]

此时Unison不知道是否应该file1从 中删除FOLDER2还是复制到FOLDER1。我希望Unison执行后者,如下所示:
-在 [2] 处,我们知道file1两个文件夹中 的最后修改/访问时间,并且这些时间会被复制到档案中Unison。-
在 [4] 处,我们看到file1中缺少 ,FOLDER1因此考虑删除的时间应为档案中的最后可用时间(即在 [2] 处获得的时间)。-在 [4] 处,我们还看到中
的最后修改/访问时间大于 [2] ,因此应该从 复制到。 file1FOLDER2FOLDER1file1FOLDER2FOLDER1

我一直在尝试不同的开关,例如-auto(自动接受默认操作)和-batch(批处理模式:不问任何问题),但仍然Unison无法自行做出决定。

问:有没有办法Unison或者其他工具可以按照我描述的行为来执行?

答案1

您是否有必要使用 2 个 Drupal 副本?Drupal 每次页面请求都会产生大量查询,多个 Drupal 前端共享一个远程数据库后端可能会造成相当大的性能损失。

您是否考虑过使用多个缓存前端和一个 drupal + 数据库后端?Pressflow 是 Drupal 的增强版本,内置了与 memcached 和 Varish(缓存前端)的集成。

http://pressflow.org/

答案2

我认为你把问题复杂化了。你只需要有 NFS 之类的东西。因此,一台服务器将在本地访问文件夹,另一台服务器将通过 NFS 远程访问文件夹。我认为 NFS 不会那么慢,尤其是当两台服务器在同一子网内相邻时。

另一个选择是在磁盘级别使用复制,例如DRBD

使用这样的解决方案,您可以消除手动同步两种方式更改的需要。

答案3

要解决您的两个问题,请使用 unison。它基于 rsync,可解决已删除文件的问题。

答案4

正如@Khaled简要提到的那样,你可以使用DRBD为了这。

每个节点都有自己的数据本地副本(因此读取速度与本地磁盘一样快);您可以对其进行配置,以便写入阻塞,直到数据已写入其他节点上的磁盘(因此延迟取决于网络速度,但所有客户端都会看到文件的一致视图)。

相关内容