[转载] 一致性哈希

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

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

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

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

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

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

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

 

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

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

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

 

low level

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

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

simple hash and mod

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

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

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

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

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

于是便有了一致性hash

3. 一致性哈希

concurrency hash

如图, 所有的节点也有自己的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NB-IoT,你真是太让我失望了

来源:EET电子工程专辑摘要:根据IHS Markit预测,2019年,在所有低功耗广域网公用网络中,超过40%都有望使用基于LoRa的设备,这意味着LoRa有望在今年成为主导型的LPWAN解决方案。那么“老对手”NB-IoT呢?“NB-…

深度学习详解

来源:传感器技术人工智能,就像长生不老和星际漫游一样,是人类最美好的梦想之一。虽然计算机技术已经取得了长足的进步,但是到目前为止,还没有一台电脑能产生“自我”的意识。但是自 2006 年以来,机器学习领…

Nature今发表脑机接口领域重大突破:

来源:学术经纬摘要:将计算机连通人脑,直接读取意识,这不是科幻。顶尖学术期刊《自然》刚刚在线发表的一项工作就在脑机接口领域向前迈出了一大步。加州大学旧金山分校(UCSF)的神经外科学家Edward Chang教授…

2019版中国数字经济发展与就业白皮书

未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云…

深入卷积神经网络背后的数学原理

来源:AI科技大本营摘要:在计算机神经视觉技术的发展过程中,卷积神经网络成为了其中的重要组成部分,本文对卷积神经网络的数学原理进行了介绍。文章包括四个主要内容:卷积、卷积层、池化层以及卷积神经网络中的反向传播…

Linux学习之如何在物理机上安装Linux发行版

Linux学习之如何在物理机上安装Linux发行版 第一步:制作系统安装盘 准备一个至少8GB的空白U盘。下载启动盘制作工具Rufus,下载链接:https://pan.baidu.com/s/1CU8oZJVyCgdwETI2VxJwxA 提取码:gwi1下载Linux发行版安装镜像&#…

jQuery Easy UI Accordion(可伸缩的面板)包

Accordion 可伸缩的面板组件。基于panel,示为以下的比率&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8"><script type"text/javascript" src"easyui/jquery.min.js"></sc…

Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置

Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置 第一步&#xff1a;在PC机安装Ubuntu18.04LTS 具体安装步骤参见上一篇文章 第二步&#xff1a;安装arm-linux-gcc交叉编译环境 在终端中执行sudo mkdir /forlinx,新建名为forlinx的文件夹&#xff08;文件夹名可任意&…

报告解读 | 智能技术“核聚变”催生智能经济,将拉动十万亿市场

来源&#xff1a;阿里研究院从IT时代、互联网到智能2019年政府工作报告&#xff0c;正式提出了“智能”战略&#xff1a;“深化大数据、人工智能等研发应用。打造工业互联网平台&#xff0c;拓展‘智能’&#xff0c;为制造业转型升级赋能。”以5G、物联网、人工智能等技术为代…

Linux学习之云服务器搭建嵌入式Linux开发环境

Linux学习之云服务器搭建嵌入式Linux开发环境 第一步&#xff1a;购买云服务器 进入腾讯云官方网站腾讯云官方网站 选择云校园云校园 进入控制台 将云服务器系统设置为Ubuntu系统 使用Xshell6登录云服务器 使用Xftp6进行文件的上传与下载 在云服务器安装arm-linux-gcc…

JS中toFixed()方法的问题及解决方案

最近发现JS当中toFixed()方法存在一些问题&#xff0c;采用原生的Number对象的原型对象上的toFixed()方法时&#xff0c;规则并不是所谓的“四舍五入”或者是“四舍六入五成双”&#xff0c;所谓“四舍六入五成双”&#xff0c;在百度百科上给的解释是&#xff1a;也即“4舍6入…

AI的阿基里斯之踵:模糊性

来源&#xff1a;IEEE电气电子工程师学会摘要&#xff1a;网罗全球科技前沿动态&#xff0c;为科研创业打开脑洞。很多年前&#xff0c;我和一位朋友去参观一个果园。他的儿子是这个果园的经理&#xff0c;向我们介绍了其工作。我的这位朋友和我都是工程师&#xff0c;开始讨论…

哈勃望远镜进一步确认宇宙在加速膨胀

来源&#xff1a;新华社美国哈勃太空望远镜的新观测成果进一步确认了宇宙在加速膨胀&#xff0c;现在的膨胀速度比根据早期宇宙特征预测的膨胀速度快大约9%。此次研究成果25日发表在美国《天体物理学杂志》上。研究人员利用新方法对大麦哲伦星云的70颗造父变星进行了观测。有“…

Git的安装和配置

Git的安装和配置 一、下载并安装git git下载地址 所有均选择默认值&#xff0c;一路NEXT 二、下载并安装tortoisegit 所有均选择默认值&#xff0c;一路NEXT 三、新建GitHub存储库 1.打开github官方网站&#xff0c;注册账号 2.登录后点击绿色NEW按钮 3.进入如图所示&am…

AI芯片重磅破局者,开启边缘新智元

来源&#xff1a;物联网智库摘要&#xff1a;曾几何时&#xff0c;我们惊讶于AI算力和智力的创新程度&#xff0c;但彼时AI所创造的产业价值并不明显。随着移动互联网时代走向物联网时代&#xff0c;越来越多的场景和终端需要对数据进行即时高效的处理&#xff08;如车联网、无…

Python学习笔记(序列和元组)

序列和元组 序列是指一种包含多项数据的数据结构&#xff0c;序列包含的多个数据项(成员)按顺序排列&#xff0c;可通过索引&#xff08;下标&#xff09;&#xff0c;来访问序列成员。Python常见的序列包括字符串、元组、列表等&#xff0c;字节串也是序列&#xff0c;namedt…

Python学习笔记(列表和元组的简单实用)

一、通过索引访问元素 1.列表和元组都可通过索引来访问元素 一种是正向访问&#xff0c;从左到右&#xff0c;索引从0开始&#xff0c;第一个元素的索引为0&#xff0c;第二个为1&#xff0c;以此类推。 另一种是反向访问&#xff0c;从右到左&#xff0c;索引从-1开始&#…

《全球人工智能发展报告(2018)》发布:一览全球AI领域竞争态势

来源&#xff1a;乌镇智库乌镇智库《全球人工智能发展报告》以宏观视角纵览全球人工智能的发展&#xff0c;覆盖了知识产权、投融资、人才、应用场景等多个维度&#xff0c;为读者清晰地展现出人工智能全球发展的最新趋势&#xff0c;各国在人工智能领域的竞争态势以及中国各地…