均衡负载-这篇文章是您了解负载均衡所需的全部内容

在对分布式系统的“高可用”有了初步了解后,我们也意识到“负载均衡”才是“高可用”的核心。 那么,在这篇文章中,我们将通过图文结合的方式来描述每一种负载均衡策略的完整外观。

1.什么是负载均衡

通过独立的统一入口汇聚流量,再做二次分发的过程就是“负载均衡”。 它的本质和“分布式系统”一样,都是“分而治之”。

如果你习惯在开车的时候使用一些导航软件,我们会发现导航软件推荐的路线规划会有一个上限,比如3条或者5条路线。

其实它也起到了类似“负载均衡”的作用,因为如果你只能走Top3畅通的路线,自然就不能把拥堵严重的路线推荐给你,让车流的压力分散到相对空闲的路线上.

在软件系统中也是如此。 为了避免流量分配不均和本地节点负载过大(如CPU不足等),引入了一个独立的统一入口来做类似上述“导航”的工作。 但是,软件系统中的“负载均衡”与导航的区别在于,导航是一种灵活的策略,最终需要用户做出选择,而前者则不同。

如何平衡的背后是策略在起作用,而策略的背后是由一定的算法或逻辑组成的。 例如导航中的算法属于“路径规划”的范畴,又细分为“静态路径规划”和“动态路径规划”,不同分支下有各种具体的计算算法。 如Dijikstra、A*等。

同样,在软件系统的负载均衡中,也有很多算法或逻辑支持这些策略。 巧合的是,也有静态和动态之分。

2. 常用负载均衡策略示意图

下面列出了日常工作中最常用的五种策略。

1.轮询

这是最常用也是最简单的策略,均匀分布,人人都有,一次一个人。 一般代码如下:

int 全局索引 = 0; //注意是全局变量,不是局部变量。

尝试

{

返回服务器[globalIndex];

}

最后

{

全局索引++;

如果(全局索引 == 3)

全局索引 = 0;

}

2.加权轮询

在轮询的基础上,增加了权重的概念。 重量是一个广义的概念,可以用任何方式表达。 它本质上是那些能做更多工作的人的想法。 例如,可以根据主机的性能差异配置不同的权重。 一般代码如下:

int matchedIndex = -1;

总计 = 0;

for (int i = 0; i

{

servers[i].cur_weight += servers[i].weight;//①每次循环自增(步=权重值)

total += servers[i].weight;//②将每个节点的权重值加到汇总值中

if (matchedIndex == -1 || servers[matchedIndex].cur_weight 要返回的当前节点的自增数,覆盖.

{

匹配指数=我;

}

}

servers[matchedIndex].cur_weight -= total;//4 选中的节点减去②的汇总值,以减少下次选中时的初始权重值。

返回服务器[matchedIndex];

这段代码的流程如下表所示。 “()”中的数字为自增数,即代码中的cur_weight。

值得注意的是,weighted round robin 本身有不同的实现方式,虽然最终的比例是 2:1:2。

但是,服务请求的顺序可能有所不同。 例如,与上述情况相比,“5-4、3、2-1”最终的比值相同,但效果不同。 “5-4、3、2-1”更容易出现并发问题,导致服务器拥塞,而且随着权数的增加均衡负载,这个问题会越来越严重。 例如,10:5:3 的结果是“18-17-16-15-14-13-12-11-10-9, 8-7-6-5-4, 3-2-1”。

3.最小连接数

这是一种根据实时负载情况执行动态负载平衡的方法。 维护活动连接数,然后返回最小的一个。 一般代码如下:

var matchedServer = 服务器。 orderBy(e => e.active_conns)。 第一的();

匹配的服务器。 active_conns += 1;

返回匹配服务器;

// 当连接关闭时,需要将active_conns减1。

4.最快的反应

这也是一种动态负载均衡策略。 其实质是根据各个节点对过去一段时间的响应情况进行分配。 响应越快,分配越多。 还有很多具体的操作方式。 上图中的可以理解为:记录最近一段时间请求时间的平均值,结合前面的“加权轮询”进行处理,所以相当于2:1:3的加权轮次罗宾。

题外话:一般来说,同一个机房​​的延迟基本没有区别,响应时间的区别主要在于服务的处理能力。

如果用在一些跨区域的请求处理中(例如:浙江->上海均衡负载,或者浙江->北京),大部分情况下会使用常规的“ping”方式获取时延,因为是OSI L3转发,数据更干净,更准确。

5.哈希法

Hash方式的负载均衡与以往不同的是,它的结果是由客户端决定的。 客户端带来的某个标识符通过标准化的哈希函数进行分散和分发。

上图中的哈希函数使用了最简单粗暴的“取余法”。

题外话:散列函数除了取余外,还有“变基”、“折叠”、“平方法”等其他功能,这里不再展开。 感兴趣的小伙伴可以自行查阅资料。

另外,待取余的参数可以是任意的,只要最终转化为整数参与运算即可。 最常用的应该是使用源IP地址作为参数,这样可以保证同一个客户端请求尽可能落在同一个服务器上。

3、常用负载均衡策略的优缺点及适用场景

我们知道没有什么是完美的,负载均衡策略也是如此。 以上列出的最常用的策略也各有优缺点和适用场景。 我稍整理了一下,如下:

这些负载均衡算法之所以被普遍使用,是因为它们的简单性。 如果你想要更好的结果,你将不可避免地需要更高的复杂性。 例如,可以组合使用简单的策略,或者通过更多维度的数据采样进行综合评价,甚至可以根据数据挖掘后的预测算法进行综合评价。

4.使用健康检测保证高可用

无论哪种策略,都难免会遇到机器故障或程序故障。 因此,要保证负载均衡能够更好地工作,就需要结合一些“健康检测”机制。 定时检测服务器是否还能连接,响应是否比预期慢。

如果该节点处于“不可用”状态,则需要将该节点暂时从列表中移除,以提高可用性。 常用的“健康检测”方法有以下三种。

限 时 特 惠: 本每日持续更新海量各大内部创业教程,一年会员只需98元,全资源免费下载 
优惠码(不再需要): xnbaoku

声明:本站内容转载于网络,版权归原作者所有,仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任,若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!

大鱼项目网 » 均衡负载-这篇文章是您了解负载均衡所需的全部内容