FastDHT 高效分布式Hash系統

2021-08-27 13:02:14 字數 1564 閱讀 6131

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資料,比傳統的資料庫儲存方案更加高效和簡潔。

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...

分布式 分布式事務

是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...

分布式之分布式事務

被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...