一致性哈希 哈希槽(哈希碰撞和哈希冲突)

背景随着memcache和redis的出现,更多人认识到了一致性哈希。一致性哈希用于解决分布式缓存系统中的数据选择节点存储问题和数据选择节点读取问题以及在增删节点后减少数据缓存的消失范畴,防止雪崩的发生。哈希槽是在rediscluster集群方案中采用的,rediscluster集群没有采用一致性哈希方案,而是采用数据分片中的哈希槽来进行数据存储与读取的。一致性哈希一致性hash是一个0-2^32的闭合圆,(拥有2^23个桶空间,每个桶里面可以存储很多数据,可以理解为s3的存储桶)所

大家好,又见面了,我是你们的朋友全栈君。

背景

随着memcache和redis的出现,更多人认识到了一致性哈希。

一致性哈希用于解决分布式缓存系统中数据选择节点存储问题数据选择节点读取问题以及在增删节点后减少数据缓存的消失范畴防止雪崩的发生

哈希槽是在redis cluster集群方案中采用的,redis cluster集群没有采用一致性哈希方案,而是采用数据分片中的哈希槽来进行数据存储与读取的。

一致性哈希

一致性hash是一个0-2^32的闭合圆,(拥有2^23个桶空间,每个桶里面可以存储很多数据,可以理解为s3的存储桶)所有节点存储的数据都是不一样的。计算一致性哈希是采用的是如下步骤:

  1. 对节点进行hash,通常使用其节点的ip或者是具有唯一标示的数据进行hash(ip),将其值分布在这个闭合圆上。
  2. 将存储的key进行hash(key),然后将其值要分布在这个闭合圆上。
  3. 从hash(key)在圆上映射的位置开始顺时针方向找到的一个节点即为存储key的节点。如果到圆上的0处都未找到节点,那么0位置后的顺时针方向的第一个节点就是key的存储节点。

添加节点带来的影响
图1为一致性hash的分布情况,箭头指向key的分布情况。

一致性哈希 哈希槽(哈希碰撞和哈希冲突)

如果现在node2和node4节点中间增加一个node5节点,那么在node4和node2之间的这些数据要存储的节点就会有所变化。在图中的黄色区域的数据将会从原来的node4节点挪到node5节点。

一致性哈希 哈希槽(哈希碰撞和哈希冲突)

删除节点带来的影响
以图1为基准,删除了node2节点后,原本在node2节点上的数据就会被重新定位node4上。这样就产生一个影响:原来node2的数据转移到node4上,这样node4的内存使用率会骤增,如果node2上存在热点数据,node4会扛不住甚至会可能挂掉,挂掉之后数据又转移给node3,如此循环会造成所有节点崩溃,也就是前面所说的雪崩的情况。

一致性哈希 哈希槽(哈希碰撞和哈希冲突)

节点太少造成的影响
节点太少的话可能造成数据倾斜的情况,如图中中只有俩节点,可能会造成大量数据存放在node A节点上,而node B节点存储很少的数据。

一致性哈希 哈希槽(哈希碰撞和哈希冲突)

虚拟节点
为了解决雪崩现象和数据倾斜现象,提出了虚拟节点这个概念。就是将真实节点计算多个哈希形成多个虚拟节点并放置到哈希环上,定位算法不变,只是多了一步虚拟节点到真实节点映射的过程

以雪崩现象来说明:如下图节点real1节点又俩个虚拟节点v100和v101,real2有俩个虚拟节点v200和v201,real3节点有v300和v301俩个虚拟节点。

一致性哈希 哈希槽(哈希碰撞和哈希冲突)

当real1节点挂掉后,v100和v101节点也会随即消失,这时k1数据就会被分配到v301上,k4就会被分配到了v200上,这就解决了雪崩的问题,当某个节点宕机后,其数据并没有全部分配给某一个节点,而是被分到了多个节点。

一致性哈希 哈希槽(哈希碰撞和哈希冲突)

正因为加入了虚拟节点机制,数据倾斜的问题也随之解决

