[转载] 一致性哈希

转载自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-…

重命名myclipse中web项目名称的过程

1 打开 myclipse2 最顶层项目上右键,Refactor,新名,3 最顶层项目上右键,propterties, MyEclipse, Web, context-root: /新名4 替换 .css, .js, .jsp 中全部的 "/旧名/"5 修改apache的配置, /etc/httpd/conf/…

深度学习详解

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

Dijkstra 算法

package dijkstra;import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set;public class Dijkstra {public static int U 99999999; // 此路不通static class Path2Len {public List<Integer> shortPath;public int short…

CSS-Transform-transition-Animation

Transform 根据我的理解&#xff0c;transform和width、height、background一样&#xff0c;都是dom的属性&#xff0c;不同的是它是css3旗下的&#xff0c;比较屌&#xff0c;能够对原来的dom元素进行移动、缩放、转动、拉长或拉伸&#xff0c;跟canvas上的某些api神似&#x…

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

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

C语言中的自定义类型

C语言中的自定义类型 &#xff08;一&#xff09;结构体 结构体的声明 结构体是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构体的成员可以是不同类型的变量&#xff1b;结构体的声明 struct tag { member-list; }variable-list;特殊声明 在声明结构体的时候…

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

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

文件即子文件删除

先简单说明一些基本&#xff1a;&#xff08;下面所说的文件夹也就是目录&#xff0c;我个人一开始不知道目录是什么&#xff0c;后来才知道目录就是文件夹&#xff09;。 1.首先介绍delete()方法的基本用法。 先创建一个File对象 &#xff0c;例如&#xff1a; File file new…

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

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

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

Linux学习之如何在物理机上安装Linux发行版 第一步&#xff1a;制作系统安装盘 准备一个至少8GB的空白U盘。下载启动盘制作工具Rufus&#xff0c;下载链接&#xff1a;https://pan.baidu.com/s/1CU8oZJVyCgdwETI2VxJwxA 提取码&#xff1a;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入…

Linux学习之Linux历史

Linux学习之Linux历史 一、UNIX发展史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念。1969&#xff0d;1970年&#xff0c;AT&T的贝尔实验室…

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

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

Linux学习之嵌入式Linux编程文件IO(C语言版)

Linux学习之嵌入式Linux编程文件IO&#xff08;C语言版&#xff09; 一、文件IO常用函数 1.open 2.write 3.read 示例代码&#xff1a; #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <stdli…

3个技巧让你正能量满满

因为工作关系&#xff0c;今年我每个月都在公司的新人入职培训课上讲一遍《职业习惯》&#xff0c;其中会讲到“职业生涯成功的关键点”&#xff0c;讲到“保持积极的心态”&#xff0c;每次都会讲几个真实的案例。这几个案例回味起来&#xff0c;对管理负面情绪、保持积极心态…