一致性雜湊演算法與Java實現

來源:互聯網
上載者:User

標籤:

 一致性雜湊演算法是分布式系統中常用的演算法。比如,一個分布式的儲存系統,要將資料存放區到具體的節點上,如果採用普通的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 plaincopyprint?
  1. public class Shard<S> { // S類封裝了機器節點的資訊 ,如name、password、ip、port等   
  2.   
  3.     private TreeMap<Long, S> nodes; // 虛擬節點   
  4.     private List<S> shards; // 真實機器節點   
  5.     private final int NODE_NUM = 100; // 每個機器節點關聯的虛擬節點個數   
  6.   
  7.     public Shard(List<S> shards) {  
  8.         super();  
  9.         this.shards = shards;  
  10.         init();  
  11.     }  
  12.   
  13.     private void init() { // 初始化一致性hash環   
  14.         nodes = new TreeMap<Long, S>();  
  15.         for (int i = 0; i != shards.size(); ++i) { // 每個真實機器節點都需要關聯虛擬節點   
  16.             final S shardInfo = shards.get(i);  
  17.   
  18.             for (int n = 0; n < NODE_NUM; n++)  
  19.                 // 一個真實機器節點關聯NODE_NUM個虛擬節點   
  20.                 nodes.put(hash("SHARD-" + i + "-NODE-" + n), shardInfo);  
  21.   
  22.         }  
  23.     }  
  24.   
  25.     public S getShardInfo(String key) {  
  26.         SortedMap<Long, S> tail = nodes.tailMap(hash(key)); // 沿環的順時針找到一個虛擬節點   
  27.         if (tail.size() == 0) {  
  28.             return nodes.get(nodes.firstKey());  
  29.         }  
  30.         return tail.get(tail.firstKey()); // 返回該虛擬節點對應的真實機器節點的資訊   
  31.     }  
  32.   
  33.     /** 
  34.      *  MurMurHash演算法,是非加密HASH演算法,效能很高, 
  35.      *  比傳統的CRC32,MD5,SHA-1(這兩個演算法都是加密HASH演算法,複雜度本身就很高,帶來的效能上的損害也不可避免) 
  36.      *  等HASH演算法要快很多,而且據說這個演算法的碰撞率很低. 
  37.      *  http://murmurhash.googlepages.com/ 
  38.      */  
  39.     private Long hash(String key) {  
  40.           
  41.         ByteBuffer buf = ByteBuffer.wrap(key.getBytes());  
  42.         int seed = 0x1234ABCD;  
  43.           
  44.         ByteOrder byteOrder = buf.order();  
  45.         buf.order(ByteOrder.LITTLE_ENDIAN);  
  46.   
  47.         long m = 0xc6a4a7935bd1e995L;  
  48.         int r = 47;  
  49.   
  50.         long h = seed ^ (buf.remaining() * m);  
  51.   
  52.         long k;  
  53.         while (buf.remaining() >= 8) {  
  54.             k = buf.getLong();  
  55.   
  56.             k *= m;  
  57.             k ^= k >>> r;  
  58.             k *= m;  
  59.   
  60.             h ^= k;  
  61.             h *= m;  
  62.         }  
  63.   
  64.         if (buf.remaining() > 0) {  
  65.             ByteBuffer finish = ByteBuffer.allocate(8).order(  
  66.                     ByteOrder.LITTLE_ENDIAN);  
  67.             // for big-endian version, do this first:   
  68.             // finish.position(8-buf.remaining());   
  69.             finish.put(buf).rewind();  
  70.             h ^= finish.getLong();  
  71.             h *= m;  
  72.         }  
  73.   
  74.         h ^= h >>> r;  
  75.         h *= m;  
  76.         h ^= h >>> r;  
  77.   
  78.         buf.order(byteOrder);  
  79.         return h;  
  80.     }  
  81.   
  82. }  

一致性雜湊演算法與Java實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.