注意:真实节点不放置到哈希环上,只有虚拟节点才会放上去。

为什么要使用闭合的哈希环
举个例子,如果在2^23-3处有一个key,而2^23-3~2^23处并没有节点,那么这个key该存在哪里节点呢?说到这里你应该明白来吧

 

哈希槽

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

一致性哈希 哈希槽(哈希碰撞和哈希冲突)

和一致性哈希相比

  1. 它并不是闭合的,key的定位规则是根据CRC-16(key)%16384的值来判断属于哪个槽区,从而判断该key属于哪个节点,而一致性哈希是根据hash(key)的值来顺时针找第一个hash(ip)的节点,从而确定key存储在哪个节点。
  2. 一致性哈希是创建虚拟节点来实现节点宕机后的数据转移并保证数据的安全性和集群的可用性的。redis cluster是采用master节点有多个slave节点机制来保证数据的完整性的,master节点写入数据,slave节点同步数据。当master节点挂机后,slave节点会通过选举机制选举出一个节点变成master节点,实现高可用。但是这里有一点需要考虑,如果master节点存在热点缓存,某一个时刻某个key的访问急剧增高,这时该mater节点可能操劳过度而死,随后从节点选举为主节点后,同样宕机,依次类推,造成缓存雪崩。解决这个问题请看我的另一篇文章如何应对热点缓存问题

新建master节点
使用redis-trib.rb工具来创建master节点

 

./redis-trib.rb add-node 172.60.0.7:6379 172.60.0.5:6379

注释:

 

192.168.10.219:6378是新增的节点

192.168.10.219:6379集群任一个旧节点

注意:新建的master节点是没有槽区的,需要给master节点分配槽,不然缓存无法命中。分配槽的方法自行百度。
删除master节点
1.如果主节点有从节点,需要将从节点转移到别的主节点上。
2.转移后 如果主节点有哈希槽,去调哈希槽,然后在删除master节点
注意:redis cluster的动态扩容和缩容并不会影响集群的使用。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129673.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 学习 Spring Boot 知识看这一篇就够了

    学习 Spring Boot 知识看这一篇就够了从2016年因为工作原因开始研究SpringBoot,先后写了很多关于SpringBoot的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分是在技术社区做的系列课程。我在写文章的时候将文章中的示例提取出来,作为开源代码分享了出来让大家以更方便的方式去学习(https://github.com/ityouknow/spri…

    2022年7月15日
    20
  • 容器技术详解_容器化技术

    容器技术详解_容器化技术一、什么是容器?IT里的容器技术是英文单词LinuxContainer的直译。container这个单词有集装箱、容器的含义(主要偏集装箱意思)。不过,在中文环境下,咱们要交流要传授,如果翻译成“集装箱技术”就有点拗口,所以结合中国人的吐字习惯和文化背景,更喜欢用容器这个词。不过,如果要形象的理解LinuxContainer技术的话,还是得念成集装箱会比较好。我们知道,海边码头里的集装箱…

    2025年7月10日
    4
  • sublime text2 安装及使用教程

    sublime text2 安装及使用教程1.下载安装包地址:https://www.sublimetext.com/22.安装,一直点下一步就好,将下列选项打钩,这样文件右键就可以直接用sublimetext2打开3.新建一个html

    2022年7月1日
    17
  • pycham 2021激活码_通用破解码

    pycham 2021激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    135
  • pycharm激活码2021【永久激活】

    (pycharm激活码2021)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月22日
    153
  • python深度学习库系列教程——python调用opencv库教程

    python深度学习库系列教程——python调用opencv库教程全栈工程师开发手册(作者:栾鹏)python教程全解OpenCV安装pipinstall–upgradesetuptoolspipinstallnumpyMatplotlibpipinstallopencv-pythonOpenCV的结构和Python一样,当前的OpenCV也有两个大版本,OpenCV2和OpenCV3。相比OpenCV2,OpenCV3提供了

    2022年9月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号