本文目录
关于dubbo负载均衡算法如何选择
在生产环境我推荐加权轮选或加权随机,强烈反对使用一致性hash算法,理由如下。
在Dubbo中主要提供了如下几种负载均衡算法:
1、random 加权随机
2、roundrobin 加权轮询
3、leastactive 最小连接数
4、consistenthash 一致性Hash算法
加权随机与加权轮询都引入了权重的概率,主要是考虑到集群中各个机器的配置不一样,导致其提供服务的能力不一致,故可以将配置低的机器其权重调低,实现流量更加合理的分配。
最小连接数负载均衡主打的特色是可以根据运行时当前的调用情况选择进行流量分配,即优先将流量分发到当前负载低的节点,这个算法看似高大上,个人觉得其使用场景不是特别多,并且需要实时采集这些信息,其实现也较为复杂,实际生产中无特殊情况,不建议使用。
个人是强烈反对使用一致性Hash算法来用做Dubbo的服务负载均衡算法,因为Dubbo服务是无状态的,不存在缓存命中率这一说法。而一致性Hash算法最大的使用场景是放在分布式缓存。
例如一个分布式Redis集群,原先有4个节点,如果按照轮询来进行负载均衡,有4个key
key1 -》node1
key2 -》node2
key3 -》node3
key4 -》node4
那例如节点node1发生宕机,那根据原先存储的key再用轮询的策略,会发生如下对应情况:
key1 -》node2
key2 -》node3
key3 -》node4
key4 -》node2
即这个时候,用key2去集群中查询数据,因为key2的数据存储在node2中,但由于节点发生变化,导致会路由到node3上,导致缓存失效。
这就是缓存命中率的问题。
但一致性hash算法,只会影响故障节点相邻的数据,其他数据还是能命中,这样缓存才有意义。
最后我推荐 roundrobin 或 random,通常建议考虑 roundrobin,因为它不具随机性,跟踪问题方便,两者实现复杂程度不大,故都可以。
什么是负载均衡,为何要做负载均衡
一、什么是负载均衡
当单个节点的服务,无法支持当前的大量请求时,我们会部署多个节点,即所谓的集群,此时要使每个节点收到的请求均匀的算法,这个策略就是所谓的负载均衡了。
负载均衡
常见的负载均衡算法,有权重随机、Hash、轮询。
1.权重随机
这个是最简单,也是最常用的负载均衡算法,即每个请求过来,会随机到任何一个服务节点上,主流的rpc框架Dubbo,默认使用基于权重随机算法。
2.Hash
可以将客服端即请求端的ip,通过hash计算,得到一个数值,再取服务节点数的模,分配到对应的服务节点上。
3.轮询
将请求按照顺序,依次分配到节点1、节点2、节点3等节点上,如此循环往复。
二、为什么要做负载均衡
想想如果没有负载均衡算法,我们的请求有可能都打到同一节点上,有可能将这个节点给打死,而其他节点的机器闲置着没有提供服务,浪费资源。所以这就是负载均衡算法存在的意义了,可以将请求合理分发到各个节点,实现真正意义上多个节点提供服务的效果。