1. 程式人生 > >LintCode Consistent Hashing(一致性雜湊演算法)

LintCode Consistent Hashing(一致性雜湊演算法)

一般的資料庫進行horizontal shard的方法是指,把 id 對 資料庫伺服器總數 n 取模,然後來得到他在哪臺機器上。這種方法的缺點是,當資料繼續增加,我們需要增加資料庫伺服器,將 n 變為 n+1 時,幾乎所有的資料都要移動,這就造成了不 consistent。為了減少這種 naive 的 hash方法(%n) 帶來的缺陷,出現了一種新的hash演算法:一致性雜湊的演算法——Consistent Hashing。這種演算法有很多種實現方式,這裡我們來實現一種簡單的 Consistent Hashing。

  1. 將 id 對 360 取模,假如一開始有3臺機器,那麼讓3臺機器分別負責0~119, 120~239, 240~359 的三個部分。那麼模出來是多少,查一下在哪個區間,就去哪臺機器。
  2. 當機器從 n 臺變為 n+1 臺了以後,我們從n個區間中,找到最大的一個區間,然後一分為二,把一半給第n+1臺機器。
  3. 比如從3臺變4臺的時候,我們找到了第3個區間0~119是當前最大的一個區間,那麼我們把0~119分為0~59和60~119兩個部分。0~59仍然給第1臺機器,60~119給第4臺機器。
  4. 然後接著從4臺變5臺,我們找到最大的區間是第3個區間120~239,一分為二之後,變為 120~179, 180~239。

假設一開始所有的資料都在一臺機器上,請問加到第 n 臺機器的時候,區間的分佈情況和對應的機器編號分別是多少?

 Notice

你可以假設 n <= 360. 同時我們約定,當最大區間出現多個時,我們拆分編號較小的那臺機器。
比如0~119, 120~239區間的大小都是120,但是前一臺機器的編號是1,後一臺機器的編號是2, 所以我們拆分0~119這個區間。