redis的一致性hash和hash槽是什么

68次阅读
没有评论

共计 1926 个字符,预计需要花费 5 分钟才能阅读完成。

这篇文章主要讲解了“redis 的一致性 hash 和 hash 槽是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“redis 的一致性 hash 和 hash 槽是什么”吧!

假如我们现在有 x 台缓存设备,我们在决定把数据放到哪个缓存设备上的时候可以 key%x,但是如果发生扩容或者节点丢失你就需要 key%(x±y)这样就会遇到大量的数据迁移问题,一致性 hash 和 hash 槽就可以避免这种问题。

一致性 hash 原理

普通的 hash 是对服务器的数量取余,一致性 hash 是对特定的数字取余 (2^32) 不会因为服务器的数量变化,首先我们对服务器的 ip 或者其他唯一标识取余得到一个值这个值就是服务器在 hash 环上的位置,然后对要放入服务器的对象进行 hash 得到一个值,在 hash 换上找对应的服务器如果值所在的位置没有服务器就看下一个位置是否服务器知道找到可存储的服务器。

1、环形空间

按照常用的 hash 算法来将对应的 key 哈希到一个具有 2 的 32 次方个节点的空间中,即 0 ~ (2 的 32)- 1 的数字空间中。我们可以把这个东西想象成一个咬住尾巴的,形成了一个闭环。

2、服务器 hash 到环上

环有了我们现在需要把服务器放到环上,可以根据服务器的 IP 地址获取编号等唯一标识取 hash 后放到环上。

3、数据存储和获取

当我们需要把一个数据放到服务器上的时候我们首先需要计算数据的 hash 值然后取余,如果取余后的值在环上有对应的服务器那直接放进去如果没有则向后查找。

所以最后 data1 在 redis1 里面,data2 在 redis2 里面。当我们获取数据的时候也是执行相同的过程,计算 key 的 hash 值,然后根据相同的规则获取存储的服务器。

4、服务器的删除和添加

如果现在某个 redis 节点挂掉了,那么其他节点里面的数据是还在的,原来节点里面的数据会被重新分配到下一个节点里面。
如果在环境中新增一台服务器 RedisNeo,通过 hash 算法将 RedisNeo 映射到环中,通过按顺时针迁移的规则,那么以前 hash 值在 Redis2 和 RedisNeo 之间的数据迁移到 RedisNeo 里面(下图中 RedisNeo 挨着 Redis2),其它对象还保持这原有的存储位置。通过对节点的添加和删除的分析,一致性哈希算法在保持了单调性的同时,还是数据的迁移达到了最小,这样的算法对分布式集群来说是非常合适的,避免了大量数据迁移,减小了服务器的的压力。

所以 redisNeo 加入后 data3 就到 redisNeo 里面去了。

5、平衡性

到目前为止一致性 hash 也可以算做完成了,但是有一个问题还需要解决,那就是平衡性。从下图我们可以看出,当服务器节点比较少的时候,会出现一个问题,就是此时必然造成大量数据集中到一个节点上面,例如你只有两个节点一个在 1 另一个在 10,那么很显然 1 节点的压力是无限大的,因为只有 hash 值在 [2,10] 之间的才会到 10 节点,其他的全到 1 节点上去了,为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以先确定每个物理节点关联的虚拟节点数量,然后在 ip 或者主机名后面增加编号,同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射。

hash 槽

哈希槽是在 redis cluster 集群方案中采用的,redis cluster 集群没有采用一致性哈希方案,而是采用数据分片中的哈希槽来进行数据存储与读取的。redis cluster 采用数据分片的哈希槽来进行数据存储和数据的读取。redis cluster 一共有 2^14(16384)个槽,所有的 master 节点都会有一个槽区比如 0~1000,槽数是可以迁移的。master 节点的 slave 节点不分配槽,只拥有读权限。但是注意在代码中 redis cluster 执行读写操作的都是 master 节点,并不是你想 的读是从节点,写是主节点。第一次新建 redis cluster 时,16384 个槽是被 master 节点均匀分布的。

和一致性哈希相比在扩容和缩容的时候需要手动手动分配 hash 槽,并且在删除 master 节点的时候要把他的从节点和 hash 槽交给其他 master 节点;hash 槽的是根据 CRC-16(key)%16384 的值来判断属于哪个槽区。

感谢各位的阅读,以上就是“redis 的一致性 hash 和 hash 槽是什么”的内容了,经过本文的学习后,相信大家对 redis 的一致性 hash 和 hash 槽是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计1926字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)