Hash哈希(二)一致性Hash(C++实现)
一致性Hash
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,经常用于分布式、负载均衡等。
原理
一致哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表中平均只需要对
个关键字重新映射,其中
是关键字的数量,
是映射节点数量。然而在传统的哈希表中,添加或删除一个映射节点的几乎需要对所有关键字进行重新映射。
原来的映射大概是这样的,如下图,没当加入或删除一个新的节点可能都会造成每个节点的映射发生变化,如果黄色的节点代表服务器,那么每一次更新服务器的数量都会造成每个服务器上蓝色的映射节点都会发生变化,当集群数量庞大时每次增删节点所需要的修改操作就会过于庞大。

而在一致性哈希中映射是这样的,如下图,一般一致性hash取值范围为-2^32~2^32,分布在一个圆上

下面画的比较丑,就凑合看吧~~
黄色节点作为映射节点(实节点),蓝色节点为需要映射到映射节点的key节点
首先,看左边的图,把8个蓝色的key通过hash取值散列在一个范围为0~2^32的圆上
其次,选择三个黄色节点作为映射节点,按照圆的顺时针方向,把蓝色节点与黄色节点建立映射关系
最后,由于1节点负载为4,最大,那么我们为了降低1节点的负载情况,增加黄色的映射节点4,依然按照顺时针的方向修改原映射,那么只需要改变蓝色的节点7、8以及黄色节点1

实现
一般为了方便起见,我们把黄色的映射节点称为实节点,也就是固定不变的,而蓝色的节点称为虚节点,虚节点需要映射到实节点,每次实节点的增删只会影响距离它最近的节点。
在这里使用C++实现了ConsistentHash算法

在存储节点方面,本程序只是简单的使用链表,最好的方式当然是红黑树了,当然为了简单起见,就用了链表,主要是理解一致性hash的原理~~
源码下载:https://github.com/yxd123/algorithm-notes/tree/master/ConsistentHash
参考
http://blog.csdn.net/cywosp/article/details/23397179
http://zh.wikipedia.org/wiki/一致哈希
http://baike.baidu.com/view/1588037.htm?fr=aladdin
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012
Hash哈希(二)一致性Hash(C++实现)的更多相关文章
- 11.redis cluster的hash slot算法和一致性 hash 算法、普通hash算法的介绍
分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 一.hash 算法 来了一 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- Java实现一致性Hash算法深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中”一致性Hash算法”部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原 ...
- 【数据结构与算法】一致性Hash算法及Java实践
追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...
- 对一致性Hash算法及java实现(转)
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 对一致性Hash算法,Java代码实现的深入研究(转)
转载:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读 ...
- 【转载】对一致性Hash算法,Java代码实现的深入研究
原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细 ...
- 分方式缓存常用的一致性hash是什么原理
分方式缓存常用的一致性hash是什么原理 一致性hash是用来解决什么问题的?先看一个场景有n个cache服务器,一个对象object映射到哪个cache上呢?可以采用通用方法计算object的has ...
- OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法
1.Ring的基本概念 Ring是swfit中最重要的组件.用于记录存储对象与物理位置之间的映射关系,当用户须要对Account.Container.Object操作时,就须要查询相应的Ring文件( ...
- 一致性Hash算法与代码实现
一致性Hash算法: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值 ...
随机推荐
- 基于tcp/udp的协议
使用TCP协议的常见端口主要有以下几种: (1) FTP:定义了文件传输协议,使用21端口.常说某某计算机开了FTP服务便是启动了文件传输服务.下载文件,上传主页,都要用到FTP服务. (2) Tel ...
- Ubuntu 安装 fcitx 输入法
fcitx 和 ibus一样都是输入法框架.下面介绍ubuntu下安装fcitx输入法. 1.先卸载系统中的输入法 2.安装. 增加ppa源:sudo add-apt-repository ppa:f ...
- isa指针
转载自 http://www.cnblogs.com/zhangdashao/p/4438540.html 可以去这里看详细的. 每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是O ...
- mysql 索引分类
在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL的查询和运行更加高效.索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常 ...
- 使用__slots__
[使用__slots__] 参考: 1.http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a0 ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- stream_copy_to_stream的使用
stream_copy_to_stream - 在数据流之间进行复制操作 例子: <?php //读写方式 $stream = fopen('php://temp', 'w+'); //如果成功 ...
- springMVC框架中,在hib-config.xml配置sqlserver2008数据库连接的代码
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> ...
- 自己随意写了个简单的依赖jquery的轮播图
//轮播图 function Switcher(obj){ this.box = $(obj.box); this.width = this.box.width(); this.banner = $( ...
- nodeJS分层
一.nodeJS分层 分为三层: - 表现层:接受用户数据,并封装 - 服务层:与公司业务有关的东西,处理判断呀什么的 - 持久层:与数据库有关的 表现层:page与表现层的数据传递,route ...
