码迷,mamicode.com
首页 > 其他好文 > 详细

一致性哈希

时间:2015-06-24 21:10:01      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:一致性哈希

由于以前面试的老是被问到一致性hash的问题。今天看了一些文章,算是对这个问题的一些学习。
1.一致性哈希(consistent hash)简介
一致性哈希(consistent hash)是一种分布式算法,常用于负载均衡。通常常用的负载均衡的算法有:轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(Weighted )等
典型的应用场景是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上,每台机器负责1/N的服务,但增加和减少服务器数量,能够最小影响数据在服务器之间的迁移。
2.算法的描述
百度一下,即可得到!
技术分享
3.算法实现(java)

 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);
 }

}   

上面这个java语言的实现。根据上面的代码实现,采用TreeMap的数据结构保存结点的内容。在初始化的时候,把节点的hash和节点地址保存在TreeMap里,client查找时,根据key的hash值去treeMap得到自己应该查询的节点,往下查找比自己hash值大的,如果有则得到结果返回。如果没有,则回到treeMap的头,取第一个返回结果。
根据key计算出hash,去treeMap查找比key哈希大的那部分,取出第一个值就是结果。如果没有别key哈希大的部分,则取treeMap的第一个值。
技术分享

虚拟结点的算法:
“虚拟节点”的hash计算可以采用对应节点的IP地址加数字后缀的方式。例如假设NODE1的IP地址为192.168.1.100。引入“虚拟节点”前,计算 cache A 的 hash 值:
Hash(“192.168.1.100”);
引入“虚拟节点”后,计算“虚拟节”点NODE1-1和NODE1-2的hash值:
Hash(“192.168.1.100#1”); // NODE1-1
Hash(“192.168.1.100#2”); // NODE1-2
4.总结。
其实说白了,一致性哈希(consistent hash)只是负载均衡中的一种路由算法。

一致性哈希

标签:一致性哈希

原文地址:http://blog.csdn.net/figthinbeijing/article/details/46551033

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!