不同于master-salve 或者 哨兵模式 cluster與他們最大的區別就是 前兩種是全量存儲?內存消耗大,且存在木桶效應而 cluster集群則是分布式存儲?即每臺redis存儲不同的內容。
redis-cluster被設計為一共有16384個hash slot可用,每個master分得一部分的slot 其分布算法為:【hash_slot = crc16(key) mod 16384】? 如果有{}則取{}的可用key,否則整個可以是可用key。集群至少要3主3從,且每個實例使用不同的配置文件。
-
所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
-
節點的fail是通過集群中超過半數的節點檢測失效時才生效。
-
客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可。
-
redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護nodeslotvalue
redis-cluster投票:容錯
1、投票過程是集群中所有master參與,如果半數以上master節點與master節點通信超時(cluster-node-timeout),認為當前master節點掛掉.
2、什么時候整個集群不可用(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,達到讀寫分離。
更多redis知識請關注redis入門教程欄目。