1. 程式人生 > >FastDHT-高效分散式Hash系統

FastDHT-高效分散式Hash系統

FastDHT是一個基於鍵值對(Key Value Pair)的高效的分散式Hash系統,她可以用來儲存大量的Key Value Pair,比如可以用來儲存檔名對映表、session資料、使用者相關資料等等。

FastDHT伺服器端底層儲存採用Berkeley DB,支援大資料量;網路IO採用libevent,支援大併發連線。FastDHT只用到了BDB最基本的儲存功能,資料同步是自己實現的,採用了binlog的複製方式。



FastDHT叢集由一個或多個組(group)組成,每個組由一臺或多臺伺服器組成,同組伺服器上儲存的資料是相同的,資料同步只在同組的伺服器之間進行。組內各個伺服器是對等的,對資料進行存取時,可以根據key的hash值來決定使用哪臺伺服器。資料同步採用推(Push)的方式,由源伺服器主動將資料同步到本組的其他伺服器。

由客戶端決定應該選擇哪臺伺服器,為例避免查表,應該根據key的hash code來選擇伺服器,演算法描述如下:
  1. 計算出key的hash值(hash_code)
  2. group_index = hash_code % group_count
  3. new_hash_code = hash_code高16位和低16位互換
  4. server_index = new_hash_code % 組內server_count
計算server_index和group_index時使用了不同的hash code,是因為如果group_count和組內server_count相等,例如都等於2,那麼對於一個組來說,任何key值都將選中其中一臺固定的伺服器(server_index == group_index)。

FastDHT中,key由三部分組成:namespace、object ID和key name。這個設計和資料庫的層級劃分相似:namespace對應database,object Id對應table,而key對應欄位。引入namespace的目的是解決多個使用者(如:應用或產品)之間可能存在的資料衝突問題;引入object Id是便於對object相關的資料(如使用者資料)進行組織和管理,以提高整體效能。引入namespace和object ID使得系統具有更大的靈活性,在實際使用中,這兩個欄位可以設定為空值。在計算key的hash code時,如果namespace和object ID不為空,將這二者合併起來作為hash函式的輸入;否則將key作為hash函式的輸入。

系統擴容時,為了避免重新進行hash分佈(rehash),FastDHT引入了邏輯分組的概念。一個物理分組對應一組伺服器,一組伺服器(物理分組)上可以有多個邏輯分組。FastDHT的一個服務程序支援多個邏輯分組,每個組對應一個BDB的資料檔案。這樣的設計為以後的擴容提供了便利。在初期估算出今後需要的大致分組數目(邏輯分組數),然後將邏輯分組對應到物理分組中。擴容時,將一個或多個邏輯分組遷移到新增的物理分組上,只需要拷貝對應的BDB資料檔案,並修改相應的配置檔案,重啟伺服器端和客戶端程式即可。

FastDHT支援超時(timeout),每個key都有超時屬性。這樣可以使用FastDHT來儲存session資料,比傳統的資料庫儲存方案更加高效和簡潔。

附:
google code地址:http://code.google.com/p/fastdht/
原始碼下載地址:http://code.google.com/p/fastdht/downloads/list