Redis的一致性哈希算法
一.节点取余
根据redis的键或者ID,再根据节点数量进行取余。
key:value如下
name:1 zhangsna:18:北京
对name:1 进行hash操作,得出来得值是2423423452,用这个值除3,余1则放到1号节点中进行存储,余2则放到2号节点存储。
二.一致性hash
一致性哈希分区(Distributed Hash Table) 实现思路是为系统中每个节
点分配一个token, 范围一般在0~232, 这些token构成一个哈希环。 数据读写
执行节点查找操作时, 先根据key计算hash值, 然后顺时针找到第一个大于
等于该哈希值的token节点, 如图10-3所示

这种方式相比节点取余最大的好处在于加入和删除节点只影响哈希环中
相邻的节点, 对其他节点无影响。 但一致性哈希分区存在几个问题:
·加减节点会造成哈希环中部分数据无法命中, 需要手动处理或者忽略
这部分数据, 因此一致性哈希常用于缓存场景。
当使用少量节点时, 节点变化将大范围影响哈希环中数据映射, 因此
这种方式不适合少量数据节点的分布式方案。
·普通的一致性哈希分区在增减节点时需要增加一倍或减去一半节点才
能保证数据和负载的均衡。
传统的取模方式
例如10条数据 0 1 2 3 4 5 6 7 8 9
3个节点node a b c
如果按照取模的方式,那就是
node a: 0,3,6,9
node b: 1,4,7
node c: 2,5,8
当增加一个节点的时候,数据分布就变更为
node a:0,4,8
node b:1,5,9
node c: 2,6
node d: 3,7
总结:数据3,4,5,6,7,8,9在增加节点的时候,都需要做搬迁,成本太高
而搬迁就是从节点a的机器上把数据移动到节点d上
一致性哈希方式
最关键的区别就是,对节点和数据,都做一次哈希运算,然后比较节点和数据的哈希值,数据取和节点最相近的节点做为存放节点。这样就保证当节点增加或者减少的时候,影响的数据最少。
十条数据,算出各自的哈希值,(这里就不变了,实际上要经过一系列计算)
0 : 0
1 : 1
2 : 2
3 : 3
4 : 4
5 : 5
6 : 6
7 : 7
8 : 8
9 : 9
有三个节点,算出各自的哈希值
node a: 3
node b: 5
node c: 7
这个时候比较两者的哈希值,5等于b,则归属b,4小于b,归属b,3等于a,则归属a,最后所有大于c的,归属于c(这里只是模拟)
相当于整个哈希值就是一个环,对应的映射结果:
node a: 0,1,2,3
node b: 4,5
node c: 6,7,8,9
这个时候加入node d, 就可以算出node d的哈希值:
node d: 9
这个时候对应的数据就会做迁移:
node a: 0,1,2,3
node b: 4,5
node c: 6,7
node d: 8,9
只有最后8,9这2条数据被存储到新的节点,其他不变
三.虚拟槽分区
虚拟槽分区巧妙地使用了哈希空间, 使用分散度良好的哈希函数把所有
数据映射到一个固定范围的整数集合中, 整数定义为槽(slot) 。 这个范围
一般远远大于节点数, 比如Redis Cluster槽范围是0~16383。 槽是集群内数据
管理和迁移的基本单位。 采用大范围槽的主要目的是为了方便数据拆分和集
群扩展。 每个节点会负责一定数量的槽, 如图10-4所示。
当前集群有5个节点, 每个节点平均大约负责3276个槽。 由于采用高质
量的哈希算法, 每个槽所映射的数据通常比较均匀, 将数据平均划分到5个
节点进行数据分区。 Redis Cluster就是采用虚拟槽分区, 下面就介绍Redis数
据分区方法。
redis将每个数据放到一个槽中,而很多槽放到节点中。当槽进行扩容,只需要把某些槽迁移到新节点即可。
Redis的一致性哈希算法的更多相关文章
- _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决
笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...
- (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...
- 一致性哈希算法(consistent hashing)PHP实现
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...
- 一致性哈希算法与Java实现
原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...
- 五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...
- 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- 一致性哈希算法以及其PHP实现
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...
- Java_一致性哈希算法与Java实现
摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...
- 一致性哈希算法(consistent hashing)【转】
一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...
随机推荐
- python实现对象测量
目录: 问题,轮廓找到了,如何去计算对象的弧长与面积(闭合),多边形拟合,几何矩的计算等 (一)对象的弧长与面积 (二)多边形拟合 (三)几何矩的计算 (四)获取图像的外接矩形boundingRect ...
- 微信和QQ这么多群,该如何管理好友关系?
本文节选自<设计模式就该这样学> 1 中介者模式的应用场景 在现实生活中,中介者的存在是不可缺少的,如果没有了中介者,我们就不能与远方的朋友进行交流.各个同事对象将会相互进行引用,如果每个 ...
- SpringCloud微服务实战——搭建企业级开发框架(二十五):实现多租户多平台短信通知服务
目前系统集成短信似乎是必不可少的部分,由于各种云平台都提供了不同的短信通道,这里我们增加多租户多通道的短信验证码,并增加配置项,使系统可以支持多家云平台提供的短信服务.这里以阿里云和腾讯云为例,集成短 ...
- 快速沃尔什变换&快速莫比乌斯变换小记
u1s1 距离省选只剩 5 days 了,现在学新算法真的合适吗(( 位运算卷积 众所周知,对于最普通的卷积 \(c_i=\sum\limits_{j+k=i}a_jb_k\),\(a_jb_k\) ...
- 洛谷 P7078 - [CSP-S2020] 贪吃蛇(贪心)
题面传送门 题意: 有 \(n\) 条蛇,每条蛇有个实力 \(a_i\) 我们称编号为 \(x\) 的蛇比编号为 \(y\) 的蛇强,当且仅当 \(a_x>a_y\) 或 \(a_x=a_y\) ...
- BZOJ 3926 诸神眷顾的幻想乡
BZOJ 3926 诸神眷顾的幻想乡 开始看错题看成了每个点度数不超过20 后来翻了翻题解原来看错题的不止我一个 既然叶子数量不超过20,考虑树上的任何一条路径,以任何点为根时,如果它不是一条从上到下 ...
- Atcoder Grand Contest 003 F - Fraction of Fractal(矩阵乘法)
Atcoder 题面传送门 & 洛谷题面传送门 Yet another AGC F,然鹅这次就没能自己想出来了-- 首先需注意到题目中有一个条件叫做"黑格子组成的连通块是四联通的&q ...
- PDO的好处
产生原因 普通的SQL执行语句,由于研发人员对前端请求参数过滤不严谨,导致SQL被注入,从而影响数据库,带来风险 使用PDO后形成的语句 SELECT * FROM test WHERE id in ...
- Python获取随机数
Python当中,可用random模块来获取随机数 import random """ random模块,用于获取随机数 """ print ...
- C/C++ Qt 数据库与TableView多组件联动
Qt 数据库组件与TableView组件实现联动,以下案例中实现了,当用户点击并选中TableView组件内的某一行时,我们通过该行中的name字段查询并将查询结果关联到ListView组件内,同时将 ...