负载均衡

负载均衡是任何可扩展软件系统的重要组成部分。通过在一组端点上智能分配流量-即便该集合动态更改,并且随着端点故障或减慢-良好的负载均衡可以减少尾部延迟并增加可靠性。linkerd 提供了各种强大的负载均衡算法,包括最小负载,EWMA和孔径(aperture)。这些算法已经在 Twitter 和其他公司进行了大量测试。

因为它在 RPC 层上运行,所以 linkerd 可以根据观察到的 RPC 延迟和队列大小来平衡负载,而不是启发式如 LRU 或 TCP 活动。这意味着它可以优化流量并减少整个应用程序的尾部延迟。因为 linkerd 构建在 Finagle 之上,所以它可以利用各种负载均衡算法,目标是最大化成功处理的请求数量,同时最小化延迟。

以下描述了 linkerd 中可用的负载均衡算法。Finagle 的 负载均衡 文档中也将对它们进行更详细的介绍。

负载均衡器选项

为您的设置选择正确的负载均衡器至少部分取决于您的应用程序拓扑。linkerd 为大多数安装提供了一个合理的默认值,并允许您在需要时更换到其他均衡器。

Power of Two Choices (P2C): 最小负载

这是 linkerd 的默认负载均衡器,非常简单。当确定发送请求的位置时,linkerd 随机从负载均衡器池中选择两个副本,并选择两者中最少负载的副本。负载由每个副本的未完成请求数决定。该算法为单个副本提供了可管理的负载上限,与具有相似性能的其他算法相比,开销较少。

Power of Two Choices:峰值EWMA

此负载均衡器是 P2C:最小负载 策略的变体,因为它在发送请求时仍然在两个副本之间进行选择。为了做出这个决定,它保持观察到的延迟的动态平均值,并且使用它来对每个副本的未完成请求的数量进行加权。这种方法对延迟波动更敏感,并通过向较慢的后端发送更少的请求来允许他们恢复时间。延迟窗口是可配置的。

Aperture:孔径

孔径(Aperture)负载均衡器适用于向具有相对大量副本的后端发送相对较少量的流量的客户端。它限制将流量发送到完整副本集的某些子集的副本数,然后选择具有最少未完成请求数的副本。这种方法确保在低流量下更高的连接重用率。

Heap: 堆负载

这个负载均衡器使用最小堆来跟踪所有副本的未完成请求数。它将所有请求发送到堆中的顶端的副本,这是在请求时负载最少的,并将随时间而更改。这种方法的一个显著限制是堆是所有请求的共享资源,因此大流量时会导致争用问题。

Round Robin: 轮询

轮询负载均衡器假设所有副本处理性能均相同,不管服务器的当前连接数和响应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮询调度算法容易导致服务器间的负载不平衡。