我正在寻找一种将 Apache 设置为高可用性的方法。这个想法是建立一个由 2 个以上 Apache 服务器组成的集群,为相同的网站提供服务。我可以使用循环 DNS 设置每台服务器的 IP 地址,以便每个请求随机发送到集群中的一台服务器(我现在还不太关心负载平衡,尽管这可能会在以后发挥作用)。
我已经设置好它,并与多个 Apache VM 服务器(分布在多个物理服务器上)一起为网站提供服务,并使用循环 DNS,这很好用。SQL 数据库使用 MariaDB 在高可用性集群中设置,Web 数据(HTML、JS、PHP 脚本、图像、其他资产)存储在 LizardFS 中,会话也存储在共享位置。这一切都运行良好,直到集群中的一台服务器因某种原因无法访问。然后,一定比例的请求(大致为停机服务器的数量除以集群中的总服务器数量)未得到答复。以下是我考虑过的选项:
自动 DNS 更新
有一些进程可以监控 Web 服务器的功能,并从 DNS 中删除任何已关闭的服务器。这有两个问题:
首先,尽管我们可以将 TTL 设置为非常低的数字(例如 5 秒),但我听说少数 DNS 服务器会强制执行比我们的更高的最低 TTL。而且,无论 TTL 设置如何,某些浏览器(即 Chrome)都会将 DNS 缓存不少于 60 秒。因此,即使我们这边做得不错,但如果发生 DNS 更新,某些客户端可能在一段时间内无法访问网站。
其次,监控集群功能
并更新 DNS 记录的程序将成为新的单点故障。我们
可以通过让多个监视器分布在多个服务器上来解决这个问题
系统,因为如果它们都检测到问题并且都进行了相同的 DNS 更改,那么就不会导致任何问题。
uCarp/心跳
将访问的 IP 地址和循环 DNS 虚拟出来,并在服务器发生故障时将它们从故障服务器重新分配给正常运行的服务器。例如,服务器 1 的 VIP 是 192.168.0.101,服务器 2 的 VIP 是 192.168.0.102。如果服务器 1 发生故障,则 192.168.1.102 将成为服务器 2 上的附加 IP。这有两个问题:
首先,据我所知,uCarp/Heartbeat 专门监控对等点的不可访问性,例如,如果对等点无法 ping 通。当发生这种情况时,它会接管已关闭对等点的 IP。这是一个问题,因为除了网络上无法访问之外,Web 服务器无法处理请求的原因还有很多。Apache 可能崩溃了,可能存在配置错误,或者其他原因。我希望标准是“服务器未按要求提供页面”,而不是“服务器无法 ping 通”。我不认为我能在 uCarp/Heartbeat 中定义这一点。
其次,这不适用于跨数据中心,因为跨数据中心的每组服务器都有不同的 IP 地址块。我无法在数据中心之间使用虚拟 IP 浮动。跨数据中心运行的要求(是的,我的分布式文件系统和数据库集群可跨数据中心使用)不是必需的,但这将是一个不错的加分项。
问题
那么,对于如何处理这个问题,您有什么想法吗?基本上,高可用性的终极目标是:没有单点故障(无论是在服务器、负载平衡器还是数据中心),并且在切换时几乎没有停机时间。
答案1
当我需要 HA 和负载均衡时,我会使用 keepalived 并为其配置两个 VIP。默认情况下,VIP1 分配给 server1,VIP2 分配给 server2。当任何一台服务器宕机时,另一台服务器将占用这两个 VIP。
Keepalived 将通过监视其他服务器来处理 HA。如果服务器无法访问或任何接口关闭,它将更改为FAULT
状态。VIP 将被其他服务器占用。要监视您的服务,您可以使用track_script
选项。
如果您想在另一个数据中心添加另一个集群,您可以添加另外两台服务器并进行相同的配置。现在,您可以使用 DNS 循环在数据中心之间负载共享流量。在这种情况下无需更新 DNS。