1. 程式人生 > >第十三章 redis-cluster原理

第十三章 redis-cluster原理

執行命令 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原理