集群是redis的分布式方案,通過分片來進行資料共享,並提供複製和故障轉移功能。
一、節點node
集群模式下的redis伺服器叫節點,一開始各個節點相互獨立,連起來後叫集群。通過向某個節點傳送命令【cluster meet 】,節點和【ip+port】伺服器握手成功後就將其新增到所在的集群中。
啟動節點:redis伺服器啟動時根據cluster-enabled配置選擇開啟後作為普通模式還是集群模式,集群模式會有特定的資料結構和訊息傳遞。
二、集群資料結構
structclusternodeclusternode;
clusternode表示乙個節點的各種基本資訊,包括建立時間、位址、埠、配置紀元、名字、所連的節點等資訊,屬性【clusterlink* link】表示所連的節點。
typedef structclusterlinkclusterlinkclusterlink;
clusterlink儲存了連線節點所需的有關資訊,其中緩衝區是給節點用的,而不是客戶端。
typedef structclusterstateclusterstateclusterstate;
clusterstate是每個節點都會有的結構,記錄的是集群資訊,nodes字典包含了全部的節點。
握手過程:b發命令給a,a在clusterstate的nodes字典裡建立乙個clusternode儲存b的節點資訊,然後a返回命令給b,b做同樣的事。b發pong命令,a收到回覆ping命令。握手完成。隨後a把b的資訊發給及群裡其他節點,紛紛握手。
三、槽
redis集群通過分片來儲存鍵值對,整個資料庫被分為16384個槽(slot),每個節點處理0-16384個槽,全部槽都有節點處理時集群才處於上線狀態。
儲存節點資訊的clusternode有屬性記錄節點負責處理哪些槽。
unsigned char slots[16384/8];//二進位制位陣列,1表示處理,0表示不處理
int numslots;//
本節點負責的槽點數量
節點負責處理哪些槽的資訊會**給其他節點,每個節點都知道全部槽分別由誰負責處理,資訊存在clusterstate裡。
clusternode* slots[16384];//要麼指向null,要麼指向節點
中間的陣列提供索引查詢作用,快速定位到節點,設定和查詢時間複雜度都是o(1),若沒有則需要暴力。
槽指派:通過命令【cluster addslots [slot ...]】,如果指派的槽有乙個被處理了則返回錯誤,否則就改一下clusternode的slots陣列,改一下clusterstate的slots陣列指向。再**。
四、在集群中執行命令
1.計算鍵屬於哪個槽 = crc16(key)&16383,
crc16(key)是計算key的crc-16校驗和。
2.檢查是否為自己負責的槽,判斷clusterstate.slots[i]==clusterstate.myself,不等於則返回moved命令,蘊含了
clusterstate.slots[i]指向的節點。
3.moved錯誤【moved :】,若客戶端未連上目標節點,則先連再發。集群模式下moved錯誤不會列印出來,單純是告訴客戶端去找其他節點,但是單機模式則會被列印出來,因為不會自動轉向。moved錯誤的解決措施是永久的,許可權已經改變了,客戶端以後直接去找新的節點。
4.節點只能用0號資料庫,單機redis則可以隨便用,過期處理方式則相同。集群狀態clusterstate結構中還有slots_to_keys跳躍表儲存槽與鍵之間的關係,跳躍表的分值(score)對應鍵的槽號,有序,方便批量操作。
5.重新分片,無需下線。
6.ask錯誤是重新分片過程中遇到客戶端與鍵相關的命令,在源節點找不鍵則會去目標節點找,類似moved錯誤,被隱藏。ask錯誤是一次性的,還沒遷移完成,下一次還是找源節點,找不到再通過ask錯誤去找目標節點。具體實現略過。
五、集群裡的主從複製與故障轉移
和普通的主從複製差不多。一開始各個節點定時相互傳送訊息以檢測故障,誰沒及時回覆就被標記為疑似下線狀態,然後告知其他節點,半數以上有處理槽的節點認為疑似下線就可以標記為已下線。從節點發現自己的主節點已下線時,先選新的主節點,規則與選領頭羊sentinel一樣。舊的主節點上線後變從節點。
六、訊息
meet訊息:a接到【cluster meet】時,向b傳送【meet】,請求b加到a所在的集群。
pong訊息:對meet和ping訊息的回應 或 **狀態確認。
fail訊息:主節點a斷定主節點b已下線時,**告知。
publish訊息:當節點收到,會執行並**,後續接收者也如此。
訊息 = 訊息頭header + 訊息正文data
參考&引用
《redis設計與實現》
Redis的使用 (一)集群的搭建
主題詞 負載均衡高可用 redis集群 nginx一般用作負載均衡伺服器,可見處於網路中非常重要的位置,一旦nginx伺服器宕機無法提供服務,那麼將影響嚴重。所以需要負載均衡高可用。高可用 主從備份 keepalived nginx實現主從備份 keepalived的作用是檢測伺服器的狀態,如果有一...
Redis 集群模式說明
基礎概念 cluster模式為server端模式,及資料分布由server控制 設計基本思路 在原有模型 data instance 上抽象出中間層 slot,即 data slot instance,明顯可知演化出了兩種對應關係 請求簡化過程 其他說明 server端模式 主從模式 遺留問題 sl...
Redis集群模式詳解
1.集群節點 1.2 節點啟動 2.槽指派 3.在集群中執行命令 4.重新分片 5.複製與故障轉移 6.集群訊息 7.gossip協議 參考文獻 clusterstate結構 typedef struct clusterstateclusternode結構struct clusternodeclus...