当前位置: 首页 > 编程日记 > 正文

“分布式哈希”和“一致性哈希”的概念与算法实现

分布式哈希和一致性哈希是分布式存储和p2p网络中说的比较多的两个概念了。介绍的论文很多,这里做一个入门性质的介绍。

分布式哈希(DHT)
  两个key point:每个节点只维护一部分路由;每个节点只存储一部分数据。从而实现整个网络中的寻址和存储。
DHT只是一个概念,提出了这样一种网络模型。并且说明它是对分布式存储很有好处的。但具体怎么实现,并不是DHT的范畴。

一致性哈希:
  DHT的一种实现。本质还是一个哈希算法。回想平时我们做负载均衡,按querystring签名对后端节点取模是最简单也是最常用的算法,但节点的增删后所造成的问题显而易见,原有的请求几乎都落不到同一台机器上。优化一点的是carp算法(用机器ip和querystring一起做hash,选取hash值最小的一台),只让1/n的数据受到影响。
一致性哈希,似乎最早提出是在分布式cache里面的,让节点震荡的时候,影响最小,以提高分布式cache的命中率。不过现在更多的应用在分布式存储和p2p系统里面。

一致性哈希也只是提出四个概念和原则,并没有提及具体实现:

1、balance:哈希结果尽可能的平均分散到各个节点上,使得每个节点都能得到充分利用。

2、Monotonicity:上面也说了,如果是用签名取模算法,节点变更会使得整个网络的映射关系更改。如果是carp,会使得1/n的映射关系更改。一致性哈希的目标,是节点变更,不会改变网络的映射关系。

3、spread:同一份数据,存储到不同的节点上,换言之就是系统冗余。一致性哈希致力于降低系统冗度。

4、load:负载分散,和balance其实是差不多的意思,不过这里更多是指数据存储的均衡,balance是指访的均衡。

Chord算法:
  一致性哈希有多种实现算法,最关键的问题在于如何定义数据分割策略和节点快速查询。

chord算是最为经典的实现。cassandra中的DHT,基本是chord的简化版。

网络中每个节点分配一个唯一id,可以通过机器的mac地址做sha1,是网络发现的基础。

假设整个网络有N 个节点,并且网络是呈环状。两个节点间的距离定义为节点间下标差。每个节点会存储一张路由表(finger表),表内顺时针按照离本节点2、4、8、16、32.……2i的距离选定log2N个其他节点的ip信息来记录,主要是为了查询加速。

存储:数据被按一定规则切割,每一份数据也有一个独立id(查询key),并且和节点id的值域是一样的。然后查找节点,如果存在和数据id一样的节点id,则将这份数据存在该节点上;如果不存在,则存储到离该数据id距离最近的节点上。同时,为了保证数 据的可靠性,会顺时针往下找K个冗余节点,存储这份数据。一般认为K=3是必须的。

下图简单描述了一个chord网络的部署,绿色节点为机器,编码为hash值。N0节点的finger表可以看出N0节点的路由规则,其他节点也有类似的finger表。蓝色节点为数据,根据hash值找到最近的节点并存储。虚线所指是表示冗余存储。

查询:先从自己的路由表中,找一个和数据id距离最近、并且存活在网络中的节点next。如果该节点的 id巧合和数据id相等,那么恭喜你。如果不相等,则到next进行递归查找。一般或需要经过多次查询才能找到数据所在的节点,而这个次数是可以被证明小于等于log2N的。

在这个查询的过程中就体现了路由表的选取优势了,其实是实现了一个二分查找,从每个节点来观察网络,都是将网络分成了log2N块,最大一块里面有N/2个节点。路由表里面其实是记录了每一块的第一个节点。这样每一次查询,最少排除了一半的节点。保证在 log2N次内找到目标节点。

下图简单展示了从N0节点查找N21节点的一个数据的过程,通过finger表经过2跳到达目的地。

新增一个节点i:需要预先知道网络中已经存活的一个节点j,然后通过和节点j交互,更新自己和其他节点的路由表。并且,需要将离自己距离最近的节点中的数据copy过来,以提供数据服务。

