当前位置: 首页 > news >正文

负载均衡算法

静态负载均衡

轮询

将请求按顺序轮流地分配到每个节点上,不关心每个节点实际的连接数和当前的系统负载。

优点:简单高效,易于水平扩展,每个节点满足字面意义上的均衡;

缺点:没有考虑机器的性能问题,根据木桶最短木板理论,集群性能瓶颈更多的会受性能差的服务器影响。

随机

将请求随机分配到各个节点。由概率统计理论得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配,也就是轮询的结果。

优缺点和轮询相似。

加权随机

与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。

加权轮询

不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

加权轮询算法要生成一个服务器序列,该序列中包含n个服务器。n是所有服务器的权重之和。在该序列中,每个服务器的出现的次数,等于其权重值。并且,生成的序列中,服务器的分布应该尽可能的均匀。比如序列{a, a, a, a, a, b, c}中,前五个请求都会分配给服务器a,这就是一种不均匀的分配方法,更好的序列应该是:{a, a, b, a, c, a, a}。

优点:可以将不同机器的性能问题纳入到考量范围,集群性能最优最大化;

缺点:生产环境复杂多变,服务器抗压能力也无法精确估算,静态算法导致无法实时动态调整节点权重,只能粗糙优化。

IP-Hash

源地址哈希的思想是根据客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器节点数进行取模,得到的结果便是要访问节点序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会落到到同一台服务器进行访问。

优点:相同的IP每次落在同一个节点,可以人为干预客户端请求方向,例如灰度发布;

缺点:如果某个节点出现故障,会导致这个节点上的客户端无法使用,无法保证高可用。当某一用户成为热点用户,那么会有巨大的流量涌向这个节点,导致冷热分布不均衡,无法有效利用起集群的性能。所以当热点事件出现时,一般会将源地址哈希法切换成轮询法。

一致性Hash

上面的几种静态负载均衡算法都存在一个缺点那就是水平扩充比较麻烦,比如有缓存存在的情况,如果增加了服务器,那么以前已经存在的缓存就不会命中了,比如IP-Hash算法实现的,所以就需要一致性Hash,这样可以保证缓存数据迁移的数据量不是很大

动态负载均衡

最小连接法

根据每个节点当前的连接情况,动态地选取其中当前积压连接数最少的一个节点处理当前请求,尽可能地提高后端服务的利用效率,将请求合理地分流到每一台服务器。俗称闲的人不能闲着,大家一起动起来。

优点:动态,根据节点状况实时变化;

缺点:提高了复杂度,每次连接断开需要进行计数;

实现:将连接数的倒数当权重值。

最快响应法

根据请求的响应时间,来动态调整每个节点的权重,将响应速度快的服务节点分配更多的请求,响应速度慢的服务节点分配更少的请求,俗称能者多劳,扶贫救弱。

优点:动态,实时变化,控制的粒度更细,跟灵敏;

缺点:复杂度更高,每次需要计算请求的响应速度;

实现:可以根据响应时间进行打分,计算权重。

观察模式法

观察者模式是综合了最小连接数和最快响应度,同时考量这两个指标数,进行一个权重的分配。

http://www.lryc.cn/news/27599.html

相关文章:

  • C语言数组二维数组
  • 7年测试工程师,裸辞掉17K的工作,想跳槽找更好的,还是太高估自己了....
  • 企业为什么需要做APP安全评估?
  • 重回利润增长,涪陵榨菜为何能跑赢周期?
  • 这6个高清图片素材库,马住,马住~
  • 绝对零基础的C语言科班作业(期末模拟考试)
  • 注解开发定义bean
  • 剑指 Offer 19. 正则表达式匹配
  • CSS——学成在线案例
  • 元数据的类型
  • LEAP模型的能源环境发展、碳排放建模预测及不确定性分析
  • C# Task详解
  • Blob分析+特征
  • 4EVERLAND 的 IPFS Pinning 服务:4EVER Pin
  • activiti整合springBoot其他操作
  • 深度探索C++预编译头机制
  • Leaflet基础入门教程(一)
  • 《强化学习导论》之6.5 Q-Learning
  • 5年软测,女朋友跑了俩,2年外包感觉自己废了一半,怎么办?
  • 【JavaWeb】HTML常用标签
  • python编程:查找某个文件夹下所有的文件,包括子文件加下的所有文件,读取指定类型的文件
  • 测试外包干了5年,感觉自己已经废了····
  • C++17 文件与目录操作 <filesystem>
  • Python 如何安装 MySQLdb ?
  • 总被程序员坑?你需要了解API接口
  • 信息系统基本知识(四)新技术
  • jeesite多环境配置
  • 项目中用到的知识点回顾---JWT(JSON Web Token)
  • string类常用函数
  • hexo静态网站部署到腾讯云cos