常見的分布式定址演算法 借鑑到分庫分表

2022-09-09 11:39:11 字數 1848 閱讀 7033

hash 演算法

來了乙個 key,首先計算 hash 值,然後對節點數取模。然後打在不同的 master 節點上。一旦某乙個 master 節點宕機,所有請求過來,都會基於最新的剩餘 master 節點數去取模,嘗試去取資料。這會導致大部分的請求過來,全部無法拿到有效的快取,導致大量的流量湧入資料庫。

一致性 hash 演算法

一致性 hash 演算法將整個 hash 值空間組織成乙個虛擬的圓環,整個空間按順時針方向組織,下一步將各個 master 節點(使用伺服器的 ip 或主機名)進行 hash。這樣就能確定每個節點在其雜湊環上的位置。

來了乙個 key,首先計算 hash 值,並確定此資料在環上的位置,從此位置沿環順時針「行走」,遇到的第乙個 master 節點就是 key 所在位置。

在一致性雜湊演算法中,如果乙個節點掛了,受影響的資料僅僅是此節點到環空間前乙個節點(沿著逆時針方向行走遇到的第乙個節點)之間的資料,其它不受影響。增加乙個節點也同理。

燃鵝,一致性雜湊演算法在節點太少時,容易因為節點分布不均勻而造成快取熱點的問題。為了解決這種熱點問題,一致性 hash 演算法引入了虛擬節點機制,即對每乙個節點計算多個 hash,每個計算結果位置都放置乙個虛擬節點。這樣就實現了資料的均勻分布,負載均衡。

redis cluster 的 hash slot 演算法

redis cluster 有固定的16384個 hash slot,對每個key計算crc16值,然後對16384取模,可以獲取 key 對應的 hash slot。

hash_slot=crc16(key) mod 16384

redis cluster 中每個 master 都會持有部分 slot,比如有 3 個 master,那麼可能每個 master 持有 5000 多個 hash slot。hash slot 讓 node 的增加和移除很簡單,增加乙個 master,就將其他 master 的 hash slot 移動部分過去,減少乙個 master,就將它的 hash slot 移動到其他 master 上去。移動 hash slot 的成本是非常低的。客戶端的 api,可以對指定的資料,讓他們走同乙個 hash slot,通過hash tag來實現。

任何一台機器宕機,另外兩個節點,不影響的。因為 key 找的是 hash slot,不是機器。

備註:主從模式下的rediscluster 集群 redis 並不能保證資料的強一致性.

第乙個原因是因為集群是用了非同步複製。主節點對從節點命令的複製工作發生在返回客戶端命令回覆之後。

第二個原因是 redis 集群出現了網路分割槽, 並且乙個客戶端與至少包括乙個主節點在內的少數例項被孤立。

redis 集群通過分割槽來提供一定程度的可用性,在實際環境中當某個節點宕機或者不可達的情況下繼續處理命令. redis 集群的優勢:

分片技術的矛盾之處:

即要求key盡可能地分散到不同機器,又要求某些相關聯的key分配到相同機器。

所以引入 hash tag 機制

hashtag機制可以影響key被分配到的slot,從而可以使用那些被限制在slot中操作。

hashtag即是用{}包裹key的乙個子串,如1, 2。

在設定了hashtag的情況下,集群會根據hashtag決定key分配到的slot, 兩個key擁有相同的hashtag:, 它們會被分配到同乙個slot,允許我們使用mget命令。

通常情況下,hashtag不支援巢狀,即將第乙個中間的內容作為hashtag。若花括號中不包含任何內容則會對整個key進行雜湊,如{}user:。

hashtag可能會使過多的key分配到同乙個slot中,造成資料傾斜影響系統的吞吐量,務必謹慎使用。

分布式定址演算法

springboot讀原始碼系列 elasticsearch系列 資料結構系列 分布式定址演算法是很重要的內容,不了解這些演算法,也就不能透徹的了解各種分布式中介軟體的原理。簡單說一下這些高大上的定址到底是個啥意思,比如在elasticsearch中,採用的是多分片,每個分片上儲存的是不一樣的資料,...

採用跳躍定址方式可以實現 分布式定址演算法

一 分布式定址演算法簡介 分布式定址演算法是很重要的內容,不了解這些演算法,也就不能透徹的了解各種分布式中介軟體的原理。簡單說一下這些高大上的定址到底是個啥意思,比如在elasticsearch中,採用的是多分片,每個分片上儲存的是不一樣的資料,是一種並集關係。比如我們通過 id去搜尋一條資料,el...

分布式面試 分布式鎖的常見問題

一般實現分布式鎖都有哪些方式?使用 redis 如何設計分布式鎖?使用 zk 來設計分布式鎖可以嗎?這兩種分布式鎖的實現方式哪種效率比較高?其實一般問問題,都是這麼問的,先問問你 zk,然後其實是要過度到 zk 關聯的一些問題裡去,比如分布式鎖。因為在分布式系統開發中,分布式鎖的使用場景還是很常見的...