分布式算法原理(转)
本文的内容如下:
- 传统分布式算法
- Consistent hashing一致性算法原理
- Hash倾斜性
- 虚拟节点
Redis可以使用一致性算法进行分布式存储。
1.传统分布式算法
举个栗子:
假设有一个图片 test.jpg,我们有 3 个服务器, 服务器1 ,服务器2 ,服务器3
4 个 redis 节点
- Redis0
- Redis1
- Redis2
- Redis3
20个数据
这上面 1-20 大家就可以认识是 对应数据 hash 之后的结果,然后对这些结果用 4 取模(因为这里有 4 个 Redis 节点).
1 % 4 = 1
所以将该数据放在 Redis1
2 % 4 = 2
所以将该数据放在 Redis2
3 % 4 = 3
所以将该数据放在 Redis3
4 % 4 = 0
所以将该数据放在 Redis0
同理,后面的其他数据应该这样放置,如下图
但是,突然我们发现Redis 的节点不够用了(需要增加节点),或者Redis负载非常低(需要删除节点)。
这里我们来增加一个节点 Redis4
,增加之后的数据再节点上的分部如下图:
你会发现,只有 redis0 命中了值 20,redis1命中了1,redis2 命中了2,redis3命中了3,命中率为 4/20 = 20%
2.一致性算法
Consistent hashing
我们来看一下环形 hash 空间
这个算法有一个环形hash空间的概念,通常hash算法都是将value映射在一个32位的key值当中,那么把数据首尾相接就会形成一个圆形,取值范围为0 ~ 2^32-1,这个圆环就是环形hash空间。如下图:
将对象映射到 圆形hash空间
- 我们hash 4个 对象 obj1-obj4
- 通过hash 函数计算出hash 值的key
落在 环形 hash 空间上的情况如图
将cache 映射到环形 hash空间
- 将对象和 cache 都映射到同一个hash 空间,并且使用相同的hash 算法,如下图:
现在我们就把数据对象和cache 都映射到 hash空间上了,接下来就是要考虑如何将这个对象映射到cache 上面,看下面的图,沿着环形顺时针走,从key1开始,可将obj1 映射到keyA上,obj2 映射到keyC ,obj3映射到keyC,obj4映射到keyB上,
下面来看看移除和添加cache 节点有什么变化
将cacheB移除,obj4就只能顺时针找到 cacheC了,所以移除一个cache节点,影响的是从该cache节点逆时针开始碰到第一个节点的范围对象,环状的其他区域数据节点都不会影响,如图:
在 obj2和obj3直接添加一个 cacheD ,如图,我们可以看到obj2 顺时针就会映射到cacheD上,同时受到影响的也是从添加的cache节点逆时针碰到第一个节点的范围
从上面我们可以看到,cache 的变动,对应数据对象的影响很小。
3. Hash倾斜性
但是呢,要知道理想和现实的差距,我们理想的环状空间是均匀分布的,如图:
现实却是这样的情况:
如果用上面的hash 算法,大量的数据对象会映射在 A 节点上,而BC节点很少,这样就导致A节点很忙,BC却很是清闲,这就是因为Hash 的倾斜性造成的。
4.虚拟节点
如何解决Hash 倾斜性导致的问题呢?这里引入了虚拟节点
比如有 obj1 和 obj 2 两个对象 对其进行 hash 计算,这里增加了 6 个虚拟节点,hash 之后分布落在了 V2,V5上,然后对虚拟节点进行 rehash ,这时 V1,V2映射在 N1上,V3,V4映射在N2上,V5,V6 映射在N3上,obj就映射在了 N1上,obj2映射在N3上。
引入了 虚拟节点,现在 环状空间是什么样子的呢?看下图
ABC分别都有对应的影子节点,这时候数据对象的映射就相对均匀了,但是要知道,虚拟节点也有是hash 倾斜性的,这就要在真实节点和虚拟节点之间做一个平衡,分配一个很好的比例,随着节点越来越多,数据越来越多,那么这个分布就会越来越均匀了,在删除节点和添加节点的时候也会把影响降到最小。
分布式算法原理(转)相关推荐
- Redis 分布式算法原理
Redis 分布式算法原理 传统分布式算法 Consistent hashing一致性算法原理 Hash倾斜性 虚拟节点 Consistent hashing命中率 举个栗子: 假设有一个图片 tes ...
- Redis分布式算法原理(重点)
1.传统分布式算法 redis进行扩容后: redis0只有20命中 redis1只有1命中 redis2只有2命中 redis3只有3命中 命中率为:4/20=20% 2.Consistent ha ...
- Redis - Redis分布式算法原理——Hash一致性理解 Hash倾斜性解决方案
最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,加班为大 ...
- 6月书讯(上)| 浅夏读新书,与世间万物一起成长
浅夏正是读书时~在骄阳.绿荫.清风里拿起一本好书,与世间万物一起成长~ 快来看看哪本书最属你心意.参与文末赠书活动,好书就要抢先读. - 新书速览 - 1.<Java核心技术 卷I:开发基础(原 ...
- 燕十八PHP高性能架构班教学视频教程
彻底拿下Linux集群+Nginx高并发+lvs负载均衡+MySQL优化+NoSQL! 2000W万条真实网站数据,拒绝纸上谈兵! Linux资深运维 + 燕十八老师亲自授课! Linux优化篇1.m ...
- FPGA数字信号、图像
1.基于FPGA的数字图像处理原理及应用 (牟新刚) 本书首先介绍FPGA程序设计和图像与视频处理的关键基础理论,然后通过实例代码详细讲解了如何利用FPGA实现直方图操作中的直方图统计/均衡化/线 ...
- 小白到架构师需要掌握的技能
从小白到架构师确实需要走很长的路,一是需要自己不断地掌握技能,一是必须有一个能够发挥自己的环境,实践是证明真理的唯一标准,的确如此,没有经历活生生的场景,不可能成为一个合格的架构师的.首先非常抱歉本片 ...
- memcached全面剖析–4. memcached的分布式算法
本次不再介绍memcached的内部结构, 开始介绍memcached的分布式. memcached的分布式 正如第1次中介绍的那样, memcached虽然称为"分布式"缓存服务 ...
- Memcached分布式算法详解--转
http://xiexiejiao.cn/java/memcached-consistent-hashing.html Memcached分布式算法在网上一搜可以找到一大片了,不过对于Memcache ...
最新文章
- php中序列化与反序列化
- 8.正交匹配跟踪 Orthogonal Matching Pursuit (OMP)s
- matlab c++ 画图【转载】
- Django中手动创建虚拟环境
- windows 远程 登录无操作30分钟后自动退出登录_Mac电脑如何远程Windows10
- Python并行判断多个大整数是否为素数
- PostgreSQL学习总结(1)—— PostgreSQL 入门简介与安装
- django框架搭建网页后台,运行后网页打不开的解决方法--windows系统下
- 电感5大特性参数,你知道几个?
- 乔布斯斯坦福大学演讲英文原文
- java 方法详解(有参无参,有返回值无返回值) 局部变量
- 数字IC后端实现40天速成篇(中)
- 7-13 愿天下有情人都是失散多年的兄妹 (25 分)
- 玩转Jetson AGX Orin官方套件
- html设置右缩进,word左右缩进怎么设置
- Capital One数据泄露影响1.06亿人,嫌疑人已被捕
- 2021-05-1java基础
- Android传感器之-方向传感器Orientation功能实现与源码
- 【渝粤教育】国家开放大学2019年春季 1192高层建筑施工 参考试题
- logstash截取指定字符和grok的使用