如何用PHP實現分布演算法之一致性雜湊演算法

2022-09-28 06:48:10 字數 1520 閱讀 9644

對於伺服器分布,我們要考慮的東西有如下三點:資料平均分布,查詢定位準確,降低宕機影響。

傳統演算法一般是將資料的鍵用演算法對映出數字,對其用伺服器數量取模,並根據結果選擇要儲存的伺服器。其能達到資料平均分布和查詢定位準確的要求,並且優點是演算法簡單,訪問時的計算量都比較小(在資料非常大時才會明顯)。

但其有乙個致命缺點,即乙個伺服器宕機後的影響很大,我們可以推算一下一台伺服器宕機後的影響:

一致性雜湊演算法是使用一定的雜湊演算法,將大量的資料平均對映到不同的儲存目標上,在保證其查詢準確性的同時,還要考慮其中乙個儲存目標失效時,其他儲存目標對其責任儲存內容的負載均衡。

一致性雜湊演算法的實現思想不難理解,如圖:

1.用一定的雜湊演算法(雜湊函式等)將一組伺服器的多個(數目自己設定)節點隨機對映分散到0-232之間,由於其隨機分布,保證了其資料平均分布的特點;

2.用同一演算法計算要儲存資料的鍵,根據伺服器節點確定其儲存的伺服器結點,由於程式設計客棧每次用同一演算法計算,所以得出的結果是相同的,使其查詢定位準確;

3.查詢資料時,再次用同一演算法計算鍵,並查詢伺服器的資料結點;

4.如果有乙個伺服器宕機,消除其伺服器結點,並將資料放在下乙個結點上,由於隨機節點位置的隨機性,所以資料被其他伺服器平均負載,也就降低了宕機影響。

需要注意的是,這個環形空間只是乙個虛擬空間,只是表示了伺服器儲存的範圍和資料的落點,在進行儲存時,我們還要通過查詢到的落點,將資料放入對應的伺服器進行查改。

程式語言我們使用php來實現一致性雜湊演算法:

我們主要用到以下函式:

int crc32 ( string $str )

生成 st程式設計客棧r 的 32 位迴圈冗餘校驗碼多項式。這通常用於檢查傳輸的資料是否完整。

string sprintf ( string $format [, mixed $args [, mixed $... ]] )

通過傳入的格式產生字串的特定格式形態。

實現如下:

class consistance

//遍歷當前伺服器組的節點列表,確定需要儲存/查詢的伺服器

public function set_loc($data)}}

//新增乙個伺服器,將其結點新增到伺服器組的節點列表內。

public function add_host($host)

ksort($this->nodes); //對結點排序,這樣便於查詢。

}//刪除乙個伺服器,並將其對應節點從伺服器組的節點列表內移除。

public function remove_host($host)}}

我們用以下**進行測試:

結果如下:

演算法的實現到此,我們還可以對演算法進行優化,如在伺服器數量和每個伺服器節點數都很多的情況下,對查詢結點的過程進行優化,因為排序好的,可以用二分法進行查詢,加快查詢效率,這些,仁智各見吧。

另外,雖然nginx伺服器有一致性演算法的外掛程式,memcache和redis也都有相應的外掛程式,mysql的中介軟體有相應的整合,但是了解一致性雜湊演算法也很有意義。而且,我們也可以對其靈活使用,如對檔案等進行分布式管理等等。

PHP實現一致性雜湊演算法

如下 function myhash str hash hash 33 ord s 0x7fffffff hash hash seed hash ord s return hash 0x7fffffff class consistenthash return this public function...

PHP實現一致性雜湊演算法

如下 function myhash str hash hash 33 ord s 0x7fffffff hash hash seed hash ord s return hash 0x7fffffff class consistenthash return this public function...

分布式強一致演算法 Raft演算法

paxos演算法是最早的強一致性演算法,1990年被leslie lamport提出,但是由於其難以理解和實現,導致沒有被廣泛使用。因此,2013年raft演算法被提出,功能與paxos演算法相同,更易於理解,實現簡單,因此迅速被廣泛推廣使用,已經成為當前主流的強一致性演算法。從cap角度,raft...