损失一个节点:路由算法会自动跳过这个节点,并且依靠数据的冗余来持续提供服务。

KAD算法(Kademlia)
  kad算法其实是在chord上做的优化。主要是两个点:
  1、用二进制(32/64/128)表示一个节点的id,两节点的id异或运算得到节点间的距离。
  2、 每个节点保持的路由信息更丰富,同样是将整个网络按照划分成log2N份,在chord中,是保持log2N个路由节点,但在kad里面,是保存了 log2N个队列。每个队列长度为配置值K,记录网络中对应节点区域的多个节点,并且根据活跃时间对这些节点进行换入换出。
  第一点是方便进行网络划分,节点按照二进制中每一bit的0或1建成一棵二叉树。

第二点是使得节点查询更迅速。从分割情况我们就可以得知,最坏情况不会差于chord,但保存更多的节点使得命中概率更高。另外队列中根据活跃时间进行换入换出,更有利于在p2p这种节点变更频繁的网络中快速找到有效的节点。

关于kad的介绍,这篇文章讲的比较详细wenku.baidu.com/view/ee91580216fc700abb68fcae.html

相关文章:

7000 字 23 张图,Pandas一键生成炫酷的动态交互式图表

作者 | 俊欣来源 | 关于数据分析与可视化今天小编来演示一下如何用pandas一行代码来绘制可以动态交互的图表,并且将绘制的图表组合到一起,组成可视化大屏,本次小编将要绘制的图表有折线图散点图直方图柱状图饼图面积图地图组合图准备工作我们…

手把手教你使用zabbix监控nginx

zabbix监控nginx,多亏了容哥(杨容)的帮忙,为了感谢容哥的帮助,写了这篇文章。环境介绍:服务器系统版本:CentOSrelease 6.6 (Final)内核版本:Linux hk_nginx2.6.32-504.3.3.el6.x86_64ZabbixServer版本&…

理解多线程设计模式

多线程设计模式:1.Single Threaded Execution Pattern [同一时刻只允许一个线程操作] 比喻:三个挑水的和尚,只能同一时间一个人过桥,不然都掉河里喂鱼了。 总结:在多个线程同时要访问的方法上加上synchronized关键…

Linux内核之旅

内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kern…

qq腾讯第三方登陆

html页面&#xff1a;<html> <head> <meta charset"utf-8" /> <title>第三方登录</title> <meta property"qc:admins" content"1541324001721762700063671645060454" /> </h…

如何利用 Python 爬取 LOL 高清精美壁纸?

作者 | 阿拉斯加 来源 | 杰哥的IT之旅 一、背景介绍 随着移动端的普及出现了很多的移动 APP&#xff0c;应用软件也随之流行起来。最近看到英雄联盟的手游上线了&#xff0c;感觉还行&#xff0c;PC 端英雄联盟可谓是爆火的游戏&#xff0c;不知道移动端的英雄联盟前途如何&…

生产环境主从数据同步不了?

生产环境主从数据同步不了&#xff1f;经历过程&#xff1a; 一般我们常常在做主从复制的时候&#xff0c;可能是很少遇到到错误&#xff0c;那都是因为&#xff0c;你做主从基本用的是&#xff0c;本地虚拟机做&#xff0c;或者一些测试环境做。但是当我们把主从复制部署…

用 YOLOv5模型识别出表情!

作者 | 闫永强来源 | Datawhale本文利用YOLOV5对手势进行训练识别&#xff0c;并识别显示出对应的emoji&#xff0c;如同下图&#xff1a;本文整体思路如下。提示&#xff1a;本文含完整实践代码&#xff0c;代码较长&#xff0c;建议先看文字部分的实践思路&#xff0c;代码先…

Linux操作系统中内存buffer和cache的区别

我们一开始&#xff0c;先从Free命令说起。 free 命令相对于top 提供了更简洁的查看系统内存使用情况&#xff1a; $ freetotal used free shared buffers cachedMem: 255268 238332 16936 0 85540 126384-/ buffers/cache: 26408 228860Swap: 265000 …

sort cut 命令的常用用法

