------本文是學習演算法的筆記,《資料結構與演算法之美》,極客時間的課程------
這一節來說說雜湊演算法的另外三種應用:負載均衡、資料分片、分布式儲存。其實這三個應用都跟分布式系統有關。今天就看一下,雜湊演算法是如何解決這些分布式問題的。
我們知道,負載均衡演算法很多,比如輪詢、隨機、加權輪詢等。那如何才能實現乙個會話粘滯(session sticky)的負載均衡演算法呢?也就是說,我們需要在同乙個客戶端上,在一次會話中的所有請求都路由到同乙個伺服器上。
最直接的方法就是,維護一張對映表,這張表的內容是客戶端ip位址或者會話id與伺服器編號的對映關係。客戶端發出的每次請求,都要先在對映表中查詢應該路由到的伺服器編號,然後再請求編號對應的伺服器。這種方法直觀,但也有幾個弊端:
如果客戶端很多,對映表可能很大,比較浪費記憶體空間。
客戶端下線、上線,伺服器擴容、縮容都會導致對映失效,這樣維護日程表的成本就會很大;
如果借助雜湊演算法,這些問題都可以非常完美地解決。我們可以通過雜湊演算法,對客戶端ip位址或者會話id計算雜湊值,將取得的雜湊值與伺服器列表的大小進行取模運算,最終得到的值就是應該被路由到的伺服器編號。這樣,我們就可以把同乙個ip過來的請求,都路由到同乙個後端伺服器上。
雜湊演算法還可以用於資料分片。這裡有兩個例子。
我們來分析下,這個問題有兩個難點,第乙個是搜尋日誌很大,沒辦法放到一台機器的記憶體中。第二個難點是,如果只用一台機器來處理這麼巨大的資料,處理時間會很長。
實現上,這裡的處理過程也是mapreduce的基本設計思想。
2、如何快速判斷是否在相簿中?
假設現在我們的相簿中有1億張,很顯然,在單台機器上構建雜湊表是行不通的。因為單台機器的記憶體有限,而1億張構建雜湊表顯然遠遠超過了單台機器的記憶體上限。
我們兩樣可以對資料進行分片,然後採用多機處理。我們準備n 臺機器,讓每台機器只維護某一部分對就的雜湊表。我們每次從相簿中讀取乙個,計算唯一標識,然後與機器個數n 求餘取模。假設得到的值是k,那就去編號k 的機器構建的雜湊表中查詢。
現在,我們來估算一下,給這1億張構建列表大約需要 多少臺機器。
雜湊表中每個資料單元包含兩個資訊,雜湊值和檔案的路徑。假設我們通過md5來計算雜湊值,那長度就是128位元,也就是16位元組。檔案路徑長度的上限是256位元組,我們可以假設平均長度是128位元組。如果我們用煉表表來解決總被,那還需要儲存指標,指標只占用8位元組。所以,雜湊表中每個資料單元就占用152位元組(這裡只是估算,並不準確)
假設一台機器的記憶體大小為2gb,雜湊表的裝載因子為0.75,那一台機器可以給大約1000萬(2gb * 0.75 / 152)張構建雜湊表。所以,如果要對1億張構建索引,需要大約十幾台機器。在工程中,這種估算還是很重要的,能讓我們對需要投入的資源、資金有個大概的了解,能更好地評估解決方案的可靠性。
實際上,針對這種海量資料的處理,我閃都可以採用多機分布式處理。借助這種分片的思路,可以突破單機記憶體、cpu等資源的限制。
現在網際網路面對的都是海量的資料、海量的使用者。我們為了提高的讀取、寫入能力,一般都優勝分布式的方式來儲存資料,比如分布式快取。我們有海量的資料需要快取,所以乙個快取機器肯定是不夠的。於是,我們需要將資料健在在多台機器上。
如何決定將哪個資料放到哪個機器上呢?我們可以借用資料分片的思想,即通過雜湊演算法對資料取雜湊值,然後對機器個數取模,這個最終就是應該儲存的快取機器編號。
但是,如果資料增多,原來的10個機器已經無法承受了,我們就需要擴容了,比如搞到11個機器,這時候麻煩就來了。因為,這裡並不是簡單加個機器就可以了。
原來的資料是通過與10來取模的。比如13這個資料,儲存在編號為3這台機器上。但是新加了一台機器中,我們對資料按照11取模,原來的13資料就被分配到2號這台機器上了。
因此,所有的資料都要重新計算雜湊值,然後重新搬移到正確的機器上。這樣就相當於,快取中的資料一下子就都失效了。所有的資料請求都地穿透快取,直接去請求資料庫。這樣就可能發生雪崩效應,壓垮資料庫。
所以,我們需要一種方法,使得加入乙個機器後,並不需要做大量的資料搬移。這時候,一致性雜湊演算法就要全場了。
假設我們有k 個機器,資料的雜湊值的範圍是[0,max]。我們將整個範圍劃分成m 個小區間(m 遠遠大於k),每個機器負責m/k個小區間。當有新機器加入的時候,我們就將某幾個小區間的資料,從原來的機器中搬移到校報的機器中。這樣,即不用全部重新雜湊、搬移資料,也保持了各個機器上資料量的均衡。
白話解析——什麼是一致性雜湊演算法
除了我們上面講到的分布式快取,實際上,一致性雜湊演算法的應用非常廣泛,在很多分布式儲存系統中,都可以見到一致性雜湊演算法的影子。
分布式雜湊演算法DHT
我們從淺入深一步一步介紹什麼是分布式雜湊表。雜湊函式 雜湊函式是一種計算方法,它可以把乙個值a對映到乙個特定的範圍 begin,end 之內。對於乙個值的集合,雜湊函式把他們均勻的對映到某個範圍之中。這樣,通過這些值就可以很快的找到與之對應的對映位址。對於同乙個值,雜湊函式要能保證對這個值的運算結果...
分布式雜湊和一致性雜湊演算法
目錄 1 資料分布 2 雜湊方式 3 一致性雜湊方式 筆記來自分布式原理一書,供個人學習。單機系統與分布式系統的最大的區別在於問題的規模,即計算 儲存的資料量的區別。將乙個單機問題使用分布式解決,首先要解決的就是如何將問題拆解為可以使用多機分布式解決,使得 分布式系統中的每台機器負責原問題的乙個子集...
分布式雜湊表
我們從淺入深一步一步介紹什麼是分布式雜湊表。1 雜湊函式 雜湊函式是一種計算方法,它可以把乙個值a對映到乙個特定的範圍 begin,end 之內。對於乙個值的集合,雜湊函式把他們均勻的對映到某個範圍之中。這樣,通過這些值就可以很快的找到與之對應的對映位址。對於同乙個值,雜湊函式要能保證對這個值的運算...