`
s929498110
  • 浏览: 106890 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《有限分布算法》来了! 抛弃一致性哈希吧

阅读更多

声明

《有限分布算法》由本文作者原创,知识产权为本文作者所有。该算法可以用于个人研究,以及其他非商业性或非盈利性用途,但同时您应该遵守著作权法以及其他相关法律的规定,不得侵犯本文作者的合法权益。

 

算法简介

该算法使用时首先需要限定集群中节点的最大数量MAX,接下来我用一个简单的例子来描述这个算法的原理。假设集群中最多有10个节点,集群中现在有一个文件test.log,那么test.log就在集群中按如下规则分布:

 

1. 根据文件名字符串获取哈希码:hash(test.log)=-1147914264
2. 使用哈希码作为SEED获取0-10(MAX)之间的随机序列:[9, 5, 7, 8, 3, 1, 0, 6, 2, 4]
3. test.log沿着这个随机序列寻找它自己的分布位置——若9离线,则分布于5,若95离线,则分布于7。
4. 当9再次上线后,test.log副本可以根据需要从57移动回节点9中。
5. 出于性能角度的考虑,随机序列中的随机数并不需要一次性全部获取。

 

《有限分布算法》相对于“一致性哈希”而言,它显然可以在数据的均衡分布上表现的更好。由于所有数据都基于不同的随机数种子随机分布在集群中,因此它可以在理论上实现系统负载的完全均衡,而集群状态发生改变时,它也仅需要处理受到影响的那一部分数据副本。

 

《有限分布算法》的性能表现也优于“一致性哈希”,其中原理不再赘述,下文中的测试数据可以证明有限分布算法的性能优势。

 

测试数据

参与测试的“一致性哈希”实现代码如下所示:

package com.limited;
import java.util.Collection;
import java.util.Random;
import java.util.SortedMap;
import java.util.TreeMap;

/**
 * 一致性哈希
 * @author sulin
 * @date 2013-7-30
 * @version 0.1
 */
public class ConsistentHash{

	private final int numberOfReplicas;
	private final SortedMap<Integer, String> circle = new TreeMap<Integer, String>();

	public ConsistentHash(int numberOfReplicas, Collection<String> nodes) {
		this.numberOfReplicas = numberOfReplicas;
		for (String node : nodes) {
			add(node);
		}
	}

	public void add(String node) {
		Random r = new Random(node.hashCode());
		for (int i = 0; i < numberOfReplicas; i++) {
			/**
			 * 我最初使用的是:	(node+"#"+i).hashCode();
			 * 这种方式但它的效果很差。
			 */
			/**
			 * 第二种选择是:整数区块平均切分:
			 * hashcode + (Integer.MAX_VALUE/numberOfReplicas) * 2
			 * 这种方式的效果也很差。
			 */
			int key = r.nextInt();
			circle.put(key, node);
		}
	}

	public void remove(String node) {
		Random r = new Random(node.hashCode());
		for (int i = 0; i < numberOfReplicas; i++) {
			int key = r.nextInt();
			circle.remove(key);
		}
	}

	public String get(Object key) {
		if (circle.isEmpty()) {
			return null;
		}
		int hash = key.hashCode();
		if (!circle.containsKey(hash)) {
			SortedMap<Integer, String> tailMap = circle.tailMap(hash);
			hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
		}
		return circle.get(hash);
	}

}

 

测试数据分别为:数据分布图、节点宕机后数据流动量、计算分布时间。

测试条件为:1000000个随机文件、20个节点(每个物理节点映射为分散的20个虚拟节点)。

 

《一致性哈希》数据分布图(10.10.1.0宕机前、10.10.1.0宕机后)

 

算法执行时间:631-639毫秒

 

10.10.1.0宕机后数据移动量:55324(=该节点原分布数据量)

 

---------------------------------------分割线---------------------------------

参与测试的“有限分布算法”实现如下:

package com.limited;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * 有限分布算法
 * @author sulin
 * @date 2013-7-30
 * @version 0.1
 */
public class LimitedDistribute {

	/**
	 * 节点名:是否在线
	 */
	private final Map<String, Boolean> nodes;
	
	private final String[] nodeArray;
	
	public LimitedDistribute(Collection<String> nodes) {
		this.nodes = new HashMap<String, Boolean>();
		for(String node : nodes)
			this.nodes.put(node, true);
		
		nodeArray = nodes.toArray(new String[]{});
	}
	
	public void online(String node){
		if(nodes.containsKey(node))
			nodes.put(node, true);
	}
	
	public void outline(String node){
		if(nodes.containsKey(node))
			nodes.put(node, false);
	}
	
	public String get(Object key) {
		if (nodes.isEmpty()) {
			return null;
		}
		Random r = new Random(key.hashCode());
		String result = null;
		while(result == null){
			int i = r.nextInt(nodes.size());
			if(nodes.get(nodeArray[i]))
				result = nodeArray[i];
		}
		
		return result;
	}
	
}

 

测试数据分别为:数据分布图、节点宕机后数据流动量、计算分布时间。

 

测试条件为:1000000个随机文件、20个节点(每个物理节点映射为分散的20个虚拟节点)。

 

《有限分布算法》数据分布图(10.10.1.0宕机前、10.10.1.0宕机后)

 

算法执行时间:401-405毫秒

 

10.10.1.0宕机后数据移动量:49917(=该节点原分布数据量)

 

总结

根据测试数据我们可以很清晰的看到,一致性哈希的数据分布是非常不规则的,而有限分布算法的数据分布极其平均的。同时“一致性哈希”的计算性能与《有限分布算法》相比,降低了几乎50%,当然这也可能是笔者的算法实现不够完善所导致的。笔者会将全部源码以附件形式给出,如果你感兴趣的话可以下载源码自己尝试一下。

 

如果我们把《一致性哈希》所使用的“虚拟节点数量”增到至200、2000,这种分布的不规则性会在一定程度的得到抑制,但它永远也无法达到《有限分布算法》这样近乎完全平均分布的状态,并且“虚拟节点数量”的增加会进一步拉开《有限分布算法》与它之间的性能差距。总而言之一致性哈希的不规则分布是由该算法本身缺陷所导致的,即便技术非常精湛的工程师也无法弥补这个缺陷。如果你正在使用一致性哈希,现在你是否考虑抛弃它呢?

 

本文的讲解比较粗糙,这是因为《有限分布算法》只是笔者研究“分布式文件系统”时的副产品,具体详情会在下一篇博文中介绍。需要提前告知的是,笔者下一篇博文的挑战目标是现在名声大噪的HDFS,敬请期待。

 

作者:苏林

邮箱:sulinixl@gmail.com

 

转载请注明出处:http://sulin.iteye.com/blog/1915431

  • 大小: 5.1 KB
  • 大小: 4.5 KB
分享到:
评论
3 楼 s929498110 2014-06-20  
lliiqiang 写道
既然是算法一定是有限功能,不可能完成无限局限,你都挑出它不能做的事情.只是你本身也限制了.当然算法自身就是能够实现功能的


哈,产权什么的只是一个声明,防君子不防小人。

这个算法有一定的局限性,因此我才命名它为“有限分布算法”,或许将来有一天我能想出来一种“无限分布算法”。

路漫漫其修远兮,吾将上下而求索。
2 楼 lliiqiang 2014-06-19  
其实不存在什么知识产权的事情,因为都是人可以做的.只是说甚至对于外星人做法判断,简单却有效.
1 楼 lliiqiang 2014-06-19  
既然是算法一定是有限功能,不可能完成无限局限,你都挑出它不能做的事情.只是你本身也限制了.当然算法自身就是能够实现功能的

相关推荐

    一致性哈希算法C版实现

    一致性哈希算法是一种在分布式系统中解决数据分片和负载均衡问题的算法,它主要解决了在动态添加或移除节点时,尽可能少地改变已经存在的数据分布。在云计算和大数据处理领域,一致性哈希被广泛应用,例如在分布式...

    基于C# 实现的一致性哈希算法

    一致性哈希算法是一种分布式哈希...总的来说,基于C#实现一致性哈希算法是一项涉及哈希函数、节点分布策略以及冲突解决机制的复杂任务。通过理解和实现这一算法,开发者可以构建更加稳定和高效的分布式系统。

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

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

    一致性哈希算法演示.rar

    一致性哈希算法是一种分布式哈希表(DHT)中用于解决数据分片和负载均衡问题的算法。在大型分布式系统中,例如缓存系统、分布式数据库等,一致性哈希能够确保当节点加入或离开时,尽可能少的数据需要迁移,从而保持...

    基于一致性哈希算法的分布式数据库高效扩展方法.pdf

    一致性哈希算法最初由麻省理工学院的K等人提出,并被广泛应用于分布式系统中,以解决节点动态变化时数据一致性问题。其核心思想是通过引入哈希环,将数据对象均匀分布在哈希环上的不同节点中,以此降低节点变更对...

    分布式存储系统中改进的一致性哈希算法.pdf

    然而,一致性哈希算法也存在一些问题,比如在节点数量较少时,节点间的数据分布可能不均匀,这会导致某些节点成为瓶颈。 针对一致性哈希算法存在的问题,文中提出了改进方案。该方案主要从以下几个方面进行改进:...

    Mycat一致性哈希分片算法1

    * 高效的数据分布:Mycat的一致性哈希分片算法可以将数据分布式存储在多个数据库节点中,提高数据存取效率和系统可扩展性。 * 轻松的维护和管理:Mycat的一致性哈希分片算法可以轻松地添加或删除数据库节点,简化了...

    一致性哈希算法在分布式系统中的应用.pdf

    一致性哈希算法就是为了解决这种系统中的数据分布和路由问题,它具有高效、稳定和可扩展的特点。 一致性哈希算法的基本思想是在哈希空间中将数据和服务器映射到相同的范围内。传统的哈希算法可能会导致数据集中在...

    基于一致性哈希算法的分布式数据库高效扩展方法研究.pdf

    在P2P环境中,一致性哈希还利用分布式哈希表(DHT)的优势,进一步优化了数据的分布和检索效率。 分布式数据库的特点在于逻辑上的统一与物理上的分散。在实际应用中,随着业务需求的增加,数据库节点可能需要动态...

    Mycat一致性哈希分片算法.zip

    总结,Mycat的一致性哈希分片算法是实现高效分布式数据库的关键技术,它通过独特的哈希策略保证了数据的均衡分布和系统的弹性扩展。理解和掌握这一算法,对于构建高性能、可扩展的分布式系统具有重要意义。在实际...

    一致性哈希算法及其在分布式系统中的应用

    一致性哈希算法是一种用于解决分布式系统中节点动态变化导致的数据重新分布问题的关键技术。它通过将哈希空间映射到一个循环的空间中,实现了数据节点的高效定位,并有效减少了节点加入或离开系统时引起的数据迁移量...

    带虚拟节点的一致性哈希

    一致性哈希(Consistent Hashing)是一种分布式哈希算法,主要应用于分布式缓存、负载均衡等领域,例如Memcached和Redis等系统。它解决了在分布式环境中数据分片与节点动态增减时,尽量减少数据迁移的问题。带虚拟...

    一致性哈希算法应用及优化(最简洁明了的教程)

    一致性哈希算法应用及优化是IT领域中分布式系统设计的核心技术之一,特别是在处理大规模数据分布与缓存系统中,其重要性不言而喻。本文将深入探讨一致性哈希算法的基本概念、工作原理以及在实际场景中的应用和优化...

    python 实现 一致性哈希算法

    一致性哈希算法

    一致性哈希与Chord1

    【一致性哈希与Chord1】是一篇关于分布式哈希算法的文章,主要讨论了一致性哈希和普通哈希的区别,以及如何通过引入虚拟节点来优化一致性哈希的分布问题。 1. **普通哈希算法**: - Java中的`HashMap`类是一个典型...

    一致性哈希(php版)

    一致性哈希算法的php版,希望能帮到phper了解一致性哈希

    分布式存储系统中一致性哈希算法的研究.pdf

    与传统的哈希算法不同,一致性哈希算法在处理节点增减时,能够最小化重新分配数据的数量,从而提高系统的稳定性与扩展性。 简单哈希算法是一种基础的、直接的哈希计算方式,通过计算数据对象的哈希值,再对存储节点...

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

    一致性哈希算法(Consistent Hashing)是一种在分布式系统中平衡数据分布的策略,尤其适用于缓存服务如Memcached或Redis。它的核心思想是通过哈希函数将对象映射到一个固定大小的环形空间中,然后将服务器也映射到这个...

    一致性哈希算法(ketama hashing)

    一致性哈希算法(Consistent Hashing)是一种在分布式系统中实现负载均衡的算法,尤其在分布式缓存如Memcached和Redis等场景下广泛使用。它解决了传统哈希算法在节点增减时导致的大量数据迁移问题,提高了系统的可用...

Global site tag (gtag.js) - Google Analytics