sort命令介绍&#xff1a;sort是在Linux里非常常用的一个命令&#xff0c;管排序的&#xff0c;集中精力&#xff0c;五分钟搞定sort&#xff0c;现在开始&#xff01;1 sort的工作原理sort将文件的每一行作为一个单位&#xff0c;相互比较&#xff0c;比较原则是从首字符向后&…

使用 dockerfile 创建镜像

dockerfile 是一个文本格式的配置文件&#xff0c;可以使用 dockerfile 快速创建自定义的镜像。 dockerfile 一般包含4部分信息&#xff1a;基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令 创建镜像命令&#xff1a;docker build [选项] 路径&#xff0c;会读取指…

wireshark的使用教程--用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的

wireshark的使用教程 --用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的 wireshark是一款抓包软件&#xff0c;比较易用&#xff0c;在平常可以利用它抓包&#xff0c;分析协议或者监控网络&#xff0c;是一个比较好的工具&#xff0c;因为最近在研究这个&#xff0c;…

设计师你们还坐的住吗?2021 PS 进入人工智能 P 图时代

与每年一样&#xff0c;Adobe 的 Max 2021 活动顺利开展。本次活动主要是以产品展示以及其他创新产品。 这个活动最有趣的特点之一是&#xff0c;Adobe 不断将人工智能集成到其产品或是功能中。在过去的几年里&#xff0c;人工智能一直是这家公司不断探索的领域。 与许多其他公…

图像处理之噪声---椒盐,白噪声,高斯噪声三种不同噪声的区别

白噪声是指功率谱密度在整个频域内均匀分布的噪声。 所有频率具有相同能量的随机噪声称为白噪声。白噪声或白杂讯&#xff0c;是一种功率频谱密度为常数的随机信号或随机过程。换句话说&#xff0c;此信号在各个频段上的功率是一样的&#xff0c;由于白光是由各种频率&#xff…

发现一个“佛系记账本”

因为这是一款微信小程序&#xff0c;张小龙大力推崇的“用完即走”完美地适合记账应用。 不用下载、不用安装、不用注册、不用各种授权&#xff0c;只要从微信进入&#xff0c;就能记账&#xff0c;账本只与微信关联。 换手机、换PAD都无所谓&#xff0c;只要登录微信&#xff…

YSLOW法则中,为什么yahoo推荐用GET代替POST?

原文&#xff1a;http://www.cnxct.com/use-get-for-ajax-requests-why/ 背景&#xff1a;上上周五&#xff0c;公司前端工程师培训&#xff0c;提到前端优化的一些技巧&#xff0c;当然不能少了yahoo yslow的优化法则。其中有这么一条“Use GET for AJAX Requests”&#xff0…

Python 多进程、协程异步抓取英雄联盟皮肤并保存在本地

作者 | 俊欣来源 | 关于数据分析与可视化就在11月7日晚间&#xff0c;《英雄联盟》S11赛季全球总决赛决斗&#xff0c;在冰岛拉开“帷幕”&#xff0c;同时面向全球直播。在经过了5个小时的鏖战&#xff0c;EDG战队最终以3:2战胜来自韩国LCK赛区的DK战队&#xff0c;获得俱乐部…

QT 5.4.1 for Android Ubuntu QtWebView Demo

QT 5.4.1 for Android Ubuntu QtWebView Demo 2015-5-15 目录 一、说明&#xff1a; 二、参考文章&#xff1a; 三、QtWebView Demo在哪里&#xff1f; 四、Qt Creator 3.4.0能打开QtWebView Demo&#xff1f; 五、Qt Creator如何生成AndroidManifest.xml&#xff1f; 一、…

硬改TP-Link WR841N v8刷breed和OpenWrt

找到了以前的路由器&#xff0c;想刷OpenWrt但版本是TP-Link的WR841N v8版&#xff0c;上网查过才知道&#xff0c;是专门面向国内发布的严重缩水版国际版的Flash是4M&#xff0c;内存RAM是32M&#xff0c;国内版是2M/16M&#xff0c;不过论坛上也有人说到手的Flash是4M的。(Op…

Facebook的实时Hadoop系统

