一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据...
一致性哈希算法
摘自:http://blog.codinglabs.org/articles/consistent-hashing.html
算法简述
一致性哈希算法(Consistent Hashing)最早在论文《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》中被提出。简单来说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0 - 232-1(即哈希值是一个32位无符号整形),整个哈希空间环如下:
整个空间按顺时针方向组织。0和232-1在零点中方向重合。
下一步将各个服务器使用H进行一个哈希,具体可以选择服务器的ip或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置,这里假设将上文中三台服务器使用ip地址哈希后在环空间的位置如下:
接下来使用如下算法定位数据访问到相应服务器:将数据key使用相同的函数H计算出哈希值h,通根据h确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器。
例如我们有A、B、C、D四个数据对象,经过哈希计算后,在环空间上的位置如下:
根据一致性哈希算法,数据A会被定为到Server 1上,D被定为到Server 3上,而B、C分别被定为到Server 2上。
容错性与可扩展性分析
下面分析一致性哈希算法的容错性和可扩展性。现假设Server 3宕机了:
可以看到此时A、C、B不会受到影响,只有D节点被重定位到Server 2。一般的,在一致性哈希算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即顺着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。
下面考虑另外一种情况,如果我们在系统中增加一台服务器Memcached Server 4:
此时A、D、C不受影响,只有B需要重定位到新的Server 4。一般的,在一致性哈希算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即顺着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。
综上所述,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。
虚拟节点
一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。例如我们的系统中有两台服务器,其环分布如下:
此时必然造成大量数据集中到Server 1上,而只有极少量会定位到Server 2上。为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现。例如上面的情况,我们决定为每台服务器计算三个虚拟节点,于是可以分别计算“Memcached Server 1#1”、“Memcached Server 1#2”、“Memcached Server 1#3”、“Memcached Server 2#1”、“Memcached Server 2#2”、“Memcached Server 2#3”的哈希值,于是形成六个虚拟节点:
同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Memcached Server 1#1”、“Memcached Server 1#2”、“Memcached Server 1#3”三个虚拟节点的数据均定位到Server 1上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。
总结
目前一致性哈希基本成为了分布式系统组件的标准配置,例如Memcached的各种客户端都提供内置的一致性哈希支持。本文只是简要介绍了这个算法,更深入的内容可以参看论文《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》,同时提供一个C语言版本的实现供参考。
实现:https://community.oracle.com/blogs/tomwhite/2007/11/27/consistent-hashing http://www.cnblogs.com/xrq730/p/5186728.html 查找的本质 利用查找树sorted map实现。
import java.util.Collection; import java.util.SortedMap; import java.util.TreeMap;public class ConsistentHash<T> {private final HashFunction hashFunction;private final int numberOfReplicas;private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();public ConsistentHash(HashFunction hashFunction, int numberOfReplicas,Collection<T> nodes) {this.hashFunction = hashFunction;this.numberOfReplicas = numberOfReplicas;for (T node : nodes) {add(node);}}public void add(T node) {for (int i = 0; i < numberOfReplicas; i++) {circle.put(hashFunction.hash(node.toString() + i), node);}}public void remove(T node) {for (int i = 0; i < numberOfReplicas; i++) {circle.remove(hashFunction.hash(node.toString() + i));}}public T get(Object key) {if (circle.isEmpty()) {return null;}int hash = hashFunction.hash(key);if (!circle.containsKey(hash)) {SortedMap<Integer, T> tailMap = circle.tailMap(hash);hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();}return circle.get(hash);}}
转载于:https://www.cnblogs.com/bonelee/p/6244410.html
一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据...相关推荐
- 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
一致性哈希算法--算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据 参考文章: (1)一致性哈希算法--算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据 (2)http ...
- 【编程实践】一致性哈希(hash)算法实现
目录 1 为什么使用一致性哈希 1.1 我该访问谁? 1.2 节点数量变化了怎么办? 2 算法原理 2.1 步骤
- 【另类见解】一致性哈希就能解决分库分表问题了?
" 开局一问:分库分表行为中,一致性哈希到底用处大不大? 装B脑图 现在是大数据的时代,其中一个体现就是数据量非常庞大.当然大数据的概念绝非是数据量就可以定义的,我自己给大数据下的定义是:无 ...
- 一致性哈希算法(用于解决服务器均衡问题)
tencent2012 笔试题附加题 问题描述: 例如手机朋友网有n个服务器,为了方便用户的访问会在服务器上缓存数据,因此用户每次访问的时候最好能保持同一台服务器.已有的做法是根据ServerIPI ...
- 先来先服务算法代码_一致性哈希算法编写
今天我想先给大家科普下一致性哈希算法这块,因为我下一篇文章关于缓存的高可用需要用到这个,但是又不能直接在里面写太多的代码以及关于一致性hash原理的解读,这样会失去对于缓存高可用的理解而且会造成文章很 ...
- 一致性哈希算法 mysql_一致性哈希算法,在分布式开发中你必须会写,来看完整代码...
今天我想先给大家科普下一致性哈希算法这块,因为我下一篇文章关于缓存的高可用需要用到这个,但是又不能直接在里面写太多的代码以及关于一致性hash原理的解读,这样会失去对于缓存高可用的理解而且会造成文章很 ...
- 一文读懂哈希和一致性哈希算法
哈希 Hash 算法介绍 哈希算法也叫散列算法, 不过英文单词都是 Hash, 简单一句话概括, 就是可以把任意长度的输入信息通过算法变换成固定长度的输出信息, 输出信息也就是哈希值, 通常哈希值的格 ...
- java 一致性hash算法 均衡分发_Dubbo一致性哈希负载均衡的源码和Bug,了解一下?...
本文是对于Dubbo负载均衡策略之一的一致性哈希负载均衡的详细分析.对源码逐行解读.根据实际运行结果,配以丰富的图片,可能是东半球讲一致性哈希算法在Dubbo中的实现最详细的文章了. 文中所示源码,没 ...
- 图解一致性哈希算法,看这文就够了!
作者 | LemonCoder 来源 | 后端技术学堂(ID:lemon10240) 很多同学应该都知道什么是哈希函数,在后端面试和开发中会遇到「一致性哈希」,那么什么是一致性哈希呢?名字听起来很厉害 ...
最新文章
- 查看磁盘空间,清理缓存
- 沃尔玛拟投入两千多万元加强食品安全自检
- 能量时域空间物理_5G新在哪儿(11)-下行公共物理控制信道
- mov sreg, r/m16 在16位和32位编程中的区别
- 怎样判断RadioButtonList控件是否有选择
- python 多进程 multiprocessing 进程池pool报错 in join assert self._state in (CLOSE, TERMINATE) AssertionError
- php 假多态,论PHP面向对象之-多态
- (转)代理模式(Proxy)
- qtscrcpy自定义按键_按键映射说明.md
- php检查运算是否错误,用PHP中的@运算符抑制错误
- Mybatis if 判断等于一个字符串
- python建模全步骤
- 增强 扫描王 源码_camscanner(扫描全能王)功能解析与复现 - 页面增强
- 2021-2-5BootStrap4.5中的blockquote标签
- 习题 6.14 编一个程序,将两个字符串s1和s2比较,若s1大于s2,输出一个正数;若s1等于s2, 输出0;若s1小于s2,输出一个负数。不要用strcmp函数。两个字符串用gets函数输入。
- matlab研究锂电池,基于MATLAB的锂电池健康状态建模实现
- 日常英语口语900句
- 英雄之舞—凌波微步(利用async.js编写异步动画)
- Android仿keep运动轨迹动画,Android仿Keep运动休息倒计时圆形控件
- 用python解决数学问题
热门文章
- 《OpenSSL3.0学习之一 加密库简介|CSDN创作打卡》
- 循环中 动态参数 传div 层_【转载】黄学杰等:铌元素在锂离子电池中的应用
- python里元组和列表的共同点和不同点_Python列表和元组的相同点和不同点是什么...
- 计算机专业考研可以转专业不,学术可以转专业吗考研
- linux安装.net core3.0,树莓派4安装net core3.0环境
- 如何预约升级鸿蒙,超过66万人预约,华为亮出真正王牌旗舰,支持优先升级鸿蒙系统...
- “重金求来”Alibaba技术官并发编程笔记,附Java面经
- 用BFS(广度优先搜索queuelist)算法解决农夫过河问题
- 计算机网络高分笔记视频,计算机网络高分笔记(整理).pdf
- 实验总结_小学科学实验室工作总结范文(直接复制下载)