来源http://blog.csdn.net/cywosp/article/details/23397179

简单哈希方式

普通的hash使用的时候:

a. 创建哈希表需要先指定大小

b.当添加的元素达到了装载因子乘以表长时,需要扩容

但是在扩容时,代价很大,可能影响到所有元素的移动,为了减少扩容时元素的移动,总是将哈希表扩容成原来大小的两倍【数学证明,扩容成两倍大小,能够使得再哈希的元素个数最少】

一致性哈希

在分步式系统中,节点的宕机、某个节点加入或者移出集群是常事,对于分布式储存而言,假设存储集群有十台机器,采用hash方式对数据分片,哈希函数应该是这样:

Hash(file)%10。

这种情况下,扩容是非常不利的,如果要添加一台机器,很多已经存储到机器上的文件都需要重新分配移动,如果文件很大,这种移动就造成了网络的负载。一致性哈希由此提出,它修正了使用简单哈希算法的问题,使得分布式哈希可以在P2P环境中得到应用。

一致性哈希提出在动态变化的Cache中,判定算法好坏提出四个定义:

a.平衡性:哈希的结果能够尽可能的分布到所有缓冲中

b.单调性:哈希的结果能够保证原有已分配的内容映射到原有的或者新的缓冲中而非旧的缓冲集合

c.分散性:相同的内容被存储到不同的缓冲中

d.负载:一个特定的缓冲区被用户映射为不同的内容

本质上一致性Hash就是一个环形Hash空间:

a.将key哈希到一个具有2^32个桶的空间中,将这些数字头尾相连,形成一个闭合的环形将对象

b.通过特定的hash函数计算出key值,散列到hash环上:

c.将机器通过hash算法映射到环上-当有新的机器加入,通过使用与对象存储一样的hash算法将机器也映射到还中(机器的IP或者机器的别名),然后以顺时针的方向计算,将所有对象存储到离自己最近的机器中

对象与机器处于同一个哈希空间上,顺时针转动object1存储到了NODE1中,object3存储到了NODE2中,object2、object4存储到了NODE3中。这样的部署环境中,hash环是不会变更的,通过算出对象的hash值就能快速的定位到对应的机器中,从而找到对象真正的存储位置

d.普通的hash求余算法在机器添加或者删除之后会造成大量的对象存储位置失效,一致性哈希这样处理:

1.    节点的删除

如果node2失效,那么object3会迁移到node3上,其他对象没有改动

2.    节点添加增加一个新节点node4

通过顺时针迁移的规则,那么object2被迁移到node4中

e.一致性hash的缺点:

- 没有考虑到每台机器的异构性质,不能很好的实现负载均衡—比如说:机器a的配置很高而机器b很低,可能显示中大部分数据都hash到了(a,b)这段环上,直接导致了机器b的存储压力很大

- 一致性hash还存在热点问题—比如:由于机器b上存储了大量的数据,为了缓解机器b的压力,在环(a,b)段再添加一台机器E,就需要将机器b上的一部分数据拷贝到机器E上,而且只有一台机器,即机器b参与拷贝,这会引起机器b与机器E之间网络负载突然增大,机器b就是我们所说的热点

f.一致性哈希算法的平衡性分析

如上面的图,如果只部署了node1和node3,那么object1存储到node1,object2、3、4都存储到了node3中,这样就造成了不平衡的状态,在一致性哈希中引入虚拟节点来解决这个问题:虚拟节点是实际节点在hash空间的复制品,一个实际节点对应了若干虚拟节点(在hash空间时尚以hash值排列),如果只有node1和node3,以复制个数为2来看:

这样解决了平衡性问题,在实际操作中,对象从hash到虚拟节点到实际节点的转换如下

虚拟节点的hash计算可以采用对应节点的IP地址加数字后缀的方式

分布式哈希查询过程

当某台机器接收到查询请求时,先待查找的数据是否在本地,如果不在本地,则将查询请求转发到顺时针方向的写一个节点上,这种查询方式最坏情况下时间复杂度O(N),改进的方法:在每台机器上维护一些路由信息,即那些key存储在哪些节点上,机器1本地存储着 items为1的数据;机器2本地存储着 items为2的数据;机器6本地存储着 items为3,4,5,6的数据;机器0本地存储着items为7,0 的数据。

与此同时,机器1上,还存储着items为2,3,5 的数据所在的机器地址。比如,机器1知道,items为5的数据存储在机器6上面。比如,当机器1接收到 查询 items为7的数据在哪台机器上时,它发现 items=7 比它的路由表中的最大的items5还大,于是将查询请求转发到 items=5所对应的机器6上。机器6上的路由表指出:items=7的数据在机器0上,于是就找到了items=7的数据 在机器0上了。

对于每步的查询而言,目标就是:尽可能地将查询key发送到离存储这个key最近的那台机器上。比如,上面的机器1接收到  key 为 items7 的查询,机器1上存储着key为 2,3,5的数据,但是由于items 7 比items 2,3,5都要大,因此它判断出存储 items=5 的那台机器 距离 存储items=7的机器 更近,故把查询请求转发给 items=5 所在的那台机器(机器6)

欢迎扫描二维码关注微信公众号 深度学习与数学   [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]