原文地址&#xff1a; http://blog.solrex.org/articles/facebook-realtime-hadoop-system.html作者&#xff1a;杨文博Facebook 在今年六月 SIGMOD 2011 上发表了一篇名为“Apache Hadoop Goes Realtime at Facebook”的会议论文 (pdf)&#xff0c;介绍了 Facebook 为了打造一…

Ka的回溯编程练习 Part1|整划什么的。。

1 #include<stdio.h>2 int search(int s,int t);3 void op(int k);4 int res[1001]{1},n;5 int main()6 {7 //scanf("%d",&n);8 n10;9 search(n,1); 10 return 0; 11 } 12 int search(int s,int t) //当前数的大小s&#xff0c;个数n 13 …

开发者关心的十个数据库技术问题

作者 | 雷海林 责编 | 田玮靖出品 | 《新程序员》如今&#xff0c;数据库越来越受到业界的广泛关注&#xff0c;许多高校毕业生及资深技术人也逐渐投身于数据库产业。《新程序员002》经过用户、专家调研&#xff0c;收集汇总了十个开发者关心的数据库技术问题&#xff0c…

使用T-SQL语句操作数据表-更新数据

使用update语句更新表中的数据。也就是修改表中的数据。update语法格式&#xff1a;update <表名> set <列名更新值> [where <更新条件>] 解释&#xff1a;update 是更新数据名&#xff0c; 表明是更新数据set 是必要的&#xff0c; 后面可以紧随多个数据列的…

Category Archives: Linux

原文地址&#xff1a;http://blog.solrex.org/articles/solrex-linux-cheatsheet.html Cheatsheet&#xff1a;原意是考试的时候带的小抄&#xff0c;所以说是 cheat&#xff08;作弊&#xff09; sheet。在计算机科学领域里&#xff0c;主要是指记录一些难记命令或者操作的快查…

利用 OpenCV+ConvNets 检测几何图形

作者 | 小白 来源 | 小白学视觉 导读 人工智能领域中增长最快的子领域之一是自然语言处理&#xff08;NLP&#xff09;&#xff0c;它处理计算机与人类&#xff08;自然&#xff09;语言之间的交互&#xff0c;特别是如何编程计算机以处理和理解大量自然语言数据。 自然语言处理…

《Linux实践及应用》

2019独角兽企业重金招聘Python工程师标准>>> 《Linux实践及应用》 本书以RedHat 9.0为蓝本&#xff0c;系统地介绍Linux的基础知识、Linux系统的安装与配置、常用命令&#xff0c;以及如何进行Linux系统管理和基本的网络服务设置&#xff08;包括如何设置DNS服务器、…

找不到包含 OwinStartupAttribute 的程序集

2019独角兽企业重金招聘Python工程师标准>>> 尝试加载应用时出现了以下错误。 找不到包含 OwinStartupAttribute 的程序集。找不到包含 Startup 或 [AssemblyName].Startup 类的程序集。 若要禁用 OWIN 启动发现&#xff0c;请在 web.config 中为 appSetting owin:A…

Imagination 推新款GPU IP,首次实现桌面级光线追踪效果

游戏界被炒得最热的概念可能就是光线追踪技术了&#xff0c;不仅仅是PC端的游戏。光线追踪所展示出来的画面效果也确实惊艳&#xff0c;可以让我们感叹到图像技术达到的一个新高度。 但是实际上&#xff0c;光线追踪并不是一个新技术。10年前&#xff0c;光追就是游戏玩家茶余…

percent之集合

2019独角兽企业重金招聘Python工程师标准>>> 这个留到明天再来写吧,今天把hub剩下的坑填掉. 转载于:https://my.oschina.net/u/2011113/blog/416458

Mr. Process的一生-Linux内核的社会视角 (2)启动

原文地址&#xff1a; http://www.manio.org/cn/startup-of-linux-view-of-society.html 其实这才应该是这一系列文章的第一节&#xff0c;因为这篇文章讲的是盘古开天地的事。话说Mr. Process是一个现代人&#xff0c;但是&#xff0c;只要是人&#xff0c;总该有个祖先。人们…