![Apache 故障转移和负载平衡](https://linux22.com/image/501752/Apache%20%E6%95%85%E9%9A%9C%E8%BD%AC%E7%A7%BB%E5%92%8C%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1.png)
我在一家小型金融公司担任 Web 应用程序开发人员。我们公司有一个内部网站,用 PHP 编写并在 Apache 上运行。最近我们的服务器瘫痪了,网站瘫痪了好几天,造成了严重问题。
我被要求再设置两台服务器来为网站提供服务。因此,我们需要在三台不同的机器上运行三台 Apache Web/App 服务器。当用户登录网站时,必须由三台服务器中的一台提供服务,具体取决于负载。此外,如果其中一台或两台服务器发生故障,则正常运行的服务器必须处理网站请求。
我只知道如何用 PHP 创建网站并将其托管在 Apache 服务器上。我对网络一无所知。请告诉我创建上述系统需要学习什么。
我并不指望有人给我喂食。我只是需要一个指引,告诉我要学什么才能实现我的目标。我同时在谷歌上搜索,但在这里问了这个问题,因为我急着要实现它。
答案1
一种常见的方法是开发能够感知集群的 Web 应用程序。您可能需要重新制作与数据库、会话、共享和动态数据相关的网站基础知识。我相信我的问题会引起你的兴趣:可扩展 Web 服务的云/集群解决方案。要使网站“可扩展”,您需要创建可扩展的设计。可惜的是,下面没有写着“使其更快”的按钮 :)
一个简单的方法是复制这些服务器之间的所有数据(您可以使用集群文件系统用于文件,并在这些服务器之间复制 MySQL/其他内容)并确保所有会话都可从所有服务器获得!这不是最好的建议,但您不必重新编写代码 :)
使用循环 DNS 可以轻松实现负载平衡:只需添加指向不同服务器的多个“A”记录,客户端就会随机选择这些服务器。例如,Google 有此功能:
$ 主机 -ta google.com google.com 的地址为 74.125.87.147 google.com 的地址为 74.125.87.103 google.com 的地址为 74.125.87.104 google.com 的地址为 74.125.87.99 google.com 的地址为 74.125.87.105
答案2
虽然最简单的负载平衡方法是 o_O Tync 的回答中提到的循环 DNS 之类的方法,但您需要注意,如果其中一台服务器发生故障并且您删除了它的 DNS 记录,您的部分用户将被定向到发生故障的服务器,直到他们的 DNS 记录上的 TTL 过期或您手动更改 IP。根据正常运行时间对您的重要性,这可能是不可接受的。此外,任何正在与发生故障的服务器进行会话的用户都将丢失该会话。
RRDNS 适合于负载平衡,但并不是高可用性的关键。
实现真正的高可用性负载平衡的最简单方法(我说的最简单,不一定是最便宜的)是使用位于 Internet 连接和 Web 服务器之间的硬件负载平衡网络设备。这种设备可用于在系统之间分配负载,还可以在出现问题时自动(或手动)从轮换中移除服务器。此外,它还将处理 TCP 连接,这样如果用户的原始设备出现故障,他们就可以自动连接到另一台服务器。此解决方案的另一个优点是,它通常几乎不需要或根本不需要修改应用程序即可实现。请注意,确实“高可用性”配置通常会使用两个负载均衡器来减少单点故障。
另一种选择是使用常规服务器来实现高可用性负载平衡场景。 这里是有关配置高可用性负载平衡 Apache 集群的一些信息。Linux 高可用性站点是 Linux 负载平衡信息的重要来源。
另一个选择是Linux 虚拟服务器项目。LVS 使用 Linux 作为所有组件(包括服务器和负载平衡器),并且通常提供无缝解决方案(一旦配置)。
总结一下:我的一般建议是,对于像您这样的情况,在这种情况下要求缺乏经验的管理员设置负载平衡,硬件负载平衡器设备是最轻松的方法。这显然会花费一些钱,但可以节省大量时间。当然,确定权衡点是个人决定。
答案3
我要做的是坐下来看看相关服务器上当前正在运行什么。
我现在假设你正在运行 Linux,尽管你没有明确说明这一点。你想要查看的是 Varnish。它是一个高性能反向代理和负载平衡器。你可以按照在线示例进行设置这里并且它应该很容易运行。
如果您有 3 台服务器中的 2 个 varnish 节点,则将 1/3 的流量指向每台服务器,按循环分配方式安排。这 2 台服务器需要唯一的公共 IP 地址,您可以在 DNS 中设置多个 A 记录以执行 RoundRobin DNS (RRDNS)。
如果您的服务对企业至关重要,并且上次中断导致严重损失,您可能需要争取更具弹性和冗余的网络。假设您目前只有一台服务器,位于一个供应商提供的一个 IP 上,如果您之前的中断与网络有关,您可能会发现提高网络弹性可以提高正常运行时间。
还要仔细检查您的监控,确保您监控服务器上可能导致服务器宕机的内容、硬盘上的 SMART 数据、可用交换空间、可用内存、可用磁盘空间。设置 Nagios 和 Munin。Nagios 在满足关键监控条件时发出警报,而 Munin 则将这些数据制成图表。
您可能还需要进行一些应用程序级别的更改。假设您的应用程序是基于会话的,您需要某种方式来处理不总是发送到同一台服务器的用户请求。您可以将它们设置为客户端,或服务器端并保持粘性。您可能会发现 memcached 会在这里为您提供很大的帮助。至于应用程序级别的更改,您可能想在 StackOverflow 上询问,因为它们更多的是代码而不是服务器。