背景
在选择负载均衡算法时,我们希望满足以下要求:
- 具备分区和机房调度亲和性
-
每次选择的节点尽量是负载最低的
-
每次尽可能选择响应最快的节点
-
- 无需人工干预故障节点
-
当一个节点有故障时,负载均衡算法可以自动隔离该节点
-
当故障节点恢复时,能够自动恢复对该节点的流量分发
-
基于这些考虑,go-zero
选择了 p2c+EWMA
算法来实现。
算法的核心思想
p2c
p2c (Pick Of 2 Choices)
二选一: 在多个节点中随机选择两个节点。
go-zero
中的会随机的选择3次,如果其中一次选择的节点的健康条件满足要求,就中断选择,采用这两个节点。
EWMA
EWMA (Exponentially Weighted Moving-Average)
指数移动加权平均法: 是指各数值的加权系数随时间呈指数递减,越靠近当前时刻的数值加权系数就越大,体现了最近一段时间内的平均值。
-
公式:
EWMA公式
-
变量解释:
-
Vt
: 代表的是第t
次请求的EWMA值
-
Vt-1
: 代表的是第t-1
次请求的EWMA值
-
β
: 是一个常量
-
EWMA 算法的优势
-
相较于普通的计算平均值算法,
EWMA
不需要保存过去所有的数值,计算量显著减少,同时也减小了存储资源。 - 传统的计算平均值算法对网络耗时不敏感, 而
EWMA
可以通过请求频繁来调节β
,进而迅速监控到网络毛刺或更多的体现整体平均值。-
当请求较为频繁时, 说明节点网络负载升高了, 我们想监测到此时节点处理请求的耗时(侧面反映了节点的负载情况), 我们就相应的调小
β
。β
越小,EWMA值
就越接近本次耗时,进而迅速监测到网络毛刺; -
当请求较为不频繁时, 我们就相对的调大
β值
。这样计算出来的EWMA值
越接近平均值
-