我最近为我们的网站设置了一个负载平衡解决方案。我们托管了大约 200 个网站,大多数网站运行我们的自定义应用程序,但有些网站运行 wordpress 博客(可以在其中上传/删除文件)。设置很简单:
|-------------------> Apache1
|
HAProxy -|
|
|-------------------> Apache2
我已将其设置Apache1
为“主服务器”,以便Apache2
使用以下命令每分钟将其上所做的大多数更改都 rsync 到:
rsync -av --delete apache1:/var/www/html/ /var/www/html/
问题是,如前所述,在某些情况下,文件会在 上添加/删除Apache2
。到目前为止,我想到的唯一解决方案是让Apache1
rsync 某些目录(例如 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。大多数应用程序永远不需要删除文件,除非它们正在创建临时文件,而这些文件可能应该存储在您的站点结构之外。这仍然可以用于删除文件,但我仍然会尝试定位您存储文件的特定目录。