00:00
好,同学们,我们继续哈希取算法的缺点,我们说过了,节点映射数据变动容易出错,那么一致性哈希算法,那么它的缺点我们也说过了,数据倾斜问题,那么所以说我们来到我们第三种算法哈希草粉区。哎,这个是大厂常用,几乎是标配了,哎也就说难听点,你去面试的时候哈,起码要给人家转一个哈西淘分区这么一个算法,哎代表你知道,哎这个叫什么,你的软件跟我们匹配认知是一致的,让你去进去干个活的话,人家跟你说个,你看一下那个塑料槽点上是多少什么的,你听都听不懂。那就麻烦了,所以说来兄弟们哈希槽分区走起。首先它为什么会出现啊,那么在这儿呢,我们遮挡一下啊。一致性哈希算法是它的上一个算法啊,它有数据倾斜的这个问题,那么同学们。我们呢,哈西槽,它实质上呢,就是一个宿主。速度是零到二的14方简介,形成一个哈希槽空间。
01:02
哎,你不刚说从32吗,怎么变14了,这什么意思啊,来吧。他能干些什么呢?它是来解决均匀分配的问题,在上面的一个痛点上面又加了一个补丁,完美解决,在数据和节点之间加了一层,把这层称为哈西草。用于管理数据和节点之间的关系,现在就相当于节点上放的是个槽,槽里面放的还是数据。是啥意思呢?有点像我们的代理模式啊。大家是不是干过这么一种东西,就是service层调一个DAO接口,然后呢,从你的数据增删改查,反正你数据一个接口,DAO接口,增删改查四大操作,无复落到增,落到删,落到改,落到查,后面可能有100条记录,1万条记录都是一个MYL,那么一样,他在数据和之间的分配上干了个槽,相当于找了个中介代理。
02:00
我这个草啊。它解决的是力度问题,你不用那么多机器都去找,你就找我这就行了,相当于把力度变大,方便数据移到,假设以前有八台我,我要找八台,现在我就找一个槽。好,那么哈希解决的映射啊,K值的映射,那么它。你们来计算你所对应要落在槽位,便于数据分配,那这是什么意思呢?那同学们请听我来解释。首先有多少个哈希槽?一个集群只能有16384个,编号是零到16383,所以说刚好是零到20次方减一。那杨哥你这个知识哪来的?听着我们这儿现在要派的是red集群部署在多卡容器上,那么red的集群默认就是16384个槽,这个不是我胡说的,由于今天我们主要是讲的是。Do卡。那么对于这个问题你感兴趣的同学,那么请来参加杨哥大厂学院的,我在这儿给你说过经典的东东。
03:05
这个不是我说的,是之父安迪雷斯的回答。为什么集群最大的槽数是16384个,那么弟兄们请看。这是别人的提问,OK?那么安迪雷斯的他爹原因如下。那么这两个。集群并没有使用一致性哈希,而是引入了哈希槽的概念,哎,再次强调啊,我们目前解决分布式存储都是用那么叫。落地,那么就是用哈希藏,因为集群最多是有16384个哈希藏。每个K通过CS16这种校验算法以后,对16384取模,那么也就是之前我们的上一种算法是二的32次方,而这个呢,是二的十四次方就可以了。那么集群的每一个节点负责一部分的哈希槽位,那么为什么它的槽位是16384呢?因为。CS16,它这个算法哈希值有16位的,它可以产生6553个时候,换句话说,它的值明明是可以分布在6553位的时候,那么作者他在做Mo的运算的时候,为什么不用这个65536,而直接选择16384呢?那么16384是不是二的十四次方?那么弟兄们这是为什么呢?
04:20
说明如下来,当时我们来解决看过red斯底层C加加的C语言的源码是这样的啊,安迪雷斯的回答是这样,主要是保证心跳方便和数据传输的达到最大化。那么他的这两个原因我给给大家做过详细的讲解,在大长班由于我们这是do塔,我这儿就给你说一个。他这这两个参数啊看。完了以后,他这要的是。的集群是不可能超过1000个的,听懂了吧?那么如果槽外是65536,那么发送心跳的时候消息跳达到会8K,这样的心跳包会过于庞大,所以说集群节点越多的时候,心跳包的消息体内携带的数据越多,超过1000个。
05:10
就会导致网络拥堵,所以作者安迪雷斯啊就举荐意见,集群节点数量超过不要超过。1000个,1000个以内的集群,16384个槽位就够用了,没有必要拓展到6535个,OK,那么这个呢,也就是我们的什么槽位和bit映射的一些相当的关系。在这我就呢只是给告诉大家一个简单的一个概述,这个是安迪雷斯支付所规定的,至于说这些源码的解读,大长班我们再见,那么现在我就不展开,怕弟兄们头晕,我们杀回来。你你就记这。我这个槽位一个集群干嘛,就是节点不超过1000个节点,听懂了吧,16384个槽位够了,只有它小,我们在数据传输的时候,这个头它才能够达到最佳的多少,不要达到8KB,哎,6KB左右就够了,所以说他这儿给你做了精确的计算,那么够到这儿了以后我们呢。
06:12
就明白这些槽会分配给集群中的所有主节点,你只需要就像一个代理层,你找我这个槽,我后面给你找代理,好比有点类似于什么,有点类似于我们的反向代理数据过来了,找到这个槽外,它呢,相当于我们的移动电话10086分配一个坐席,从进去给你提供服务,那么分配策略没有要求,可以指定给哪些编号的槽分配给哪个主节点。集群会记录节点和差位对应关系解决了。节点服务器节点节点和槽位的关系哈,那么接下来就需要对key求哈希值,然后说穿了。就是对16384。分母取余数,余数是几,这个K就通过这个槽落到对应的服务器上面。那么这个槽外。
07:03
就这么个公式,以槽为单位来移动数据,那么如因为槽的数目是固定的,你怎么变都无所谓,处理起来就比较容易,这样数据移动的迁移问题、数据倾斜问题就获得了解决。那么来同学们不要慌,继续给大家加强啊,那么这个哈希槽的计算是这样的。来red的集群内置了16384个哈西草,作者说了绝对够用了,那么现在会根据节点大致均等的将哈西草映射到不同的节点上面,这个是零到16386。我们的槽位分配就这么多,OK,那么16384是不是零到16383对吧?但需要在U的子群中放到一个KV,建对的时候,我们先对K使用CS16算法的一个结果,然后把这个结果对16384求值,那么这样每个K就会对应编号在这个落带落在这个之间,也就是映射到某个节点上,比如说兄弟们请看。
08:03
我将上面的数据就砍成了三段。假设啊。我们有三台机器,反正这个槽位就这么多。不会超过1000个节点。那么现在。16383除以三。分配。这三个砍成三段,如果是零到5460就放在第一个节点,如果说。第二个节点就放在这儿,如果说是10923~16383,根据槽位算出来以后,在这我就给我落到这个节点,OK,你后面就是扩容,再来三台,反正我们也是来分这个动道,后续我们会讲扩缩容,那么同学们请看根据我们Java代码啊,当然这个呢,它用的这个,呃。整合以后有这个类。Sort哈希点get sort,那么就是分配这个哈希的槽位,比方说我的K叫A,这个A通过这种算法算出来后是6373,那么过来看。
09:01
进到这,通过这一行这个算法K是a value假设时。V1,那么6373对应在这儿,这个KA将会不会存在这台机器10374。存在这台机器,那么如果是C,那么14503就存在这台机器,那么大家告诉我这样是不是就按照某种算法通过这个槽位该怎么存,该怎么取,一一对应,那么我们就固定了16384个好,那么这个就是我们哈希槽的计算,那么后续我们的三组三从的。Register。容器化的扩缩容配置案例,那么我们呢,也就在哈西槽的基础上来进行集群的扩容和缩容,以及相应的配置,那么同学们可以看一下,都给大家呢做了详细的说明啊,这个案例呢,还是呢,需要同学们呢花点心思啊。那么。所有的内容呢,都给大家画好了,那么假设啊哈希取,然后呢,一致性哈希,然后呢。
10:04
最后呢,我们还是草怎么过来的,砍成三段,那么接下来我们就要用实操理论实操小总结red集群三组三重刀卡red给大家进行配置和讲解,好,请同学们继续。
我来说两句