当前位置:首页 > 服务端 > Dubbo一致性哈希负载均衡算法

Dubbo一致性哈希负载均衡算法

2022年09月16日 21:38:20服务端6

第一节:哈希算法

本小节主要是为了介绍一致性哈希算法做铺垫。简单的介绍了哈希算法解决了什么问题,带来了什么问题。

第二节:一致性哈希算法

本小节主要是通过作图对一致性哈希进行了简单的介绍。介绍了一致性哈希是怎么解决哈希算法带来的问题,怎么解决数据倾斜的问题。

第三节:一致性哈希算法在Dubbo中的应用

本小节是全文重点,通过一个"骚"操作,对Dubbo一致性哈希算法的源码进行了十分详细的剖析。从整个类到类里面的每个方法进行了详尽的分析,打印了大量的日志,配合图片,方便读者理解。

第四节:我又发现了一个Bug

本小节主要是介绍我在研究Dubbo一致性哈希负载均衡时遇到的一个问题,深入研究之后发现可能是一个Bug。这一小节就是比较详尽的介绍了这个Bug现象、原因以及我的解决方案。

第五节:加入节点,画图分析

本小节对具体的案例进行了分析,并配以图片,相信能帮助读者更加深刻的理解一致性哈希算法在Dubbo中的应用。

第六节:一致性哈希的应用场景

本小节主要介绍几个应用场景。使用Duboo框架,在什么样的需求可以使用一致性哈希算法做负载均衡。

PS:前一、二节主要是进行了背景知识的简单铺垫,如果你了解相关背景知识,可以直接从第三节看起。本文的重点是第三到第五节。如果你只想知道Bug是什么,可以直接阅读第四节。

另:阅读本文需要对Dubbo有一定的了解。文章很长,建议收藏慢慢阅读。一定会有收获的。

哈希算法

在介绍一致性哈希算法之前,我们看看哈希算法,以及它解决了什么问题,带来了什么问题。

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

如上图所示,假设0,1,2号服务器都存储的有用户信息,那么当我们需要获取某用户信息时,因为我们不知道该用户信息存放在哪一台服务器中,所以需要分别查询0,1,2号服务器。这样获取数据的效率是极低的。

对于这样的场景,我们可以引入哈希算法。

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

还是上面的场景,但前提是每一台服务器存放用户信息时是根据某一种哈希算法存放的。所以取用户信息的时候,也按照同样的哈希算法取即可。

假设我们要查询用户号为100的用户信息,经过某个哈希算法,比如这里的userId mod n,即100 mod 3结果为1。所以用户号100的这个请求最终会被1号服务器接收并处理。

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

为了说明问题,我们加入一台服务器3。服务器的数量n就从3变成了4。还是查询用户号为100的用户信息时,100 mod 4结果为0。这时,请求就被0号服务器接收了。

当服务器数量为3时,用户号为100的请求会被1号服务器处理。

当服务器数量为4时,用户号为100的请求会被0号服务器处理。

所以,当服务器数量增加或者减少时,一定会涉及到大量数据迁移的问题。可谓是牵一发而动全身。

对于上述哈希算法其优点是简单易用,大多数分库分表规则就采取的这种方式。一般是提前根据数据量,预先估算好分区数。

其缺点是由于扩容或收缩节点导致节点数量变化时,节点的映射关系需要重新计算,会导致数据进行迁移。所以扩容时通常采用翻倍扩容,避免数据映射全部被打乱,导致全量迁移的情况,这样只会发生50%的数据迁移。

假设这是一个缓存服务,数据的迁移会导致在迁移的时间段内,有缓存是失效的。缓存失效,可怕啊。还记得我之前的文章吗,《当周杰伦把QQ音乐干翻的时候,作为程序猿我看到了什么?》就是讲缓存击穿、缓存穿透、缓存雪崩的场景和对应的解决方案。

一致性哈希算法

为了解决哈希算法带来的数据迁移问题,一致性哈希算法应运而生。

对于一致性哈希算法,官方说法如下:

一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题。

什么意思呢?我用大白话加画图的方式给你简单的介绍一下。

一致性哈希,你可以想象成一个哈希环,它由0到2^32-1个点组成。A,B,C分别是三台服务器,每一台的IP加端口经过哈希计算后的值,在哈希环上对应如下:

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

当请求到来时,对请求中的某些参数进行哈希计算后,也会得出一个哈希值,此值在哈希环上也会有对应的位置,这个请求会沿着顺时针的方向,寻找最近的服务器来处理它,如下图所示:

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

一致性哈希就是这么个东西。那它是怎么解决服务器的扩容或收缩导致大量的数据迁移的呢?

看一下当我们使用一致性哈希算法时,加入服务器会发什么事情。

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

当我们加入一个D服务器后,假设其IP加端口,经过哈希计算后落在了哈希环上图中所示的位置。

这时影响的范围只有图中标注了五角星的区间。这个区间的请求从原来的由C服务器处理变成了由D服务器请求。而D到C,C到A,A到B这个区间的请求没有影响,加入D节点后,A、B服务器是无感知的。

所以,在一致性哈希算法中,如果增加一台服务器,则受影响的区间仅仅是新服务器(D)在哈希环空间中,逆时针方向遇到的第一台服务器(B)之间的区间,其它区间(D到C,C到A,A到B)不会受到影响。

在加入了D服务器的情况下,我们再假设一段时间后,C服务器宕机了:

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

当C服务器宕机后,影响的范围也是图中标注了五角星的区间。C节点宕机后,B、D服务器是无感知的。

