Redis Cluster的基本原理及實(shí)現(xiàn)細(xì)節(jié)
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
Redis Cluster的基本原理和架構(gòu)
Redis Cluster是分布式Redis的實(shí)現(xiàn)。隨著Redis版本的更替,以及各種已知bug的fixed,在穩(wěn)定性和高可用性上有了很大的提升和進(jìn)步,越來(lái)越多的企業(yè)將Redis Cluster實(shí)際應(yīng)用到線上業(yè)務(wù)中,通過(guò)從社區(qū)獲取到反饋社區(qū)的迭代,為Redis Cluster成為一個(gè)可靠的企業(yè)級(jí)開(kāi)源產(chǎn)品,在簡(jiǎn)化業(yè)務(wù)架構(gòu)和業(yè)務(wù)邏輯方面都起著積極重要的作用。下面從Redis Cluster的基本原理為起點(diǎn)開(kāi)啟Redis Cluster在業(yè)界的分析與思考之旅。
基本原理
Redis Cluster的基本原理可以從數(shù)據(jù)分片、數(shù)據(jù)遷移、集群通訊、故障檢測(cè)以及故障轉(zhuǎn)移等方面進(jìn)行了解,Cluster相關(guān)的代碼也不是很多,注釋也很詳細(xì),可自行查看,地址是:https://github.com/antirez/redis/blob/unstable/src/cluster.c。這里由于篇幅的原因,主要從數(shù)據(jù)分片和數(shù)據(jù)遷移兩方面進(jìn)行詳細(xì)介紹:
數(shù)據(jù)分片
Redis Cluster在設(shè)計(jì)中沒(méi)有使用一致性哈希(Consistency Hashing),而是使用數(shù)據(jù)分片(Sharding)引入哈希槽(hash slot)來(lái)實(shí)現(xiàn);一個(gè) Redis Cluster包含16384(0~16383)個(gè)哈希槽,存儲(chǔ)在Redis Cluster中的所有鍵都會(huì)被映射到這些slot中,集群中的每個(gè)鍵都屬于這16384個(gè)哈希槽中的一個(gè),集群使用公式slot=CRC16(key)/16384來(lái)計(jì)算key屬于哪個(gè)槽,其中CRC16(key)語(yǔ)句用于計(jì)算key的CRC16 校驗(yàn)和。
集群中的每個(gè)主節(jié)點(diǎn)(Master)都負(fù)責(zé)處理16384個(gè)哈希槽中的一部分,當(dāng)集群處于穩(wěn)定狀態(tài)時(shí),每個(gè)哈希槽都只由一個(gè)主節(jié)點(diǎn)進(jìn)行處理,每個(gè)主節(jié)點(diǎn)可以有一個(gè)到N個(gè)從節(jié)點(diǎn)(Slave),當(dāng)主節(jié)點(diǎn)出現(xiàn)宕機(jī)或網(wǎng)絡(luò)斷線等不可用時(shí),從節(jié)點(diǎn)能自動(dòng)提升為主節(jié)點(diǎn)進(jìn)行處理。
如圖1,ClusterNode數(shù)據(jù)結(jié)構(gòu)中的slots和numslots屬性記錄了節(jié)點(diǎn)負(fù)責(zé)處理哪些槽。其中,slot屬性是一個(gè)二進(jìn)制位數(shù)組(bitarray),其長(zhǎng)度為16384/8=2048 Byte,共包含16384個(gè)二進(jìn)制位。集群中的Master節(jié)點(diǎn)用bit(0和1)來(lái)標(biāo)識(shí)對(duì)于某個(gè)槽是否擁有。比如,對(duì)于編號(hào)為1的槽,Master只要判斷序列第二位(索引從0開(kāi)始)的值是不是1即可,時(shí)間復(fù)雜度為O(1)。
圖1 ClusterNode數(shù)據(jù)結(jié)構(gòu)
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%