我最近为我们的网站设置了一个负载均衡的解决scheme。 我们主持了大约200个网站,我们的自定义应用程序运行最多,但有些运行wordpress博客(文件可以上传/删除)。 该设置是基本的:
|-------------------> Apache1 | HAProxy -| | |-------------------> Apache2
我已经将Apache1设置为“主”,因此,使用以下命令,每分钟对其进行的大部分更改都将rsync转换为Apache2 :
rsync -av --delete apache1:/var/www/html/ /var/www/html/
问题是,正如前面提到的,在某些情况下,文件被添加/删除在Apache2 。 我到目前为止唯一的解决scheme是让Apache1 rsync将某些目录(例如wp-content)中的所有文件都Apache1到自己(而不是删除)中,然后将所有文件都推送回Apache2 。
这有缺陷,主要的是:
Apache2上被删除的额外文件 有没有任何方法来保持2+ Web服务器同步,考虑到两台服务器可以添加,更新和删除文件?
我正在使用DRBD的OCFS2 。
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 /etc/ocfs2/cluster.conf OCFS2configuration:
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-overview实用程序查看DRBD状态:
# 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
我没有使用它在服务器设置,但你可以尝试Unison 。 它处理任何一方的变化,并会自动同步没有冲突的事情。 我相信它只限于2个主机,所以它不会超过你现有的解决scheme。
我知道如何扩展2台主机的唯一方法是设置NFS或其他共享/分布式文件系统。
另一个select是build立一个“权威的”内容副本,除了面向前台的web服务器,并确保所有的更新和更改是在该副本上进行的。
然后,按照设定的时间表从该服务器部署到任意数量的前置服务器。
是的,这是一个额外的内容副本,但它确实给你一些潜在的好处:
1)控制更新何时生效
2)在处理任何数量的服务器之间的多方向同步时较不复杂
3)能够进行更改和预览,而不会影响您的前置制作。
其他选项是某种types的共享存储,分布在尽可能多的硬件上,以满足可靠性,性能和可伸缩性的需要。
我们目前也在使用rsync,但我并不是疯狂的。
我们一直在试验http://fileconveyor.org ,它不仅会在两台服务器之间同步,还可以与S3,Cloudfiles或其他云存储同步。 这显然会给我们提供更多的灵活性。
我目前没有任何configuration设置可供共享,但是我们喜欢看到的内容。
我一直有这个相同的难题,并根据具体的应用程序的具体问题遇到了一些解决scheme。
NFS:虽然NFS或某种共享驱动器肯定会起作用,但就我而言,我想避免这种情况,因为它造成了一台能够降低整个系统的计算机的瓶颈。 我的负载均衡原因中有很大一部分是冗余的,而NFS则将此排除在外。 虽然如果所有其他选项失败,这可能是唯一的一个。
数据库文件:我所做的大部分工作就是构build应用程序,将其文件存储在数据库中。 这样我就不必担心任何集群Web服务器不得不写任何数据。 这似乎是目前为止最好的解决scheme,但如果您不开发软件,往往不是一种select。
DNS控制:对于一些只有less数用户使用的“pipe理”部分的站点或应用程序(比如wordpress博客),我有时会使用单独的dns指向主服务器,以确保pipe理员只对正确的服务器。 通过一些修改,你可以redirectwp-admin使用admin dns。 这里的缺点是,尽pipe博客的正面仍然是负载平衡和重复的,但是pipe理部分依赖于一个系统。 对于大多数博客来说,这可能是好的。
双向rsync:我试图避免的最后一个选项是多方向rsyncing。 删除成为rsync难以知道文件是否为新文件(因此只显示在一台服务器上)或删除的文件(因此只在一台服务器上显示)的最大问题。 一般来说,如果我必须做多方向的rsyncing,我的目标是存储数据的特定文件夹,并使用符号链接将其从结构的其余部分中删除,然后双向rsync而不删除。 大多数应用程序不需要删除一个文件,除非它们正在创build临时文件,无论如何这些文件应该可以存储在您的网站结构之外。 这仍然可以与删除文件,但我仍然尝试将目标存储文件的特定目录。