1. 程式人生 > >【Redis】叢集

【Redis】叢集

Redis 資料分割槽

Redis Cluster 採用虛擬槽分割槽,所有鍵根據雜湊函式對映到 0 - 16383 整數槽內,每一個節點負責維護一部分槽以及槽所對映的鍵值資料

特點:

  • 解耦資料和節點之間的關係,簡化了節點擴容和收縮難度
  • 節點自身維護槽的對映關係,不需要客戶端或者代理服務維護槽分割槽元資料
  • 支援節點、槽、鍵之間的對映查詢,用於資料路由、線上伸縮等場景

叢集功能限制

  1. key 批量操作支援有限,對於mset、mget等操作可能存在多個節點因此不被支援
  2. key 事務操作支援有限,只支援多key在同一節點上的事務操作
  3. key 作為資料分割槽的最小粒度,不能講一個大的鍵值物件(hash、list)對映到不同節點
  4. 不支援多資料庫空間,叢集下Redis只能使用一個數據庫空間
  5. 複製結構只支援一層,從節點只能複製主節點,不支援巢狀樹狀複製結構

搭建叢集

準備節點

  1. 每個節點開啟配置 cluster-enabled yes
  2. 啟動6個節點

節點握手

  1. 由客戶端發起命令 cluster meet {ip} {port}
  2. 對節點分別執行 cluster nodes 命令,各節點可以感知彼此存在
  3. 檢視叢集當前狀態 cluster info

分配槽

  1. 通過 cluster addslots 命令為節點分配槽
  2. 使用 cluster replicate {nodeId} 命令節點複製對應的主節點

節點通訊

通訊流程

Redis 採用P2P的Gossip協議維護元資料

  1. 叢集中每個節點都開闢一個TCP通道,用於節點之間彼此通訊
  2. 每個節點在固定週期內通過特定規則選擇幾個節點發送ping訊息
  3. 接收到ping訊息的節點用pong訊息作為響應

Gossip訊息

  • meet訊息:用於通知新節點加入
  • ping訊息:叢集內每個節點每秒向多個其它節點發送,檢測節點是否線上
  • pong訊息:作為響應訊息回覆給傳送方確認訊息正常通訊
  • fail訊息:當節點判定叢集內另一個節點下線,會想叢集內廣播一個fail訊息

節點選擇

  1. 選擇傳送訊息的節點數量:每秒執行10次,隨機選取5個節點找到最久沒有通訊節點發送ping訊息
  2. 訊息資料量:每個ping訊息 訊息頭佔用2KB左右,訊息體視叢集節點數量

叢集伸縮

擴容叢集

  1. 準備新節點:準備2個新節點,保持和叢集內配置一致,啟動節點
  2. 加入叢集:在叢集內任意節點執行 cluster meet ip port
  3. 遷移槽和資料:制定槽遷移計劃,用命令進行資料遷移,新增從節點

收縮叢集

  1. 下線遷移槽:把負責的槽遷移到其它節點
  2. 忘記節點:通知叢集內其它節點忘記下線節點,當其它節點忘記後則可關閉

請求路由

請求重定向

  1. 計算槽:根據鍵的有效部分使用CRC16函式計算出雜湊值,再取對16383的餘數,使每個鍵都可以對映到 0 - 16383 槽範圍內
  2. 槽節點查詢:Redis計算得到的鍵對應的槽後,需要查詢槽對應的節點。叢集內通過訊息交換每個節點都會知道所有節點的槽資訊

Smart 客戶端

  1. Smart客戶端通過在內部維護 slot —> node 的對映關係,本地就可以實現鍵到節點的查詢,從而保證IO效率的最大化
  2. MOVED 重定向負責協助Smart客戶端更新 slot —> node 對映

ASK 重定向

  1. 客戶端ASK重定向流程,ASK重定向說明叢集正在slot資料遷移
  2. 節點內部處理:檢查是否正在遷出;批量操作會受到影響

故障轉移

故障發現

  • 主觀下線:節點a內的定時任務檢測到與節點b的最後通訊時間超過cluster-node-timeout,則更新本地對節點b的狀態為主觀下線
  • 客觀下線:當某個節點判斷另一節點主觀下線後,節點狀態會在叢集內傳播,當半數以上持有槽的主節點都標記主觀下線,觸發客觀下線流程

故障恢復

  1. 資格檢查:根據從節點與主節點斷線時間判斷是否具備故障轉移資格
  2. 準備選舉時間:符合故障轉移資格後,更新故障選舉時間,達到時間後執行後續流程
  3. 發起選舉:更新配置紀元、廣播選舉訊息
  4. 選舉投票:只有持有槽的主節點才會處理故障選舉訊息
  5. 替換主節點:當前從節點變成主節點,撤銷故障主節點的槽,把這些槽委派給自己,然後向叢集廣播自己的訊息