哈希競猜游戲前端開發(fā)邏輯
哈希是通過壓縮數(shù)據(jù)來提高效率的解決方案。然而,由于哈希函數(shù)的有限性和數(shù)據(jù)量的增加,哈希沖突已成為精確數(shù)據(jù)壓縮的難題
算法原理
一致性哈希算法由麻省理工學院于1997年提出。這是一種特定的哈希算法。刪除或添加服務器時,它可以盡可能少地改變現(xiàn)有服務請求與請求處理服務器之間的映射關(guān)系
一致性哈希解決了分布式哈希表(DHT)之中直觀哈希算法的動態(tài)伸縮問題
一致性哈希算法本質(zhì)之上也是一種模塊化算法

然而,與上述基于服務器數(shù)量的模塊有所不同,一致性哈希是將固定值2^32
IPv4地址模塊化,由4組8位二進制數(shù)組成,因此,2^32可以確保每個IP地址都有唯一的映射
哈希環(huán)
我們可以將這2^32個值抽象化為一個環(huán)環(huán)正下方的點表示順時針排列的0,依此類推:1、2、3。。。直到2^32-1。由32個點到2的冪組成的環(huán)統(tǒng)稱為哈希環(huán)
服務器映射到哈希環(huán)
映射服務器時,使用哈希(服務器IP)%2^32,即:
服務器IP地址用于哈希計算,哈希結(jié)果用于?;?^32。結(jié)果必須是0到2^32-1間的整數(shù)
哈希環(huán)之上此整數(shù)映射的位置表示一個服務器,該服務器依次將node0、node1和node2緩存服務器映射到哈希環(huán)
對象密鑰映射到服務器
將相應密鑰映射到特定服務器時,需要首先計算金鑰的哈希值:哈希(key)%2^32
注意:此處的哈希函數(shù)可能有所不同于計算服務器映射到哈希環(huán)的函數(shù)。只要值范圍與哈希環(huán)的值范圍相近(即2^32)
將密鑰映射到服務器遵循下列邏輯:
從緩存對象密鑰的位置開始,逆時針方向遇到的第一個服務器就是當前對象將緩存到的服務器
假設我們有“semlinker”、“kakuqo”、“Lolo”和“fer”,它們縮寫為O1,O2、O3和O4分別

數(shù)據(jù)傾斜和服務器性能均衡問題
導致問題
在上述示例之中,每個服務器幾乎均勻分布到哈希環(huán)
但是,在具體場景之中,很容易選擇一個哈希函數(shù)將所有服務器理想地散列到哈希環(huán)之上
此時,當服務器節(jié)點數(shù)太難時,由于節(jié)點分布不均勻,很難造成數(shù)據(jù)傾斜
在添加CS4服務器時,CS4只分擔CS1服務器的負載,CS2和CS3服務器并沒有因為添加了CS4服務器而降低負載壓力;如果CS4服務器的性能與原來的服務器相同甚至更低,那么這個結(jié)果就不是我們所期望的
虛擬節(jié)點
為了解決上述問題,我們可以引入虛擬節(jié)點來解決負載不均衡的問題:
也就是說,將每個物理服務器虛擬化為一組虛擬服務器,虛擬服務器被放置在哈希環(huán)之上。如果要確定對象的服務器,需要首先確定對象的虛擬服務器,然后虛擬服務器確定物理服務器

使用場景
一致性哈希應該是分布式系統(tǒng)之中負載均衡的首選算法。它可以在客戶端和下方件之上敏捷實現(xiàn)。例如,日常緩存之中常見的memcached和redis集群可以使用它
memcached集群是特定的。嚴格來說,它只能被視為一個偽集群,因為它的服務器不能相互通信。請求的分發(fā)路由全然取決于客戶端來計算緩存對象應該位于哪個服務器之上,其路由算法使用一致性哈希
redis集群之中還有哈希槽的概念。雖然實現(xiàn)方式有所不同,但想法總是相近的。閱讀本文之中的一致性哈希后,您將更難理解redis slot
一致性哈希算法的實現(xiàn)
接下來,我們根據(jù)上述描述使用golang實現(xiàn)一致性哈希算法。該算法具有下列特點:
相同哈希的核心算法
支持自定義哈希算法
支持自定義虛擬節(jié)點數(shù);
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由財神資訊-領(lǐng)先的體育資訊互動媒體轉(zhuǎn)載發(fā)布,如需刪除請聯(lián)系。