系統設計入門: Hashing

ChunJen Wang
jimmy-wang
Published in
Apr 17, 2022

hashing基本功能為將不同格式的input轉換為固定長度的字串(或identifier)。

問題一:

當今天client 1先request Server A會留下cache紀錄,下一次再發相同的request就可以加速運作。但若依據round robin進行load balance,隔次實際上client 1被分配request到Server D

例如透過編號,取mod(餘數),再將特定client發送的request指向特定server。

note: 但這樣不就失去load balancer原本設定round robin的意義?

或者如果今天增加server E,透過重新編號,那又要重新分配,然後導致cache全部遺失,要重新累積。in-memory caching真是個災難!

或某個server壞掉後,又要如何重新進行分配?

Consistent Hashing

我們將hash funtion設計的更完整一點,以一個時鐘作為概念分割分配。
今天任意一個client進來透過hash function分配到固定位置上,而我們可以分配任意server到位置上,以順時針方式分配request。

例如
C2 分配給server C;
C3 分配給server B;
C1 原本分配給server A,但新增server E後,C1就分配給server E;
C4 分配給server A,但如果server A故障,則分配給server B。

目的在於
1. 維持系統可以持續運作(不受單一server crush影響),並以
2.避免每次新增server都要重新分配(取mod的方式)。

實作consistent hashing方法(中文):
Consistent Hashing Algorithm: 應用情境、原理與實作範例

Rendezvous Hashing

或稱為 highest random weight hashing, HRW hashing

提出與其將特定request都一定要指派到一個server上,不如在一開始就建立server list順序,當今日有任一server故障時,就可以直接跳過,往下指派。

目的在於降低重新計算的loading,如下操作透過Rendezvous Hashing。
在右邊執行結果為採用一般方式,會全部重新分配,而Rendezvous Hashing只有原本server 5因為故障而重新分配了。

--

--

ChunJen Wang
jimmy-wang

嗨,歡迎你的到來,我目前在銀行擔任DS。過去曾做過銀行大型專案BA,也曾在轉職科技業DE中踢了鐵板,相信每一個人都有自己要走的路,而努力的過程,可以讓我們離心中理想更接近,如果我的文章能帶給你一些啟發與幫助,別忘了幫我在文章底下按下拍手~^^