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