第十三章 redis-cluster原理
阿新 • • 發佈:2017-07-02
執行命令 shm 擴容 一段時間 本地 集群 端口號 保存 ron
一、基本定義
- 虛擬槽slot分區算法,優點是擴容縮容簡單:直接把slot及每個slot上的數據進行縮放即可
- redis定義了0-16383(總共為16384個slot,即214個slot)
- slot會均勻的分配在主節點上。假設是3主3從集群,每個master管理的slot個數分別為5461,5462,5461個。
- 映射:計算一個key在哪個slot上,公式slot=CRC16(key)&16383
- 在n=2m時,x&(n-1)=x%n,這就是redis為什麽定義2n個slot
- xx
二、集群搭建過程(3主3從)- 手動
- 準備節點
- 配置節點後,啟動單個節點,此時每個節點都是單獨處在一個集群中
- 節點握手(假設6379與6380握手)
- 命令:cluster meet ip port
- 過程:
- 節點6379本地創建6380節點信息對象,並發送meet消息
- 節點6380接收到meet消息後,保存節點6379的節點信息並回復pong消息(此時握手成功)
- 之後節點6379和節點6380彼此定期通過ping/pong消息進行正常的節點通信
- 在cluster內的任一節點執行cluster meet命令加入新節點。握手狀態會通過消息在集群內傳播(gossip協議),這樣其他節點會自動發現新節點並發起握手流程
- 為主節點分配槽
- 命令:cluster addslots {0...5460}
- 註意:主節點盡量選擇不同IP
- 為主節點分配從節點
- 從節點作用:復制主節點slot信息和相關的數據;故障轉移
- 命令:在從節點上執行cluster replicate {master-nodeId}
- 盡可能保證主從節點不在同一個機器上
三、集群搭建過程(3主3從)- 自動
第十二章 redis-cluster搭建(redis-3.2.5)
四、節點通信
- gossip協議:節點之間彼此不斷通信交換信息,一段時間後所有節點都會知道集群完整的信息。
- 通信過程:
- cluster中的每個node都會單獨開辟一個TCP通道(通信端口號在基礎端口號上加10000,例如16379),用於節點之間彼此通信
- 每個節點在固定周期內通過特定規則選擇幾個節點發送ping消息
- 接收到ping消息的節點用pong消息作為響應
五、請求路由
- 根據key計算slot:計算一個key在哪個slot上,公式slot=CRC16(key)&16383
- 根據slot查找slot所在節點:集群內每個節點都知道所有節點的slot信息(相當於節點的本地緩存),根據slot可以直接找出所在的node
- 如果slot所在的節點正好是接受命令的當前節點,那麽直接執行;如果不是,返回MOVED slot ip port(之後客戶端要再去連接該機器,再執行命令)
智能客戶端:
- 客戶端本地會緩存一份hashmap<slot, node>,MOVED slot ip port可以用來幫助緩存的刷新
第十三章 redis-cluster原理