这更多的是一个理论问题,目的是帮助我作为一名开发人员了解我们的系统管理员在应用程序部署中将使用的过程来分发我们的应用程序。我真的很感激一些见解,因为它将帮助我为可能出现的陷阱做好计划(并且最终可能会成为对这个主题有入门级问题的其他人的宝贵资源。)
假设有几台有效的主机可以响应任何传入的 HTTP 请求,那么在它们之间实现负载平衡的最基本方法是什么?作为一名程序员,我的基本推测可能是使用 DNS,直到流量变得如此之高,才需要更强大的方法。我假设代理在某种程度上被利用来检查哪些主机正忙于响应正在进行的处理,哪些主机处于空闲状态。
我有一个完全使用 WSGI 在 Python 中构建的应用程序数据层,在测试它时,我们刚刚使用了 Apache 中的 mod_wsgi。如果从理论上讲,要将其部署在多台相同的机器上,所有机器都连接到应用程序层中的相同数据库/资源,那么将对整个域的请求分散到它们之间的首要任务是什么?只需在 DNS 中列出多个 A 记录?
抱歉,我表达得不够清楚,只是还没能从开发者的角度找到关于这个主题的像样的入门书。非常感谢您的帮助!
答案1
典型的设置实际上会按照您建议的相反方式工作 - 首先实现前端负载均衡器(例如 HAProxy、Nginx、甚至 Varnish 等 - 或基于硬件),然后再使用 DNS。
传入的请求将到达负载均衡器,负载均衡器通常能够执行多项功能,包括:
- 跟踪后端服务器的状态(即健康状况)
- 智能地决定选择哪一个(例如最低负载,循环,特定请求类型等)
- 如果第一台服务器没有正确响应,请尝试另一台服务器
- 屏蔽后端服务器
这种方法有几个优点:
- 您可以控制设置的所有方面
- 您可以轻松添加和删除后端服务器
- 负载平衡是“智能地”完成的
然而,问题在于所有流量都必须流经单个负载均衡器。在某种程度上,这使其成为一个重要的故障点(但您可以通过故障转移来减少影响)。但更重要的是,在某些时候,单个节点将无法处理需要流经它的流量。后者是使用 DNS 解决的问题 - 这样请求就会返回不同的 IP,对应于不同的负载均衡器。
答案2
负载平衡方法完全取决于您希望提供给管理员的设计规范。没有“这是如何实现负载平衡”的指南,因为根据网站和所需解决方案的稳健性,有多种方法可以实现负载平衡。例如,对于只需要冗余且对业务没有影响的静态网站,循环 DNS 就足够了。如果您只需要冗余,那么集群就足够了。如果您需要 99.999 的可靠性和基于响应时间的负载平衡,您将需要冗余的专用硬件网络负载平衡器。
作为管理员,我需要知道您的应用程序到底在做什么,以及它将在何处增加负载,以确定如何最好地实现负载平衡。此外,如果它有数据库后端,它也需要冗余。这些都是您应该被询问或应该提供给管理员的信息,以便充分设计服务器基础设施。
答案3
可以使用多种方式实现 HTTP 请求的负载平衡。DNS 轮询是其中一种方式,但您无法对其进行太多控制。
另一个更好的方法是使用专用硬件进行负载平衡。例如,您可以运行 Linux 机器并安装诸如 haproxy 之类的负载平衡软件。
您需要注意的一个重要问题是,无论选择服务器云中的哪个服务器,从客户端都要具有相同的视图。