转载自http://www.jiacheo.org/blog/174

学习分布式, 一致性哈希是最最基础的知识, 所以要理解好.

那什么是一致性哈希呢?(what)

百度百科 上的解释很专业术语. 要一句话定义貌似也有难度: 一致性哈希算法是在哈希算法基础上,提出的在动态变化的分布式环境中,哈希算法应该满足的几个条件: 平衡性, 单调性和分散性.

1.平衡性是指 hash的结果应该平均分配到各个节点, 这样从算法上就解决了负载均衡问题.

2.单调性是指 在新增或者删减节点时, 同一个key访问到的值总是一样的.

3.分散性是指 数据应该分散的存放在 分布式集群中的各个节点(节点自己可以有备份), 不必要每个节点都存储所有的数据.

为什么要一致性哈希?(why)

这个问题问得很好…首先我们要看看不使用一致性hash, 我们的分布式集群如何工作.

1. 普通集群, 把固定的key映射到固定的节点上, 节点只存放各自key的数据, 如图:

这样, 我们必须维护好key和节点的关系, 而且当其中一个节点挂掉了, 节点上的数据可以迁移, 但key的关系也要重新维护.

2. 简单hash集群. 为了不想维护key, 降低复杂性和其他开销, 很容想到 对key进行hash , 然后对节点数取模, 比如我们原本有四个节点, 如下图

这个时候就不必维护这些key对应的node了, 直接通过hash值, 然后对节点数取模, 看起来貌似很完美, 足够了吧?

No! 如果这个时候其中一个节点挂了, 那这个节点的数据就完全不可用了. 当然你会说可以通过数据迁移呀, 嘿嘿, 问题

恰恰难在数据迁移, 因为这时候挂了, 节点数变为3了, 对key取hash后再 mod 3 的话, 大部分的key对应的节点都要改. 这个时候

只能整个集群的数据都重新迁移一遍才能达到效果, 也许你忙完这些工作, 还不如把挂掉的机器换个新的!!! 再者, 不仅仅是节点挂了会出现问题

如果整个分布式集群负载很高, 希望增加节点来解决问题, 这个时候, 迁移的工作还是一样的麻烦, 这样我估计如果数据量庞大的话, 没人敢轻易迁移.

于是便有了一致性hash

3. 一致性哈希

如图, 所有的节点也有自己的key(比如hostname), 经过hash, 然后mod 2的32次方, 映射到这个超大的环上面的一个虚拟节点

然后所有的key去获取value的时候, 也是同样的hash算法, mod 2的32次方, 这时候不一定所有的key都刚好映射到各个节点相应的虚拟

节点上(事实上概率很小), 然后这时候取值只要按照约定好的固定方向(如顺时针), 找到第一个的虚拟节点, 然后根据该虚拟节点

就可以找到相应的node, 然后进行相应的操作.

这个时候, 如果其中一个节点挂了, 那么依然要进行数据迁移, 只不过数据迁移的数据量减少了, 只需要将挂了的节点的数据迁移到他顺时针的下一个

节点上即可, 这个对应的keys依然能够找到数据. 同样的, 如果增加节点, 数据迁移量也不多, 只需要将该节点逆时针方向到达上一个节点之前的key对应的数据都

迁移到新增的节点上就OK了.这就是传说中的一致性哈希.

比如上图, key1 key2 key3 key4 key5 key6的值将由 node2返回( 假设这是一个key value存储集群)

同样的, key7~key11 对应 node3

key12 ~key17对应node4

key18~key22 对应node1

3. 讲完了what和why, 就是how了

其实上面在why讲解过程中, how的部分已经讲解了一大片, 其实关键的地方还是在hash算法的选择, 如何选择好的hash算法, 让他能够平均地分配每个节点, 这才是

最大的问题.

简单的话可以使用MD5算法来作为hash算法, 对于各个hash算法的比较, 可以参考下面的文章

http://www.iteye.com/topic/346682

