如何制作冗余负载均衡器?


27

我知道负载平衡器的目的是平衡服务器之间的负载并跟踪实例运行状况等。但是,如果负载平衡器本身发生故障怎么办?您如何设置冗余负载均衡器?(负载均衡负载均衡器?)

我可以看到DNS运行状况检查如何有用,但是显然存在主要的延迟问题,不是吗?

假设您没有使用任何第三方服务,例如AWS ELB或任何类似的东西。如果您仅使用说Nginx怎么办?


在体系结构的最顶层没有“负载平衡负载平衡器”,您只需使LB冗余并设置高可用性解决方案即可像大多数群集类型一样处理故障。
哈维尔·卢卡斯

Answers:


32

有两种方法可以实现负载均衡器的HA(高可用性)-或就任何服务而言。假设您有两台具有IP地址的机器:

  • 192.168.100.101
  • 192.168.100.102

用户连接到IP,因​​此您要做的是将IP与特定框分开-例如创建虚拟IP。该IP为192.168.100.100。

现在,您可以选择HA服务,该服务将负责IP地址的自动故障转移/故障回复。UNIX的一些最简单的服务是(u)鲤鱼和keepalived,一些更复杂的服务例如是RedHat Cluster Suite或Pacemaker。

让我们以保持活力为例-两个保持活力的服务-每个服务都在自己的盒子上运行-并且它们相互通信。这种通信通常称为心跳。

|   VIP   |                           |         |
|  Box A  | ------v^-----------v^---- |  Box B  |
|   IP1   |                           |   IP2   |

如果一个keepalived停止响应(由于某种原因导致服务中断,或者该框反弹或关闭)-在另一个box上的keepalived将注意到错过的心跳,并假定其他节点已死,并采取故障转移措施。在我们的案例中,该动作将是启动浮动IP。

                                      |   VIP   |
    ------------------ -------------- |  Box B  |
                                      |   IP2   |

在这种情况下,最糟糕的情况是客户端失去会话,但它们将能够重新连接。如果要避免这种情况,两个负载平衡器必须能够在它们之间同步会话数据,并且如果它们能够做到这一点,则用户可能不会注意到任何东西,除非可能会中断一小段延迟。

这种设置的另一个陷阱是脑裂-当两个盒子都在线但链接断开时,两个盒子都使用相同的IP。这通常可以通过某种防护机制(SCSI保留,IPMI重新启动,智能PDU停电...)或奇数数量的节点来解决,这些节点要求大多数群集成员都处于活动状态才能启动服务。

|   VIP   |                           |   VIP   |
|  Box A  |                           |  Box B  |
|   IP1   |                           |   IP2   |

更复杂的集群管理软件(例如Pacemaker)可以移动整个服务(例如:在一个节点上停止它,然后在另一个节点上启动它),这就是可以实现诸如数据库之类的服务的HA的方式。

另一种可能的方法-如果要在负载均衡器附近控制路由器,则可以利用ECMP。这种方法还使您能够水平扩展负载均衡器。这可以通过两个与BGP对话的路由器中的每一个进行。每个盒子都必须通告虚拟IP(192.168.100.100),路由器将通过ECMP负载均衡流量。如果机器死了,它将停止发布VIP,这将阻止路由器向其发送流量。在此设置中,您唯一需要注意的是,如果负载均衡器本身失效,则停止发布IP。


3

将Nginx用作负载均衡器,应该可以通过更改配置以检测无响应超时来遵循本文中详细介绍的重定向:

nginx自动故障转移负载平衡

从理论上讲,如果您具有HA环境,则群集的多个负载平衡器应该允许在一个服务出现故障时维护服务。

希望这可以帮助。


2

硬件负载均衡器支持“主动/被动”或“主动/主动”设置已有多年,在两种情况下,它们都从第1/2层的角度并行设置...主动/被动使用如上所述的监视/保持活跃机制,主动/主动可以以多种方式实现。要在前端作为单个IP出现,两个或多个平衡器可能只要全部/都在线,就可以执行以下操作:

  • 当客户端在同一网络上时,根据源MAC或IP地址的有选择地对共享IP选择性地应答ARP请求
  • 在处理给定新TCP连接流量的彼此之间进行协商
  • 让重复或错误的第3-7层流量不计后果地发生,并依靠客户端/路由器TCP堆栈进行分类

然后,当与对方设备的通信丢失时,将其模式更改为接受所有或更多流量。

在后端:

  • 在正常操作中,每个平衡器可能仅使用应用程序服务器的给定子池
  • 或者,也可能只是在这里生成重复的请求...
  • 或者,可以在平衡器之间进行协商
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.