摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071

一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。

因此,引入了一致性哈希算法:

把数据用hash函数(如MD5),映射到一个很大的空间里,如图所示。数据的存储时,先得到一个hash值,对应到这个环中的每个位置,如k1对应到了图中所示的位置,然后沿顺时针找到一个机器节点B,将k1存储到B这个节点中。

如果B节点宕机了,则B上的数据就会落到C节点上,如下图所示:

这样,只会影响C节点,对其他的节点A,D的数据不会造成影响。然而,这又会造成一个“雪崩”的情况,即C节点由于承担了B节点的数据,所以C节点的负载会变高,C节点很容易也宕机,这样依次下去,这样造成整个集群都挂了。

为此,引入了“虚拟节点”的概念:即把想象在这个环上有很多“虚拟节点”,数据的存储是沿着环的顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点,如下图所使用:

图中的A1、A2、B1、B2、C1、C2、D1、D2都是虚拟节点,机器A负载存储A1、A2的数据,机器B负载存储B1、B2的数据,机器C负载存储C1、C2的数据。由于这些虚拟节点数量很多,均匀分布,因此不会造成“雪崩”现象。

Java实现:

[java] view plaincopy
  1. public class Shard<S> { // S类封装了机器节点的信息 ,如name、password、ip、port等
  2. private TreeMap<Long, S> nodes; // 虚拟节点
  3. private List<S> shards; // 真实机器节点
  4. private final int NODE_NUM = 100; // 每个机器节点关联的虚拟节点个数
  5. public Shard(List<S> shards) {
  6. super();
  7. this.shards = shards;
  8. init();
  9. }
  10. private void init() { // 初始化一致性hash环
  11. nodes = new TreeMap<Long, S>();
  12. for (int i = 0; i != shards.size(); ++i) { // 每个真实机器节点都需要关联虚拟节点
  13. final S shardInfo = shards.get(i);
  14. for (int n = 0; n < NODE_NUM; n++)
  15. // 一个真实机器节点关联NODE_NUM个虚拟节点
  16. nodes.put(hash("SHARD-" + i + "-NODE-" + n), shardInfo);
  17. }
  18. }
  19. public S getShardInfo(String key) {
  20. SortedMap<Long, S> tail = nodes.tailMap(hash(key)); // 沿环的顺时针找到一个虚拟节点
  21. if (tail.size() == 0) {
  22. return nodes.get(nodes.firstKey());
  23. }
  24. return tail.get(tail.firstKey()); // 返回该虚拟节点对应的真实机器节点的信息
  25. }
  26. /**
  27. *  MurMurHash算法,是非加密HASH算法,性能很高,
  28. *  比传统的CRC32,MD5,SHA-1(这两个算法都是加密HASH算法,复杂度本身就很高,带来的性能上的损害也不可避免)
  29. *  等HASH算法要快很多,而且据说这个算法的碰撞率很低.
  30. *  http://murmurhash.googlepages.com/
  31. */
  32. private Long hash(String key) {
  33. ByteBuffer buf = ByteBuffer.wrap(key.getBytes());
  34. int seed = 0x1234ABCD;
  35. ByteOrder byteOrder = buf.order();
  36. buf.order(ByteOrder.LITTLE_ENDIAN);
  37. long m = 0xc6a4a7935bd1e995L;
  38. int r = 47;
  39. long h = seed ^ (buf.remaining() * m);
  40. long k;
  41. while (buf.remaining() >= 8) {
  42. k = buf.getLong();
  43. k *= m;
  44. k ^= k >>> r;
  45. k *= m;
  46. h ^= k;
  47. h *= m;
  48. }
  49. if (buf.remaining() > 0) {
  50. ByteBuffer finish = ByteBuffer.allocate(8).order(
  51. ByteOrder.LITTLE_ENDIAN);
  52. // for big-endian version, do this first:
  53. // finish.position(8-buf.remaining());
  54. finish.put(buf).rewind();
  55. h ^= finish.getLong();
  56. h *= m;
  57. }
  58. h ^= h >>> r;
  59. h *= m;
  60. h ^= h >>> r;
  61. buf.order(byteOrder);
  62. return h;
  63. }
  64. }