另外参考 http://www.cnblogs.com/liunx/archive/2010/03/24/1693925.html

和这篇 http://blog.csdn.net/x15594/archive/2011/03/23/6270242.aspx

他们的图画的比我生动

转载于:https://www.cnblogs.com/scott19820130/p/4622083.html

[转载] 一致性哈希相关推荐

  1. 【转载】一致性哈希算法(consistent hashing)

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  2. [转载] 应用于负载均衡的一致性哈希及java实现

    转载自http://blog.csdn.net/haitao111313/article/details/7537799 这几天看了几遍一致性哈希的文章,但是都没有比较完整的实现,因此试着实现了一下, ...

  3. 一致性哈希算法的理解

    关于一致性哈希算法,网上有很多博文都有讲解.推荐2个. http://blog.codinglabs.org/articles/consistent-hashing.html http://blog. ...

  4. 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据...

    一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...

  5. 白话解析:一致性哈希算法 consistent hashing

    在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的 ...

  6. 分布式系统中一致性哈希算法

    1业务场景 近年来B2C.O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来.分布式系统相对于单系统,解决了流量大.系统高可用和高容错等问题.功能强大也意味着实现起来需要更多技术的支持.例 ...

  7. 深入一致性哈希(Consistent Hashing)算法原理

    2019独角兽企业重金招聘Python工程师标准>>> 本文为实现分布式任务调度系统中用到的一些关键技术点分享--Consistent Hashing算法原理和Java实现,以及效果 ...

  8. 漫画:什么是一致性哈希

    转载自 玻璃猫 程序员小灰 一年之前-- 未来两年内,系统预估的总订单数量可达一亿条左右. 按Mysql单表存储500万条记录来算,暂时不必分库,单库30个分表是比较合适的水平分表方案. 于是小灰设计 ...

  9. 一致性哈希算法原理分析及实现

    一致性哈希算法常用于负载均衡中要求资源被均匀的分布到所有节点上,并且对资源的请求能快速路由到对应的节点上.具体的举两个场景的例子: 1.MemCache集群,要求存储各种数据均匀的存到集群中的各个节点 ...

最新文章

  1. python IO多路复用源码
  2. 华为底部虚拟导航栏挡住布局
  3. SP22343 NORMA2 - Norma(分治优化复杂度)
  4. linux 下nm命令输出,Linux nm命令介绍
  5. linux cpu监控方案,Linux性能优化和监控系列(二)分析CPU性能
  6. 用C++计算文件的MD5值
  7. 《模拟电子技术》清华大学华成英教授主讲
  8. flex builder的安装
  9. 各地级市系列环境指标数据(2003-2017年)
  10. 工作计划表怎么做?30份Excel工作计划表模板,职场人必备,可套用
  11. iOS-性能优化的那些事
  12. 422器件与lvds接收器的区别_TVS管与ESD保护二极管的区别
  13. batchsize和数据量设置比例_设置BatchSize
  14. 「磨金石教育学员插画作业」什么是日系插画?
  15. 「打卡」Coggle 30 Days of ML(23年2月)
  16. spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict
  17. html5 自动矢量化,HTML5中地圖矢量化
  18. 基于OAuth2.0微信网页第三方授权原理
  19. 分布式和非分布式_分布式防御虚假信息
  20. 产品经理之产品类题目

热门文章

  1. LeetCode 1855. 下标对中的最大距离(双指针)
  2. LintCode 1917. 切割剩余金属
  3. LeetCode LCP 11. 期望个数统计
  4. 程序员面试金典 - 面试题 05.06. 整数转换(位运算)
  5. 计算机系统操作在线作业,电子科大《计算机操作系统》在线作业3
  6. python语言画心_python语言还是java如何用python画爱心
  7. python清洗文本数据_02.数据预处理之清洗文本信息
  8. linux串口数据异常,linux串口知识深入--收到数据异常问题处理
  9. convert.todatetime指定日期格式_MATLAB的时间与日期
  10. Java的getcelltype用法_java getCellType的替代方法