所以,在一致性哈希算法中,如果宕机一台服务器,则受影响的区间仅仅是宕机服务器©在哈希环空间中,逆时针方向遇到的第一台服务器(D)之间的区间,其它区间(C到A,A到B,B到D)不会受到影响。

综上所述,在一致性哈希算法中,不管是增加节点,还是宕机节点,受影响的区间仅仅是增加或者宕机服务器在哈希环空间中,逆时针方向遇到的第一台服务器之间的区间,其它区间不会受到影响。

是不是很完美?

一致性哈希算法带来了什么问题?

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

当节点很少的时候可能会出现这样的分布情况,A服务会承担大部分请求。这种情况就叫做数据倾斜。

怎么解决数据倾斜呢?加入虚拟节点。

怎么去理解这个虚拟节点呢?

首先一个服务器根据需要可以有多个虚拟节点。假设一台服务器有n个虚拟节点。那么哈希计算时,可以使用IP+端口+编号的形式进行哈希值计算。其中的编号就是0到n的数字。由于IP+端口是一样的,所以这n个节点都是指向的同一台机器。

如下图所示:

Dubbo一致性哈希负载均衡算法 _ JavaClub全栈架构师技术笔记

在没有加入虚拟节点之前,A服务器承担了绝大多数的请求。但是假设每个服务器有一个虚拟节点(A-1,B-1,C-1),经过哈希计算后落在了如上图所示的位置。那么A服务器的承担的请求就在一定程度上(图中标注了五角星的部分)分摊给了B-1、C-1虚拟节点,实际上就是分摊给了B、C服务器。

一致性哈希算法中,加入虚拟节点,可以解决数据倾斜问题。

当你在面试的过程中,如果听到了类似于数据倾斜的字眼。那大概率是在问你一致性哈希算法和虚拟节点。

在介绍了相关背景后,我们可以去看看一致性哈希算法在Dubbo中的应用了。

作者:午夜.幽魂.男
来源链接:https://blog.csdn.net/qq_43183527/article/details/120341674

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/42323.html

标签: Dubbo
分享给朋友:

“Dubbo一致性哈希负载均衡算法” 的相关文章

SpringBoot整合Dubbo与zookeeper纯注解版

SpringBoot整合Dubbo与zookeeper纯注解版

一、Dubbo和zk的作用 上回讲到,Dubbo作为一款优秀的RPC框架,封装了dubbo-provider(提供者)和dubbo-consumer(消费者),而provider和consumer之间需要通过注册中心来作为可发现的服务目录。而zookeeper(此处简称zk)提供了服务接口注...

dubbo 2.5.4-SNAPSHOT dubbo-admin 报错

问题描述:RROR context.ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean wi...

springboot整合最新版dubbo以及dubbo-admin的安装

springboot整合最新版dubbo以及dubbo-admin的安装

一、安装前准备   由于dubbo被阿里捐献给了apache,这次安装admin时,参考网上的资料,地址还是停留在之前的链接,踩了不少坑,这里记录下。   dubbo-admin下载地址:   地址一:https://github.com/apache/incubat...

【SpringBoot】最通俗易懂的分布式学习(一)SpringBoot整合dubbo、zookeeper

【SpringBoot】最通俗易懂的分布式学习(一)SpringBoot整合dubbo、zookeeper

注:本文章基于尚硅谷Springboot高级特性相关视频及资料进行编写,代码简单,较容易理解,若有问题或者源码资料获取可以在评论区留言或者联系作者! 文章目录 导引 一、doke...

Java高级面试必问—Dubbo面试题汇总

1、默认使用的是什么通信框架,还有别的选择吗?2、服务调用是阻塞的吗?3、一般使用什么注册中心?还有别的选择吗?4、默认使用什么序列化框架,你知道的还有哪些?5、服务提供者能实现失效踢出是什么原理?6、服务上线怎么不影响旧版本?7、如何解决服务调用链过长的问题?8、说说核心的配置...

SpringMVC、Zookeeper、Dubbo使用

SpringMVC、Zookeeper、Dubbo使用

互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的。现在核心业务抽取出来,作为独立的服务,使前端应用能更快速和稳定的响应。 第一:介绍Dubbo背景 ...

Spring Boot Dubbo applications.properties 配置清单

Spring Boot Dubbo applications.properties 配置清单

摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 与其纠结,不如行动学习。Innovate ,And out execute ! 』 本文提纲 一、前言 二、applications.properti...

搭建SpringBoot+dubbo+zookeeper+maven框架(一)

搭建SpringBoot+dubbo+zookeeper+maven框架(一)

这几天项目还没来,所以就自己试着参考网上的一些资料,搭建了一个SpringBoot+dubbo+zookeeper+maven框架,网上参考的很多资料照着他们一步一步搭建,最后很多都运行不通,很是郁闷,最后自己在总结了他们之后自己搭建了一个,项目的源码我会附在文章的最后,并且后期还会继...

70道Dubbo面试题及答案(最新整理)

70道Dubbo面试题及答案(最新整理)

Dubbo面试题及答案【最新版】Dubbo面试题大全(2021版),发现网上很多Dubbo面试题及答案整理都没有答案,所以花了很长时间搜集,本套Dubbo面试题大全 如果不背 Dubbo面试题的答案,肯定面试会挂! 这套Dubbo面试题大全,希望对大家有帮助哈...

Dubbo整合Nacos

Dubbo整合Nacos

Dubbo项目将Nacos作为其注册中心和配置中心 Nacos提供了四个主要功能 服务发现和服务运行状况检查(服务治理):Nacos使服务易于注册自己并通过DNS或HTTP接口发现其他服务。Nacos还提供服务的实时运行状况检查,以防...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。