一個集羣模式的官方推薦最小最佳實踐方案是 6 個節點,3 個 Master 3 個 Slave 的模式,如 圖00 所示。node
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}1
和key{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
根據上面的描述,咱們能夠總結出以下不可用的狀況
每日一刷,輕鬆提高技術,斬獲各類offer: