`
imtinx
  • 浏览: 36162 次
  • 性别: Icon_minigender_1
  • 来自: 威海
社区版块
存档分类
最新评论

一致性哈希算法——constant hashing

 
阅读更多

 

    一致性哈希算法在1997年被提出,英文名叫constant hahsing,目前这种算法被广泛的应用到了cache系统中。

  cache系统中如何保证在添加或者较少节点服务器时尽可能减少数据的移动是一大挑战,这要求负责路由的hash算法具有很高的单调性。Constant hashing就是满足需求的算法之一。

  一般情况下,hash算法会将值映射到32位的数值空间,我们可以将这个空间想象成一个首尾相接的圆环,如下面那样。

 

假设我们有4个对象object1~object4,且他们的hash值在圆环上的分布情况如下图


Consistent hashing 的基本思想就是将cache服务器和存储对象使用相同的hash函数映射到同一个 圆环空间上 假设有ABC三台cache服务器,将他们的机器名或者IP地址作为输入值计算hash 将其也映射到圆环空间上,结果如下:


在这个圆环空间中,按照顺时针的方向,对象存储在离它最近的cache服务器上。比如object1存在cacheA中,object4存在cacheB中,object2object3存在cacheC中。

考虑假设cache B挂掉了,根据上面映射方法,只有cacheB上的数据需要移动,即object4移动到cacheC,其他的对象保持不变。  


  再考虑添加一台cache D的情况,假设cache D被映射在对象object2object3之间。这时受影响的将仅是那些沿 cache D 逆时针遍历直到下一个 cache之间的对象 。即将object2映射到cache D上。

 



         单调性解决了,但是可能会出现热点现象,即存储在各个cache服务器上的数据存在不平衡。为了解决这种情况,一致性哈希算法引入了“虚拟节点”的概念。虚拟节点( virtual node  是实际节点在圆环空间的复制品一个节点对应了若干个虚拟节点。如图,圆环上部署了cacheAcacheC两台服务器,出现了数据不平衡,为了保持平衡,我们引入两个虚拟节点,

此时,对象到“虚拟节点”的映射关系为: objec1->cache A2objec2->cache A1 objec3->cache C1 objec4->cache C2   因此对象object1object2 都被映射到了cache A上,而object3object4 映射到了 cache C 平衡性有了很大提高。

 


引入虚拟节点后,映射关系就从{  对象 ->节点 } 转换到了{  对象-> 虚拟节点  }  

 



下面是constant hashing的一个完整实现:

 

 

package algorithms;
import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;
public class ConsistentHash<T> {
    /**
     * 计算使用的hash函数,推荐使用MD5
     */
    private final HashFunction hashFunction;
    /**
     * 虚拟节点的倍数
     */
    private final int numberOfReplicas;
    /**
     * cache节点环
     */
    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);
        }
    }
    /**
     * @description    添加ceche服务器节点
     * @param node     服务器节点,可以用服务器的IP表示
     * @add date       2011-10-30
     */
    public void add(T node) {
        for (int i = 0; i < numberOfReplicas; i++) {
            circle.put(hashFunction.hash(node.toString() + i), node);
        }
    }
    /**
     * @description    删除服务器节点
     * @param node      服务器节点,可以用服务器的IP表示
     * @add date       2011-10-30
     */
    public void remove(T node) {
        for (int i = 0; i < numberOfReplicas; i++) {
            circle.remove(hashFunction.hash(node.toString() + i));
        }
    }
    /**
     * @description    获取对象对应的cache服务器
     * @param key       需要存储的对象
     * @return          目标cache服务器
     * @add date       2011-10-30
     */
    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);
    }
}
 

 

 

  • 大小: 2.1 KB
  • 大小: 7.4 KB
  • 大小: 11 KB
  • 大小: 11.1 KB
  • 大小: 11.4 KB
  • 大小: 11.6 KB
  • 大小: 12.8 KB
分享到:
评论

相关推荐

    一致性哈希算法(ketama hashing)

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

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

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

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

    一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它解决了在分布式环境中数据分片和负载均衡的问题。在传统的哈希算法中,如果增加或减少服务器节点,会导致大量数据重新分配,而一致性哈希...

    一致性哈希算法C版实现

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

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

    整体来看,文章介绍的改进一致性哈希算法,通过在分布式存储系统中对节点进行逻辑划分、引入主从模式以及分析不同读写策略的数据一致性,旨在提升系统的性能和可靠性。这对于推动分布式存储系统的进一步发展具有重要...

    一致性哈希算法 consistent hashing

    在分布式系统中,常常需要使用缓存,而且通常是集群,访问缓存和添加缓存都需要一个 hash 算法来寻找到合适的 Cache 节点。但,通常不是用取余hash,而是使用我们今天的主角—— 一致性 hash 算法。

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

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

    一致性哈希算法演示.rar

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

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

    【摘要】中的“高效扩展”和“分布式数据库”是本文的核心话题,研究的是如何利用一致性哈希算法在大数据时代高效地扩展分布式数据库。一致性哈希算法最初由Karger等人提出,目的是解决分布式缓存的问题,它弥补了...

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

    一致性哈希算法是一种在分布式系统中用于解决数据分发和负载均衡问题的算法。随着互联网技术的快速发展,分布式系统已经成为支撑大规模服务的关键技术之一。在分布式系统中,多个节点通过网络协同工作,提供高可用性...

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

    ### 一致性哈希算法及其在分布式系统中的应用 #### 摘要 一致性哈希算法是一种用于解决分布式系统中节点动态变化导致的数据重新分布问题的关键技术。它通过将哈希空间映射到一个循环的空间中,实现了数据节点的高效...

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

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

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

    一致性哈希算法由David Karger等人在1997年提出,它是一种特殊的哈希算法,主要用于分布式系统中实现负载均衡。与传统的哈希算法不同,一致性哈希算法在处理节点增减时,能够最小化重新分配数据的数量,从而提高系统...

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

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

    python 实现 一致性哈希算法

    一致性哈希算法

    白话解析:一致性哈希算法1

    白话解析:一致性哈希算法1 一致性哈希算法是解决分布式缓存问题的解决方案。缓存服务器数量的变化会引起缓存的雪崩,导致整体系统压力过大而崩溃。为了解决这个问题,一致性哈希算法诞生了。 在了解一致性哈希...

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

    一致性哈希算法(Consistent Hashing)是一种常用于分布式系统中的数据分片策略,它有效地解决了数据在多台服务器间均匀分布的问题,同时减少了因节点加入或离开时的数据迁移成本。 首先,一致性哈希的基本原理是将...

Global site tag (gtag.js) - Google Analytics