Java_一致性哈希算法与Java实现相关推荐

  1. 一致性哈希算法与Java实现

    来源:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  2. java murmurhash实现_一致性哈希算法与Java实现

    一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数 ...

  3. java 一致性hash算法 均衡分发_负载均衡-基础-一致性哈希算法及java实现

    1 /** 2 * 一致性hash 的java 实现3 *@authorluoqiang4 * @data 2016/11/085 */ 6 public classConsistencyHash { ...

  4. 一文搞懂负载均衡中的一致性哈希算法

    一致性哈希算法在很多领域有应用,例如分布式缓存领域的 MemCache,Redis,负载均衡领域的 Nginx,各类 RPC 框架.不同领域场景不同,需要顾及的因素也有所差异,本文主要讨论在负载均衡中 ...

  5. java 取绝对值_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性

    实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它.下面我们尝试一下自己实现一致性哈希算法. 一. 简述一致性哈希算法 这里不详 ...

  6. 一致性哈希算法学习及JAVA代码实现分析

    1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...

  7. java一致性hash api_一致性哈希算法学习及JAVA代码实现分析

    戳上面的蓝字关注我们哦! 本文作者:hapjin 欢迎点击下方阅读原文 1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式 ...

  8. 【重难点】【Java基础 01】一致性哈希算法、sleep() 和wait() 的区别、强软弱虚引用

    [重难点][Java基础 01]一致性哈希算法.sleep() 和wait() 的区别.强软弱虚引用 文章目录 [重难点][Java基础 01]一致性哈希算法.sleep() 和wait() 的区别. ...

  9. 一致性哈希算法原理、避免数据热点方法及Java实现

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  10. 哈希分布与一致性哈希算法简介

    前言 在我们的日常web应用开发当中memcached可以算作是当今的标准开发配置了.相信memcache的基本原理大家也都了解过了,memcache虽然是分布式的应用服务,但分布的原则是由clien ...

最新文章

  1. 匹兹堡计算机科学公司,2017美国匹兹堡大学计算机科学CS专业硕士录取
  2. 怎么去控制浏览器对资源文件的处理行为
  3. UC,qq浏览器强制横屏
  4. Linux Kernel 3.8.8/3.4.41/3.0.74 发布
  5. PostgreSQL adminpack扩展的作用
  6. 切换oracle用户impdp,Oracle 12c pdb使用expdp/impdp导入导出
  7. 驱动api_消费者驱动契约已死?
  8. 假如你心中有个莎乐美
  9. 如何让你的手机比别人最先升级到 Android L
  10. OpenGL学习笔记:第一个OpenGL程序完全注释
  11. elasticsearch-1.7.1 集群搭建
  12. 怎样设置电脑壁纸_谷歌地球实时壁纸,电脑和手机实现方案都在这里了
  13. OpenCV实践之车流量统计(C++)
  14. 用ansi语法美化你的winrar和win启动界面 【 抄袭至互联网 作者不明】
  15. python因子分析_python中的因子分析简介
  16. 京东商品详情数据接口(APP端,H5端),监控京东商品历史价格及价格走势,接口代码对接教程
  17. 【Hive】如何在 Hive 中创建外部表映射 Hbase 中已存在的表
  18. 【转】委外加工的核算流程
  19. sampler采样器记录
  20. 利用Cookie显示上次登录时间

热门文章

  1. UICollectionViewCell 所遇到的问题
  2. 解决微信小程序要求TLS版本不低于1.2问题
  3. 内存管理之直接内存管理
  4. js 为对象添加和删除属性
  5. 简单的 socket 代码
  6. checkbox:全选、全不选、单选(慕课网题目)
  7. linux 9 -- 交互式使用Bash Shell
  8. chrome下使用JS检测浏览器是否使用开发者工具
  9. 【前台技术】-播放音频
  10. CodeForces Round #295 Div.2