[速成]了解一致性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 ...
随机推荐
- 学习Sass之安装篇
Sass是基于ruby开发的,所以想要用Sass要先搭建ruby环境 1 Mac下安装 2 windows下安装 3 下载koala,只需要下载这个软件,其余什么都不需要你安装
- STM32学习笔记(三)——外部中断的使用
开发板芯片:STM32F407ZGT6 硬件连接:PE3-KEY1 一.STM32F4的中断介绍 STM32F4的每个IO都可以作为外部中断输入,很强大的功能吧!以前学习的51只有两个外部中断. ST ...
- 149_best-time-to-buy-and-sell-stock
/*@Copyright:LintCode@Author: Monster__li@Problem: http://www.lintcode.com/problem/best-time-to-b ...
- redis object 对象系统
redis object对象系统 概述 redis 当中, sds字符串, adlist双向链表, dict字典, ziplist压缩链表, intset整数集合等均为底层数据结构 redis 并没有 ...
- Xamarin.Android 绑定友盟社会化分享组件
Xamarin.Android 绑定友盟社会化分享组件 最近在开发博客园Android App的时候需要用到友盟社会化分享组件,在github上搜了一下都没有找到最新版本绑定好的项目,就自己动手来绑定 ...
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
- Docker学习总结(一)
<认识Docker> 不定期更新~~~~~~~ 历史区别: 13年之前:网络大多使用"协议栈堆叠"的形式进行开发,需要部署单一专有的服务器进行操作.包括(中间件,运行时 ...
- Struts2之Action接收请求参数和拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Ac ...
- 关于使用JavaScript实现图片点击切换(附带改变导航图片 方案二)
具体需求见方案一. 这种方案相比方案一更加专业. <!DOCTYPE html> <html> <head lang="en"> <met ...