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