网络负载均衡器中的动态权重功能

前言

有时候我们可能希望能够动态调整负载均衡器中某个节点权重和最大连接数限制, 比如,某个节点负载有点高,当时又不想完全不接受连接, 此时就可以通过调整权重或最大连接数限制来减少新的连接数,防止节点出现过载的情况。

下面就简单记录一下相关需求和实现。

手动调整

手动调整节点权重和最大连接数是最简单也最直观的一种方法,一般可以通过下面的方法实现:

  • 配置文件支持热更新,通过更新配置文件中节点权重或最大连接数限制来实现。
  • 如果配置信息不是通过文件读取而是从配置管理系统读取的话,那就只要支持监听配置管理系统的更新推送并热更新内存中的配置就好。
  • 支持通过 API 更新运行时信息,比如支持通过 HTTP API 来更新。

自动调整

在某些场景下可能有需要负载均衡器支持自动动态调整节点权重和最大连接数限制的功能: 比如,新加了一个节点到负载均衡器中,但是后端节点是需要一段时间的预热才能处理大量连接, 当我们使用的是类似 【最少连接】这种负载均衡策略时,因为是新增的节点连接数最少会出现短时间连接大量涌入新节点的情况, 此时就会出现节点过载的情况(前面说了假设我们的节点需要预热才能处理大量连接),甚至出现打垮新节点的情况。

slow start 模式

对于这种类似需要预热的场景,需要负载均衡器支持类似 slow start 模式: slow start 模式下,节点的权重和最大连接数会从 1 开始随着时间线性增长,直至增长到配置的权重和最大连接数的值。 slow start 模式给予了节点一段时间的预热期,并且预热期间的连接数是线性缓慢增长的, 既达到了预热的效果又不会出现瞬间涌入大量连接打垮后端节点的情况,非常适合需要预热的情况。

那么,在什么情况下一个节点会自动进入 slow start 模式呢,一般在下面的情况会考虑自动进入 slow start 模式:

  • 新增节点。
  • 节点健康状态从不健康切换到健康。此时一般是后端节点之前在发布或重启,亦或是刚刚从故障中恢复。
  • 节点状态从 Down 状态切换为可以接受新连接的状态。这个状态切换可能是手动通过页面或API进行的操作,也可能是程序内部的状态自动切换。 原因一般跟上面的健康检查状态切分类似。

关于这个 slow start 模式有一点需要注意的是:在负载均衡器启动的时候一般不会触发 slow start 模式,虽然满足上面的新增节点的情况。因为如果在负载均衡器启动的时候就触发的话,会出现所有节点都进入 slow start 模式,可能会导致只能处理少量连接的情况,无法实际需求。如果确实需要启动时就进入 slow start 模式的话需要考虑一下这种情况会导致的容量问题。

根据响应/负载情况自动调整

还有一种方式是根据后端负载或响应情况来自动调整, 比如后端连续多次返回的响应码是 5xx 或者响应时间持续一段时间变慢 或后端服务负载(os 负载或业务负载)快要接近危险阈值等, 此时可以根据需要降低一下该节点的权重和最大连接数限制 (注意要在适当的时机把权重恢复回来,比如一段时间不再返回 5xx 或后端负载恢复到正常水平 则逐步恢复到原来的权重值)或者把节点切换为不接受新请求的状态,一段时间后进入 slow start 模式慢慢恢复正常。

总结

本文简单介绍了一下负载均衡器中动态权重相关的内容,欢迎大家补充其他知识。


Comments