![负载平衡场景-我是对的吗?](https://linux22.com/image/530594/%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1%E5%9C%BA%E6%99%AF-%E6%88%91%E6%98%AF%E5%AF%B9%E7%9A%84%E5%90%97%EF%BC%9F.png)
我目前有一个运行我网站的网络服务器,所有请求都直接发送到那里。网络服务器运行 ruby on rails,一切正常,但随着我的网站的发展,我需要获得更大的服务器,或者扩展更多服务器来处理额外的负载。
我想采用第二种方案。我不想拥有一台大型服务器,而是想要两台或三台较小、更便宜的服务器。这就是我思考应该这样做:
所有域都指向 xxx30 (HAProxy)。当 HAProxy 收到 GET 请求时,它会将此请求发送到最不繁忙的可用 Web 服务器。Web 服务器直接响应客户端。通过此设置,我可以通过随时添加 Web 服务器轻松扩展,并通过从集群中拉出有问题的 Web 服务器来快速修复任何问题。
x.x.x.30 <-- HAProxy
x.x.x.31 <-- webserver1: Rails/Passenger3
x.x.x.32 <-- webserver2: Rails/Passenger3
我对此设置的理解正确吗?
答案1
是的 - 我认为你已经掌握了基础知识:
什么是HAProxy:
它是代理 — 并且是唯一一个可以与任何基于 TCP 的东西配合使用的代理 — 而不仅仅是 HTTP。它不提供文件服务 — 它只是代理。
为什么选择 HAProxy:
HAProxy 带有大量负载平衡算法,包括选择待处理连接数最少的后端的“最少连接”策略。
可以通过 URL 对后端进行健全性和健康性检查,以避免将请求路由到有故障的后端。(它甚至可以错开这些检查以避免峰值。)
专用状态页面为您提供后端状态、正常运行时间和大量非常好的指标。请求可以根据各种因素进行路由:cookie、URL 子字符串、客户端 IP 等。
如何设置HAProxy:
listen app_a_proxy 127.0.0.1:8100
# - equal weights on all servers
# - queue requests on HAPRoxy queue once maxconn limit on the appserver is reached
# - minconn dynamically scales the connection concurrency (bound my maxconn) depending on size of HAProxy queue
# - check health of app. server every 20 seconds
server a1 127.0.0.1:8010 weight 1 minconn 3 maxconn 6 check inter 20000
server a1 127.0.0.1:8010 weight 1 minconn 3 maxconn 6 check inter 20000
listen app_b_proxy 127.0.0.1:8200
# - second cluster of servers, for another app or a long running tasks
server b1 127.0.0.1:8050 weight 1 minconn 1 maxconn 3 check inter 40000
server b2 127.0.0.1:8051 weight 1 minconn 1 maxconn 3 check inter 40000
server b3 127.0.0.1:8052 weight 1 minconn 1 maxconn 3 check inter 40000
答案2
您基本上说对了,但您忽略了一个细节,那就是响应部分。您描述的设置称为“直接路由”,这意味着数据包进入负载均衡器,然后转发到后端服务器,该服务器直接回复客户端,而无需将流量通过负载均衡器传回。
为了使 DR 正常工作,负载均衡器 IP 地址需要还存在于所有 Web 服务器上。但是,您需要在其他服务器上禁用这些地址的 ARP 响应。 这是对 CentOS 上关于此问题的讨论的参考。
另一件需要记住的事情是,这个代理现在可能成为瓶颈或单点故障。通常在设置这些负载平衡代理时,它们被设置为高可用性机器集群,这样就可以对一台机器进行维护,或者一台机器发生故障,而不会导致整个站点瘫痪。
除了 DR,您还可以进行 NAT,其中 Web 服务器使用负载均衡器作为网关,并且 Web 服务器具有私有 IP,负载均衡器会将其转换为公共 IP 或从公共 IP 转换为私有 IP。这通常更容易配置,因为您不必担心 ARP 问题或非对称路由等...
最后,一种不常被提及的方法是使用 iptables CLUSTERIP 模块。此模块根据远程 IP 地址或 IP 地址和端口号以及它在集群中的哪个节点上运行来阻止流量。因此,您需要在所有计算机上将 IP 地址配置为别名,并配置 CLUSTERIP。它使用连接信息的哈希值,以便集群中的每台计算机都同意哪个节点将处理它。数据包在不处理它的节点上被阻止,并由处理它的节点接受。这是在低级使用多播 MAC 地址完成的。
这种方法效果很好,因为您没有专用的负载均衡器,因此不会出现故障。但是,这种方法有些原始,显然无法基于 URL 或其他“第 7 层”信息进行负载均衡,只能基于 IP 地址进行。
这是我去年写的一篇关于如何设置 CLUSTERIP 的文章。
有很多选择,我们会根据情况使用它们。它们都有各自的优点和缺点,具体取决于您的情况、目标和经验水平。