本博客整參考文章:redis架構演變與redis-cluster羣集讀寫方案 以及 Redis cluster集羣:原理及搭建 以及 redis官方集羣文檔html
不一樣於master-salve 或者 哨兵模式 cluster與他們最大的區別就是 前兩種是全量存儲 內存消耗大,且存在木桶效應而 cluster集羣則是分佈式存儲 即每臺Redis存儲不一樣的內容。node
redis-cluster被設計爲一共有16384個hash slot可用,每一個master分得一部分的slot 其分佈算法爲:【hash_slot = crc16(key) mod 16384】 若是有{}則取{}的可用key,不然整個能夠是可用key。集羣至少要3主3從,且每一個實例使用不一樣的配置文件。redis
全部的redis
節點彼此互聯(PING
-PONG
機制),內部使用二進制協議優化傳輸速度和帶寬。算法
節點的fail
是經過集羣中超過半數的節點檢測失效時才生效。架構
客戶端與redis
節點直連,不須要中間proxy
層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可。分佈式
redis-cluster
把全部的物理節點映射到[0-16383
]slot
上,cluster
負責維護node
<->slot
<->value
優化
redis-cluster投票:容錯ui
投票過程是集羣中全部master
參與,若是半數以上master
節點與master
節點通訊超時(cluster-node-timeout
),認爲當前master
節點掛掉..net
何時整個集羣不可用(cluster_state:fail
)?設計
master
掛掉,且當前master
沒有slave
.集羣進入fail
狀態,也能夠理解成集羣的slot
映射[0-16383
]不完整時進入fail狀態.
redis-3.0.0.rc1
加入cluster-require-full-coverage
參數,默認關閉,打開集羣兼容部分失敗.master
掛掉,不管是否有slave
,集羣進入fail
狀態。
在redis-cluster架構中,redis-master節點通常用於接收讀寫,而redis-slave節點則通常只用於備份,其與對應的master擁有相同的slot集合,若某個redis-master意外失效,則再將其對應的slave進行升級爲臨時redis-master。
在redis的官方文檔中,對redis-cluster架構上,有這樣的說明:在cluster架構下,默認的,通常redis-master用於接收讀寫,而redis-slave則用於備份,當有請求是在向slave發起時,會直接重定向到對應key所在的master來處理。但若是不介意讀取的是redis-cluster中有可能過時的數據而且對寫請求不感興趣時,則亦可經過readonly命令,將slave設置成可讀,而後經過slave獲取相關的key,達到讀寫分離。