我正在build立一个高度可用的Web群集,我打算开始使用连接到共享存储的2个Web服务器(可能通过NFS)。 什么是实施这个最好的方法? Web服务器是否只有Apache运行,并且所有Web内容(html,css)都驻留在共享存储上? 所以,如果我决定扩大,那么我只需要添加额外的Apache节点? 如果我使用一个CMS如Wordpress,这是否意味着我只需要安装Wordpress一次(在共享存储上),并不断添加运行Apache的服务器来共享负载?
制作一个非常可靠的NFS服务器,除了NFS以外什么都不运行是非常重要的。 运行双磁头/单磁盘架系统可以为您提供一些冗余,但是一旦您尝试使用双磁头/双磁盘架,就会遇到相当多的问题。 虽然您可以运行带有双磁头/双磁盘架的主/从,但双主要求群集文件系统(如OCFS或GFS)。 所以,第一步,做一个非常可靠,非常简单的NFS服务器。
您可以使用心跳,并在边缘运行您的Web服务器,如果出现故障,另一个中毒您的ARP并开始回答请求。 但是,这会变得有点笨拙,最终你会希望在你的web服务器前放一个负载均衡器(或者一对),并且使用IPVS / LVS来把请求指向你的后端。 使用ipvs,你将需要build立连接关系,以确保用户通常使用相同的服务器,使任何使用php会话的东西都很开心。 您也可以在NFS服务器上共享会话目录,这将允许两台机器访问相同的会话文件。
MySQL变得有趣。 它需要三个节点来运行集群,但是有一点小小的诡计,你可以用两个节点来完成。 MySQL在NFS文件系统上运行的不好,所以你需要运行一个心跳的主/从设置来进行故障切换,或者build立一对mysql服务器并在集群设置中运行它们。
您的读/写负载将是真正的决定性因素。 您需要运行一个到NFS服务器的gigE LAN连接,以及一个到Internet的独立连接。 如果您正在运行繁重的读取负载,则不会有太多问题。 如果你所有的服务器都有很大的写入负载,那么你会遇到很多其他的问题。 如果可能的话,如果您有大型文件,通常服务于您的局域网上使用巨型帧。 由于这些文件位于NFS服务器上,因此如果使用sendfile和apache,并且该文件稍后被删除,那么下次访问该文件时将出现总线错误。
如果你想变得棘手,而且你的读取量很高,那么你可以考虑使用AFS,这个AFS可以从共享存储中做很小的本地caching。 这样,如果Web服务器与存储节点断开连接,它仍然可以为大多数静态内容提供服务。 另外,使用Varnish / Squid或其他一些caching系统将大大减less局域网的带宽。 然后,你有一个或两个Varnish服务器有自己的caching,复制内存中的内容的问题。 这可能是一个值得权衡,以减less局域网stream量。
一旦你build立了框架,从两个web服务器到三个只是添加一个新的服务器的问题。 从一个到两个这个步骤通常是一个很大的飞跃。 某些软件在群集上运行时运行方式与运行在单台计算机上相反。
这听起来像是一个合理的计划给我。 你只是想缩小或消除单点故障? 如果是后者,你的共享存储也会出现问题(如果这些读取没有被Apache服务器本地caching,则会增加额外的延迟)。 如果你的内容大部分是静态的,有办法build立一个权威的内容存储,然后定期复制到你的web节点上,这样每个节点都有一个本地拷贝。 这是比较复杂的,但是如果不使用所有的networking节点,你的集中存储也会失败。