即使文件被删除,如何保持负载平衡服务器同步?

即使文件被删除,如何保持负载平衡服务器同步?

我最近为我们的网站设置了一个负载平衡解决方案。我们托管了大约 200 个网站,大多数网站运行我们的自定义应用程序,但有些网站运行 wordpress 博客(可以在其中上传/删除文件)。设置很简单:

          |-------------------> Apache1
          |
 HAProxy -|
          |
          |-------------------> Apache2

我已将其设置Apache1为“主服务器”,以便Apache2使用以下命令每分钟将其上所做的大多数更改都 rsync 到:

rsync -av --delete apache1:/var/www/html/ /var/www/html/

问题是,如前所述,在某些情况下,文件会在 上添加/删除Apache2。到目前为止,我想到的唯一解决方案是让Apache1rsync 某些目录(例如 wp-content)中的所有文件到其自身(而不是删除),然后将所有内容推回Apache2

这有其缺陷,主要有:

  • 两台服务器最终将获得已删除的额外文件Apache2
  • 当我添加更多服务器时,rsync 脚本将需要更长时间才能完成。

有没有什么方法可以让 2 个以上的 Web 服务器保持同步,同时考虑到两个服务器都可以添加、更新和删除文件?

答案1

我在用着OCFS2 与 DRBD

DRBD 资源/etc/drbd.d/r0.res

resource r0 {
    syncer { rate 1000M; }
    net {
        allow-two-primaries;
        after-sb-0pri discard-zero-changes;
        after-sb-1pri discard-secondary;
        after-sb-2pri disconnect;
    }
    startup { become-primary-on both; }

    on s1 {
        device      /dev/drbd1;
        disk        /dev/sdc;
        address     ip1:7789;
        meta-disk   internal;
    }
    on s2 {
        device      /dev/drbd1;
        disk        /dev/xvdb2;
        address     ip2:7789;
        meta-disk   internal;
    }
}

/dev/drbd1格式化为 ocfs2 文件系统:

/dev/drbd1   ocfs2   100660180   7427076  93233104   8% /data/webroot

不使用 Pacemaker 的 OCFS2 配置/etc/ocfs2/cluster.conf

node:
    ip_port = 7777
    ip_address = ip1
    number = 0
    name = s1
    cluster = ocfs2

node:
    ip_port = 7777
    ip_address = ip2
    number = 1
    name = s2
    cluster = ocfs2

cluster:
    node_count = 2
    name = ocfs2

可以使用实用程序查看 DRBD 状态drbd-overview

# drbd-overview 
  1:r0  Connected Primary/Primary UpToDate/UpToDate C r---- /data/webroot ocfs2 96G 9.8G 87G 11% 

或来自/proc/drbd

cat /proc/drbd 
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:09

 1: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r----
    ns:953133955 nr:42207234 dw:1185526354 dr:62396241 al:230084 bm:5853 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

答案2

我们目前也在使用 rsync,但我对它并不太感兴趣。

我们一直在尝试文件传送带,它不仅可以在两台服务器之间同步,我们还可以与 S3、Cloudfiles 或其他云存储同步。这显然会为我们提供更多的灵活性。

我目前还没有任何配置设置可以分享,但我们喜欢我们所看到的。

答案3

我还没有在服务器设置中使用它,但你可以尝试齐奏。它可以处理任一侧的更改,并会自动同步不冲突的内容。我认为它仅限于 2 个主机,因此它无法超越您当前的解决方案。

我所知道的扩展超过 2 台主机的唯一方法是设置 NFS 或其他共享/分布式文件系统。

答案4

我一直遇到同样的难题,并且根据相关应用程序的具体情况找到了一些解决方案。

NFS:虽然 NFS 或某种共享驱动器肯定可行,但就我而言,我想避免使用它,因为它会造成一台计算机的瓶颈,从而导致整个系统崩溃。我选择负载平衡的主要原因是冗余,而 NFS 消除了这一点。不过,如果所有其他选项都失败了,这可能是唯一剩下的选项。

数据库文件:我尝试做的大部分工作是构建应用程序以将其文件存储在数据库中。这样我就不必担心任何集群 Web 服务器必须写入任何数据。这似乎是迄今为止最好的解决方案,但如果您不开发软件,通常不是一个选择。

DNS 控制:对于某些只有少数用户使用的“管理”部分的网站或应用程序(例如 wordpress 博客),我有时会使用指向主服务器的单独 DNS,以确保管理员仅在正确的服务器上创建写入。通过一些修改,您可以重定向 wp-admin 以使用管理 DNS。这里的缺点是,虽然博客的前端保持负载平衡和冗余,但管理部分依赖于一个系统。不过,对于大多数博主来说,这可能没问题。

双向 rsync:我尽量避免的最后一个选项是多方向 rsyncing。删除成为这里最大的问题,因为 rsync 很难知道文件是新文件(因此只显示在一台服务器上)还是已删除文件(因此只显示在一台服务器上)。通常,如果我必须进行多方向 rsyncing,我会定位存储数据的特定文件夹,并使用符号链接将其从其余结构中删除,然后在不删除的情况下双向 rsync。大多数应用程序永远不需要删除文件,除非它们正在创建临时文件,而这些文件可能应该存储在您的站点结构之外。这仍然可以用于删除文件,但我仍然会尝试定位您存储文件的特定目录。

相关内容