我正在寻找一种方法来将Apache设置为高可用性。 这个想法是有一个服务于相同网站的2个Apache服务器集群。 我可以使用循环DNS设置每台服务器的IP地址,以便将每个请求随机发送到群集中的一台服务器(我不太在意负载平衡,尽pipe可能会出现这种情况稍后播放)。
我已经build立并使用了多个Apache VM服务器(分布在多个物理服务器上)服务于网站,并且使用循环DNS,并且工作正常。 SQL数据库是在高可用性集群中使用MariaDB设置的,Web数据(HTML,JS,PHP脚本,图像,其他资源)存储在LizardFS中,会话也存储在共享位置。 这一切都运行良好,直到群集中的某个服务器因为任何原因而变得不可访问。 然后,一个百分比的请求(大致上是服务器被closures的次数除以集群中的服务器总数)是没有答案的。 以下是我考虑的选项:
自动DNS更新
有一些过程来监视Web服务器的function,并从DNS中删除任何closures的服务器。 这有两个问题:
首先,尽pipe我们可以将TTL设置为一些非常低的数字(比如5秒),但是我听说less数DNS服务器会强制实现比我们更高的TTL。 而且,有些浏览器(即Chrome)会将DNScaching不less于60秒,而不pipeTTL设置如何。 所以,即使我们做得好,在DNS更新的情况下,一些客户可能无法访问站点一段时间。
其次,监控集群function的程序
并更新DNSlogging成为新的单点故障。 我们
可以通过将多个监视器分布在多个监视器上来解决这个问题
系统,因为如果他们都检测到问题,他们都做出相同的DNS更改,那么不应该导致任何问题。
uCarp /心跳
使被访问的IP地址在循环DNS虚拟中,并且在服务器closures的情况下将它们重新分配给从服务器中断下来的服务器。 例如,server1的VIP是192.168.0.101,server2的VIP是192.168.0.102。 如果server1发生故障,则192.168.1.102将成为server2上的附加IP。 这有两个问题:
首先,就我所知,uCarp / Heartbeat特别监视对等设备,以便无法访问,例如,如果对等设备无法被ping通。 当这种情况发生时,它接pipe被击落的对等体的IP。 这是一个问题,因为Web服务器可能无法为请求提供服务的原因更多,而不仅仅是在networking上不可访问。 Apache可能已经崩溃,可能存在configuration错误或其他原因。 我想要的标准是“服务器不按要求提供页面”,而不是“服务器不能ping通”。 我不认为我可以在uCarp / Heartbeat中定义。
其次,跨数据中心不起作用,因为跨数据中心的每组服务器都有不同的IP地址块。 我不能在数据中心之间有一个虚拟IP浮动。 跨数据中心运行的要求(是的,我的分布式文件系统和数据库集群可以跨数据中心使用)不是必需的,但是这将是一个很好的补充。
题
那么,关于如何处理这个问题的任何想法? 基本上,高可用性的圣杯:没有单点故障(无论是在服务器,负载平衡器还是数据中心),并且在切换时几乎不存在停机时间。
当我想要高可用性和负载共享时,我使用keepalived并configuration两个VIP。 默认情况下,VIP1分配给server1,VIP2分配给server2。 当任何服务器closures时,另一台服务器将占用两个VIP。
Keepalived将通过监视其他服务器来处理HA。 如果服务器不可达或任何接口closures,它将更改为FAULT状态。 VIP会被其他服务器占用。 要监视你的服务,你可以使用track_script选项。
如果要在另一个数据中心中添加另一个群集,则可以再添加两个服务器并执行相同的configuration。 现在,您可以使用DNS循环法在数据中心之间加载共享stream量。 在这种情况下,不需要DNS更新。