【每天推薦一篇文章】Consistent Hashing
昨天有朋朋提到 Consistent Hashing,發現我筆記庫沒有相關資料,果斷重新了解一下並轉貼上來:Consistent Hashing Algorithm: 應用情境、原理與實作範例 - chyeh
Consistent Hashing 主要是應用於分散式系統的場景,用來判斷要把資料送給哪個服務節點時用的
如果同一份資料會隨機亂噴,兩次噴都噴到不一樣的服務,要追查問題或是搞什麼監控警報就會變得比較麻煩(?)。因此我們會希望同一份資料進來,就固定會到某一個服務。除了容易重現問題以外,在這個服務上搞快取也比較方便好命中
但如果只是使用簡單的 Hash 來對應(例如說平均分配,第一筆資料丟給第一台服務、第二筆資料丟給第二台服務……),就有可能遇到當節點新增或減少時,資料對應到的服務大量變動的問題
這一段我有點不太會說明(有更熟的朋朋歡迎幫忙),這邊就跟 GPT 一起 Pair 來舉個例子:
想像一下,你有一堆信件需要放到幾個郵箱裡。你決定用一個簡單的方法:每個郵箱輪流放信。
例如說你有 10 封信、3 個郵箱。那麼第 1 封信(編號為 1)就放到編號 1 的郵箱,第 2 封信放到編號 2 的郵箱,以此類推。編號 10 的信會放到編號 1 的郵箱,因為 10 除以 3 餘 1。
但是,如果你突然多了一個郵箱,變成 4 個郵箱,這個簡單的分配方法就需要改變了,因為你現在是按照 4 來計算每封信應該放哪了。
第 4 封信原本在第 1 個郵箱,現在得放到第 4 個郵箱了,這樣我們就得把很多信都拿出來,重新分一遍,非常麻煩,特別是信件很多的時候。
這時候我們就可以使用 Consistent Hashing,就如上面轉貼的文章所說:
Consistent Hashing 的做法是找「沿著順時鐘方向走,遇到的第一個 Index」
圖片來源:今天轉貼的這篇文章
同樣地,我們請 GPT 同樣用郵箱的例子支援一下:
想像一下,你有一堆信件需要放到幾個郵箱裡。而你站在一個圓形的大廳,大廳有些方向的牆壁上掛著郵箱
你決定像時鐘一樣把大廳分為 1 ~ 12,然後你會根據郵件的編號找到對應的數字,再沿著房間的圓形牆壁走,走到下一個郵箱就把信件投遞進去。
比如說,編號是 10 的信,就先找到圓圈上對應 10 的位置,開始順著圓走,直到碰到的第一個郵箱(可能這個郵箱位在 12),然後就把信放進去。
這樣即使多了一個郵箱,大多數郵箱的信也不用再重新分配了
因為計算 Hash 之後是去找到下一個圓圈上的節點,當節點新增的時候,只有新增節點的前一段受到影響;移除的時候也只有到下一個節點之間會影響
這樣就比較不會有資料和服務的對應關係大幅變動的問題了,我們又成功地拯救了我們各個服務的快取(?),可喜可賀
那麼,今天的轉貼就到這邊。明天見~
其他參考資料:
其他文章
哈囉,如果你也有 LikeCoin,也覺得我的文章有幫上忙的話,還請不吝給我拍拍手呦,謝謝~ ;)