一天不学习我浑sen难受(一)—一致性哈希/Hash环学习笔记相关推荐

  1. 深度学习网络大杀器之Dropout(II)——将丢弃学习视为集成学习之我见

    原帖:阿里云云栖社区: https://yq.aliyun.com/articles/110002 关于dropout的分析,可以见博主的另外一篇文章: <深度学习网络大杀器之Dropout-- ...

  2. 深度学习 -- TensorFlow(项目)验证码生成与识别(多任务学习)

    目录 基础理论 一.生成验证码数据集 1.生成验证码训练集 1-0.判断文件夹是否为空 1-1.创建字符集(数字.大小写英文字母) 1-2.随机生成验证码(1000个,长度为4) 2.生成验证码测试集 ...

  3. 【组队学习】【31期】水很深的深度学习

    水很深的深度学习 航路开辟者:刘洋 领航员:陈宇 航海士:刘洋.陈陟原.左凯文.初晓宇.刘羽中 基本信息 开源内容:https://github.com/datawhalechina/unusual- ...

  4. 学习这么多算法到底在解决哪些问题?深度学习之外,我们要选择谁?

    CSDN 出品的<2018-2019 中国人工智能产业路线图>V2.0 版即将重磅面世! V1.0 版发布以来,我们有幸得到了诸多读者朋友及行业专家的鼎力支持,在此表示由衷感谢.此次 V2 ...

  5. 实战 | 深度学习轻松学:如何用可视化界面来部署深度学习模型

    翻译 | AI科技大本营 参与 | 王赫 上个月,我有幸结识了 DeepCognition.ai 的创始人. Deep Cognition (深度认知) 建立的深度学习工作室,为很多准备部署深度学习框 ...

  6. 《强化学习周刊》第16期:多智能体强化学习的最新研究与应用

    No.16 智源社区 强化学习组 强 化 学  习 研究 观点 资源 活动 关于周刊 强化学习作为人工智能领域研究热点之一,多智能强化学习的研究进展与成果也引发了众多关注.为帮助研究与工程人员了解该领 ...

  7. 《强化学习周刊》第2期:多智能体强化学习(MARL)赋能“AI智能时代”

    No.02 智源社区 强化学习组 R L 学  习 研究 观点 资源 活动 关于周刊 随着强化学习研究的不断成熟,如何将其结合博弈论的研究基础,解决多智能体连续决策与优化问题成为了新的研究领域,为了帮 ...

  8. 我这两年收藏的保姆级深度学习(TF、Pytorch....)资源,并做了学习笔记

    作为一名AI工程师,掌握一门深度学习框架是必备的生存技能之一. 自 TensorFlow 从 Google 中脱颖而出以来,它在研究和商业领域成为最受欢迎的开源深度学习框架,紧接着 从 Faceboo ...

  9. 深度强化学习_深度学习理论与应用第8课 | 深度强化学习

    本文是博雅大数据学院"深度学习理论与应用课程"第八章的内容整理.我们将部分课程视频.课件和讲授稿进行发布.在线学习完整内容请登录www.cookdata.cn 深度强化学习是一种将 ...

  10. 梳理百年深度学习发展史-七月在线机器学习集训营助你把握深度学习浪潮

    作为机器学习最重要的一个分支,深度学习近年来发展迅猛,在国内外都引起了广泛的关注.然而深度学习的火热也不是一时兴起的,而是经历了一段漫长的发展史.接下来我们了解一下深度学习的发展历程. 1. 深度学习 ...

最新文章

  1. Linux之whereis、which、find、location的区别和用法
  2. linux_软件安装策略和升级策略
  3. python控制窗口显示隐藏
  4. python教程:Json模块中dumps、dump、loads、load函数用法讲解
  5. python3中pip的安装、常见问题及万能解决方案。
  6. dataframe常用操作_Pandas | Dataframe的merge操作,像数据库一样尽情join
  7. oracle不属于集合操作,Oracle的几个集合操作
  8. 拖来拖去今天终于重装系统了
  9. MachineLearning Exercise 7 : K-means Clustering and Principle Component Analysis
  10. [学习笔记]--ASP.Net MVC
  11. 菜鸟之路---1,熊猫烧香病毒的简单分析
  12. 手机数据恢复软件哪个好用?
  13. 【Blender 入门系列】 02 乐高方块渲染
  14. 电脑蓝屏c语言代码大全,电脑蓝屏代码C0000218怎么解决方法
  15. 当代中国最贵的汉字是什么?
  16. QT之qss教程- QScrollBar
  17. 【松岩盘前视点】2019-9-11
  18. 电商网站秒杀和抢购的高并发技术实现和优化
  19. 细细品味C#——泛型系列专题
  20. 轮廓线DP(插头DP 裸 经典骨牌)

热门文章

  1. HashTable和HashMap的区别详解(转)
  2. 3D VR卡镜的使用方法
  3. C# Chat曲线图,在发布之后出现错误 Invalid temp directory in chart handler configuration c:\TempImageFiles\...
  4. Tomcat5.5中配置虚拟路径
  5. 关于禁用html中a标签的思考
  6. python爬虫之BeautifulSoup4基础教程
  7. 07. Declare destructors virtual in polymorphic base classes
  8. static、const、static const、const static成员的初始化问题
  9. @Resource和@Autowired小笔记
  10. 使用Python将Excel文件中的数据插入MySQL数据库,你学会了吗?