知道 Redis-Cluster 麼?說說其中可能不可用的狀況

Redis 集羣模式簡述

一個集羣模式的官方推薦最小最佳實踐方案是 6 個節點,3 個 Master 3 個 Slave 的模式,如 圖00 所示。node

image

key 分槽與轉發機制

Redis 將鍵空間分爲了 16384 個槽,經過如下算法肯定每個 key 的槽:git

CRC16(key) mod 16384

因爲 16384 = 2 的 14 次方,對一個 2 的 n 次方取餘至關於對於它的 2 的 n 次方減一取與運算。因此優化爲:github

CRC16(key) & 16383

當 key 包含 hash tags 的時候(例如 key{sub}1),會以 sub tags 中指定的字符串(就是 sub )計算槽,因此key{sub}1key{sub}2會到同一個槽中。redis

客戶端能夠發送讀取任一個槽的命令到任一個集羣實例,當槽屬於請求的實例的時候,就會處理,不然會告訴客戶端這個槽在哪裏,例如若是將下面命令發到第二個 Master:算法

GET key1
返回: MOVED slot ip:port(第一個Master的)

默認狀況下,全部的讀寫命令只能發送到 Master。若是須要使用 Slave 處理讀請求,須要先在客戶端執行 readonly 命令。ide

主從自動切換機制

當一個 Master 發生故障,若是有 Slave,則會切換爲 Master。函數

如何判斷 Master 發生故障了呢?Redis 集羣配置中有一個配置,cluster-node-timeout集羣心跳超時時間。當集羣內節點創建鏈接後,定時任務 clusterCron 函數(參考源碼:https://github.com/redis/redis/blob/6.0/src/cluster.c)會每隔一秒隨機選擇一個節點發送心跳。若是在超時時間(cluster-node-timeout)的時間內未收到心跳響應,則將這個節點標記爲 pfail。優化

若是集羣中有一半以上的 Master 標記一個節點的狀態是 pfail,那麼這個節點的狀態就會變成 fail。code

當節點變成 fail 就會觸發自動主從切換。主從切換的過程,也涉及到相似的選舉:blog

  1. 當某個 Master 被標記爲 fail 以後,對應的 Slave 節點執行定時任務 clusterCron 函數時,選取複製偏移量,也就是主從同步進度最大、數據最新的 Slave 嘗試變爲主。
  2. 這個 Slave 設置本身的 currentEpoch += 1(正常狀況下集羣中全部的 currentEpoch 相同,每次選舉都會加 1,而且每一個 currentEpoch 只能投一次,防止多個 Slave 同時發起選舉後難以獲取大多數票),以後向全部的 Master 發送 failover 請求,若是獲得大多數 Master 的贊成則開始執行主從切換。

集羣不可用狀況

根據上面的描述,咱們能夠總結出以下不可用的狀況

  1. 當訪問一個 Master 和 Slave 節點都掛了的槽的時候,會報槽沒法獲取。
  2. 當集羣 Master 節點個數小於 3 個的時候,或者集羣可用節點個數爲偶數的時候,基於 fail 的這種選舉機制的自動主從切換過程可能會不能正常工做,一個是標記 fail 的過程,一個是選舉新的 master 的過程,都有可能異常。

參考

  1. 官方文檔:https://redis.io/topics/cluster-spec
  2. 源代碼:[https://github.com/redis/redis

每日一刷,輕鬆提高技術,斬獲各類offer:

image

相關文章
相關標籤/搜索