[速成]了解一致性hash算法
定义
一致性hash算法,在维基百科的定义是:
Consistent hashing is a special kind of hashing such that when a hash table is resized, only K/n keys need to be remapped on average, where K is the number of keys, and n is the number of slots. In contrast, in most traditional hash tables, a change in the number of array slots causes nearly all keys to be remapped because the mapping between the keys and the slots is defined by a modular operation.
翻译过来的意思就是当hash表更新节点的数量时,只有k/n的关键字位置有变化,其他关键字的位置映射关系不变。与其他的hash算法比,其他的算法节点个数n变化后,更多的key关键字和节点的映射会发生变化。
使用场景
一致性hash主要用在路由中,对有状态的服务,根据key进行转发到对应的服务中。保证相同的key一直落到同一个服务器,当有服务节点增减时,只有少量(k/n)的请求位置是变化的。减少重新建立缓存或存储的成本。
原理实现
前提:
- 每个请求的key范围[0,2^32),一共有k个key;
- 一共有N个节点,一般一个几点对应一个服务器。
常规实现
取key所映射的所有值最大空间(2^32)个,组成一个环,然后随机在这个环上落N个点,相邻的两个点形成一个左闭右开(关于左闭右开参考《聊聊左闭右开区间》)区间。共有N个区间。
对于每个key,一定只落在N个区间中的一个,它属于该区间所分配的节点。
当有服务节点增减时,会有区间新增或消失,平均只有k/N个key会受影响,变更属于的节点。
如下图,在插入nodeC之前,2、3、8key都属于nodeA,当插入nodeC后2、3归属C,属于B的节点不会改变。
改进:增加虚节点
常规实现在实际应用中会遇到问题。当N的数量太少时,会导致N个节点所管辖的区间并不均匀。
既然是N的数量太少,那增加N的数量不就行了?正解,可以成倍地增加N的数量,一个实际的节点扩充为100倍的虚节点,每个key先查找属于哪个虚节点,再查看该虚节点属于那个实节点。
由于众多虚节点的引入,使每个实节点被分配到的key数量的差距变少。
从图中可见,增加了nodeA和nodeD的虚节点后,把区间分得更细小,会使分布更均匀。还可以通过设置权值,让不同处理能力的实节点,处理不同量级的key。
实践经验
通过上面的讲解,可以熟悉一致性hash的算法,但是在实际使用中,还是有很多需要注意的地方。
如何加入虚节点
加入虚节点能够解决分布不均的问题,但是如何加入也是有技巧的。如果完全随机,就是撞大运编程。要利用搜索算法,加入节点时要检测,保证每个实节点的区间不能差异太大。必要时要回溯,剪枝,或者用启发性搜索。
节点配置同步
一个大系统,每个真实节点有1000个虚节点,一共1000个实节点,有1M条目数据。每当更新节点信息时,要保证快速更换、传递更新数据,而且要有检查功能。节点配置的同步、检测也会有很多细节问题。
[速成]了解一致性hash算法的更多相关文章
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 一致性hash算法详解
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- 一致性hash算法简介
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...
- 分布式缓存技术memcached学习(四)—— 一致性hash算法原理
分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...
- 一致性 hash 算法( consistent hashing )a
一致性 hash 算法( consistent hashing ) 张亮 consistent hashing 算法早在 1997 年就在论文 Consistent hashing and rando ...
- 一致性hash算法简介与代码实现
一.简介: 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance) 2.单调性(Monotonicity) 3.分散性(Spread) 4.负 ...
- memcache的一致性hash算法使用
一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的k ...
- 一致性Hash算法在Redis分布式中的使用
由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢? ...
- 【转载】一致性hash算法释义
http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karge ...
随机推荐
- LINUX ON AZURE 安全建议(全)
本文为个人原创,可以自由转载,转载请注明出处,多谢! 本文地址:http://www.cnblogs.com/taosha/p/6399554.html 1.网络与安全规划 Azure 虚拟网络 (V ...
- Eclipse默认编码设置
eclipse 默认编码居然是GBK,js文件默认编码是ISO-....怎么可以这样呢?都修改成UTF8的方法:1.windows->Preferences...打开"首选项" ...
- WPF中button按钮同时点击多次触发click解决方法
DateTime lastClick = DateTime.Now; object obj = new object(); ; private void Button_Click(object sen ...
- elasticsearch系列(一) 术语
elasticsearch(以下简称es)是一款开源的搜索引擎,基于apach lucene.最近在做nlp的时候顺便研究一下. 下面是官方列举的术语解释 Near Realtime 接近实时的查询, ...
- python——文件操作
open函数,该函数用于文件处理 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式 ...
- 线下市场,选择微信小程序从未显得如此重要
2017 年 1 月 9 日,小程序正式上线,到今日,3 月 8 号,这个新产品面世刚好满两个月.小程序刚推出便受到全球关注,腾讯股价当天即创逾一个月高位,但关注度先是急速上涨,不久便迅速降温,甚至在 ...
- mui开发app之联网应用传输数据
手机的app分为,在线和单机,在线就是类似于C/S模式,能与服务器与他人共享数据的程序,单机就是在没有网络下可以玩转的app. 目前互联网盛行的时代,99%的程序都是联网环境下工作的.那么如何开发本地 ...
- 最简单bat教程
请移到此处查看 http://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html
- linux 内核的另一个自旋锁 - 读写锁
除spinlock外,linux 内核还有一个自旋锁,名为arch_rwlock_t.它的头文件是qrwlock.h,包含在spinlock.h,头文件中对它全称为"Queue read/w ...
- OC中Foundation框架
框架的概念 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的组合,以便使研发程序变的更容易在OS X下地Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation框架 ...