我正在设置一个高可用性 Web 集群,我计划从连接到共享存储的 2 个 Web 服务器开始(可能通过 NFS)。实现这一点的最佳方法是什么?Web 服务器上是否只应运行 Apache,而所有 Web 内容(html、css)都应驻留在共享存储上?因此,如果我决定扩展,那么我只需要添加其他 Apache 节点?如果我使用 Wordpress 等 CMS,这是否意味着我只需安装一次 Wordpress(在共享存储上),然后继续添加运行 Apache 的服务器来分担负载?
答案1
制作一个非常可靠的 NFS 服务器,只运行 NFS,这一点至关重要。运行双头/单架系统可以为您提供一些冗余,但是,一旦您尝试使用双头/双架,就会遇到很多问题。虽然您可以使用双头/双架运行主/从,但双主需要集群文件系统,如 OCFS 或 GFS。因此,第一步,制作一个非常可靠、非常简单的 NFS 服务器。
您可以使用 heartbeat 并在边缘运行您的 Web 服务器,如果其中一个发生故障,另一个会毒害您的 arp 并开始响应请求。但是,这变得有点难以处理,最终您将需要在 Web 服务器前面放置一个负载平衡器(或一对),并使用 IPVS/LVS 将请求定向到您的后端。使用 ipvs,您将需要设置连接亲和性,以确保用户通常访问同一台服务器,这会使使用 php 会话的任何东西都满意。您还可以在 NFS 服务器上共享会话目录,这将允许两台机器访问相同的会话文件。
MySQL 变得有趣。它需要三个节点来运行集群,但是,使用一些小技巧,您可以使用两个节点来实现。MySQL 无法很好地与 NFS 文件系统配合使用,因此,您需要运行带有心跳进行故障转移的主/从设置,或者设置一对 mysql 服务器并在集群设置中运行它们。
您的读/写负载才是真正的决定因素。您需要运行千兆以太网 LAN 连接到 NFS 服务器,并单独连接到 Internet。如果您正在运行大量读取负载,则不会有太多问题。如果您的所有服务器都在运行大量写入负载,那么您将遇到很多其他问题。如果可能,如果您有通常要处理的大型文件,请在 LAN 上使用巨型帧。由于文件位于 NFS 服务器上,如果您将 sendfile 与 apache 一起使用,并且该文件稍后被删除,则下次访问该文件时,您将收到总线错误。
如果您想玩点花样,并且读取量很大,可以考虑使用 AFS,它从共享存储中执行小型本地缓存。这样,如果 Web 服务器与存储节点断开连接,它仍然可以提供大部分静态内容。或者,使用 Varnish/Squid 或其他缓存系统将大大减少 LAN 带宽。然后,您就会遇到一个或两个 Varnish 服务器有自己的缓存,在内存中重复内容的问题。这可能是减少 LAN 流量的值得的权衡。
一旦设置好框架,从两个网络服务器增加到三个网络服务器只需添加一台新服务器即可。从一台服务器增加到两台服务器通常是一个相当大的飞跃。有些软件在集群上运行时的行为与在单台机器上运行时的行为不同。
答案2
在我看来,这听起来是个合理的计划。您只是希望扩展还是消除单点故障?如果是后者,您的共享存储也可能会出现问题(如果读取未由 Apache 服务器本地缓存,则会增加额外的延迟)。如果您的内容大部分是静态的,则有办法拥有一个权威的内容存储,然后定期将其复制到您的 Web 节点,以便每个节点都有本地副本。这更复杂,但允许您的集中式存储也发生故障,而不会影响所有 Web 节点。