`
lvyanglin
  • 浏览: 86409 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一致性hash算法实现技巧

    博客分类:
  • java
阅读更多
在分布式缓存或者存储系统中经常都会用到hash算法,最早的时候memeched开源客户端都用的简单取余的hash算法来做分布式缓存集群中的命中要缓存的机器,一致性hash算法的原理在这里就不用描述了网上很多资料,下面的图来回忆下原理。简单的说就是把所有的机器结点投放到0-2^32-1结点圆环上去。再对key做哈希运算找到环上的结点存储。因为把有限几个阶段分布到2^32个几点上去需要均匀命中,会在实际几点中间虚拟很多结点。n1和n2之间的虚拟结点命中之后,会在n2上存储。


最近看了下jedis里面对这个功能的实现,是有些变通的做法来实现,下满的方法initialize
参数是实际结点列表,nodes = new TreeMap<Long, S>();为hash圆环,每个结点通过hash之后都散落在nodes上,客户端端取实际要使用的结点是通过nodes.tailMap(algo.hash(key));取环上顺时针比当前key大的结点map,在通过 tail.get(tail.firstKey());取这个map上第一个key所在虚拟结点上的值,这个虚拟结点与顺时针第一个相邻的结点实际连接主机是一样。

下面这个算法是讲key 先md5然后取hash

private void initialize(List<S> shards) {
	nodes = new TreeMap<Long, S>();

	for (int i = 0; i != shards.size(); ++i) {
	    final S shardInfo = shards.get(i);
	    if (shardInfo.getName() == null)
		for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
		    nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n),
			    shardInfo);
		}
	    else
		for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
		    nodes.put(
			    this.algo.hash(shardInfo.getName() + "*"
				    + shardInfo.getWeight() + n), shardInfo);
		}
	    resources.put(shardInfo, shardInfo.createResource());
	}
    }

    public R getShard(byte[] key) {
	return resources.get(getShardInfo(key));
    }

    public R getShard(String key) {
	return resources.get(getShardInfo(key));
    }

    public S getShardInfo(byte[] key) {
	SortedMap<Long, S> tail = nodes.tailMap(algo.hash(key));
	if (tail.isEmpty()) {
	    return nodes.get(nodes.firstKey());
	}
	return tail.get(tail.firstKey());
    }



通过算法看和我们在文章上看的hash算法还是有点变通,文章中图上实际节点和虚拟几点都会是连续,程序算法中,虚拟结点是随机(作了md5)分布到环上的实际对应的主机是一个主机。因为同一个虚拟结点随机分布在环上,取主机的时候只要取比hash(md5(key))大的结点上第一个结点对应的主机就可以,并不关心是node1 还是node2...
  • 大小: 38.7 KB
分享到:
评论

相关推荐

    一致性哈希算法源码 Ketama一致性hash算法源码

    一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,旨在解决在分布式环境中数据分布不均匀的问题。Ketama算法是基于一致性哈希的一种优化实现,由Last.fm公司的Simon Willison提出,其目标是在...

    C++实现一致性hash算法

    一致性hash应用于负载均衡算法,本实现由C++语言开发。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance)2、单调性(Monotonicity) 3、分散性(Spread)4、负载(Load)

    一致性Hash算法的原理及实现

    ### 一致性Hash算法的原理及实现 #### 一、引言 一致性Hash算法是一种用于解决分布式环境下数据存储和检索问题的重要技术。它最初由David Karger等人在1997年的论文《Consistent Hashing and Random Trees: ...

    一致性hash算法简介加C++实现

    一致性hash算法简介加C++实现

    一致性hashjava实现

    - 插入、删除节点以及查找键对应节点的算法实现。 6. **应用场景**:一致性哈希在分布式缓存系统如Memcached和Redis中被广泛使用,同时在CDN(Content Delivery Network)、负载均衡器等场景也有应用。 7. **优缺点...

    一致性Hash简单实现

    一致性哈希(Consistent Hashing)是一种分布式哈希表(DHT)的算法,它主要应用于分布式缓存、负载均衡等场景,旨在解决在动态扩展或收缩系统规模时,尽量减少数据迁移的问题。在这个简单的实现中,我们将探讨如何...

    C/C++ 一致性hash算法

    一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它在处理大量数据分布到多个节点上时,能保持较好的均衡性和可扩展性。在C/C++编程中,一致性哈希通常用于构建分布式系统,如负载均衡、缓存...

    Ketama一致性Hash算法(含Java代码) 1

    Ketama一致性哈希算法是基于一致性哈希的一种优化实现,主要解决了传统一致性哈希中节点分布不均匀的问题。在Ketama中,每个实际的物理服务器会被映射到多个虚拟节点,通常是100到200个,这些虚拟节点均匀分布在环上...

    一致性哈希算法C版实现

    一致性哈希算法是一种在分布式系统中解决数据分片和负载均衡问题的算法,它主要解决了在动态添加或移除节点时,...总之,一致性哈希算法是分布式计算中的一个重要工具,通过巧妙的设计实现了高效的数据分布和动态扩展。

    一致性hash算法简介.pdf

    一致性hash算法简介

    解决分布式数据插入数据库~一致性hash算法

    为了解决这个问题,可以采用跳数法(Jump Consistent Hash)或者更高级的一致性哈希变体,如Ketama或libketama。哈希冲突则可以通过开放寻址、链地址法等方法来解决。 此外,一致性哈希算法在分布式缓存如Memcached...

    对一致性Hash算法,Java代码实现的深入研究1

    对于Java实现一致性Hash算法,有几种可能的方法: 1. **排序+List**:首先,将所有服务器节点的哈希值放入一个数组,然后使用排序算法(如归并排序、快速排序等)对数组进行排序,再将排序后的结果放入List中。之后...

    一致性hash算法1

    一致性哈希算法(Consistent Hashing)是一种特殊的哈希算法,设计目的是为了在分布式缓存系统中解决节点动态增减时导致的数据分布不均问题。该算法最早在1997年的论文《Consistent Hashing and Random Trees》中被...

    一致性Hash算法1

    一致性哈希算法(Consistent Hashing)是一种特殊的哈希算法,设计目的是为了在分布式缓存系统中解决节点动态增减时导致的键值映射大量变更的问题。它最早在1997年的论文《Consistent hashing and random trees》中被...

    PHP实现的一致性Hash算法详解【分布式算法】

    主要介绍了PHP实现的一致性Hash算法,结合实例形式详细分析了php一致性Hash算法的概念、原理及相关实现与使用技巧,需要的朋友可以参考下

    一致性hash算法(c++)

    总结来说,一致性哈希算法是解决分布式环境中数据分布问题的关键技术,C++实现的一致性哈希库简化了开发人员在项目中应用该算法的过程。通过理解其原理和库的使用方法,我们可以构建更稳定、高效的分布式系统。

Global site tag (gtag.js) - Google Analytics