我们有 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] ,因此应该从 复制到。 file1
FOLDER2
FOLDER1
file1
FOLDER2
FOLDER1
我一直在尝试不同的开关,例如-auto
(自动接受默认操作)和-batch
(批处理模式:不问任何问题),但仍然Unison
无法自行做出决定。
问:有没有办法Unison
或者其他工具可以按照我描述的行为来执行?
答案1
您是否有必要使用 2 个 Drupal 副本?Drupal 每次页面请求都会产生大量查询,多个 Drupal 前端共享一个远程数据库后端可能会造成相当大的性能损失。
您是否考虑过使用多个缓存前端和一个 drupal + 数据库后端?Pressflow 是 Drupal 的增强版本,内置了与 memcached 和 Varish(缓存前端)的集成。
答案2
我认为你把问题复杂化了。你只需要有 NFS 之类的东西。因此,一台服务器将在本地访问文件夹,另一台服务器将通过 NFS 远程访问文件夹。我认为 NFS 不会那么慢,尤其是当两台服务器在同一子网内相邻时。
另一个选择是在磁盘级别使用复制,例如DRBD。
使用这样的解决方案,您可以消除手动同步两种方式更改的需要。
答案3
要解决您的两个问题,请使用 unison。它基于 rsync,可解决已删除文件的问题。
答案4
正如@Khaled简要提到的那样,你可以使用DRBD为了这。
每个节点都有自己的数据本地副本(因此读取速度与本地磁盘一样快);您可以对其进行配置,以便写入阻塞,直到数据已写入其他节点上的磁盘(因此延迟取决于网络速度,但所有客户端都会看到文件的一致视图)。