redis cluster,主要是針對海量數據+高併發+高可用的場景。redis cluster 支撐 N 個 redis master node,每一個 master node 均可以掛載多個 slave node。這樣整個 redis 就能夠橫向擴容了。若是你要支撐更大數據量的緩存,那就橫向擴容更多的 master 節點,每一個 master 節點就能存放更多的數據了。node
redis cluster的特色redis
在 redis cluster 架構下,每一個 redis 要放開兩個端口號,好比一個是 6379,另一個就是 加1w 的端口號,好比 16379。緩存
16379 端口號是用來進行節點間通訊的,也就是 cluster bus 的東西,cluster bus 的通訊,用來進行故障檢測、配置更新、故障轉移受權。cluster bus 用了另一種二進制的協議,gossip?協議,用於節點間進行高效的數據交換,佔用更少的網絡帶寬和處理時間。網絡
redis cluster 節點間採用 gossip 協議進行通訊 。集中式將集羣元數據(節點信息、故障等等)集中存儲在某個節點上。集中式元數據集中存儲的一個典型表明,就是大數據領域的storm。它是分佈式的大數據實時計算引擎,是集中式的元數據存儲的結構,底層基於 zookeeper(分佈式協調的中間件)對全部元數據進行存儲維護。架構
redis 維護集羣元數據採用另外一個方式,gossip協議,全部節點都持有一份元數據,不一樣的節點若是出現了元數據的變動,就不斷將元數據發送給其它的節點,讓其它節點也進行元數據的變動。併發
集中式的好處在於,元數據的讀取和更新,時效性很是好,一旦元數據出現了變動,就當即更新到集中式的存儲中,其它節點讀取的時候就能夠感知到;很差在於,全部的元數據的更新壓力所有集中在一個地方,可能會致使元數據的存儲有壓力。分佈式
gossip 好處在於,元數據的更新比較分散,不是集中在一個地方,更新請求會陸陸續續,打到全部節點上去更新,下降了壓力;很差在於,元數據的更新有延時,可能致使集羣中的一些操做會有一些滯後。高併發
每一個節點都有一個專門用於節點間通訊的端口,就是本身提供服務的端口號+10000,好比 7001,那麼用於節點間通訊的就是 17001 端口。大數據
每一個節點每隔一段時間都會往另外幾個節點發送ping消息,同時其它幾個節點接收到ping以後返回pong。orm
信息包括故障信息,節點的增長和刪除,hash slot 信息 等等。
gossip 協議包含多種消息,包含ping,pong,meet,fail等等。
ping 時要攜帶一些元數據,若是很頻繁,可能會加劇網絡負擔。
每一個節點每秒會執行 10 次 ping,每次會選擇 5 個最久沒有通訊的其它節點。固然若是發現某個節點通訊延時達到了cluster_node_timeout / 2,那麼當即發送 ping,避免數據交換延時過長,落後的時間太長了。好比說,兩個節點之間都 10 分鐘沒有交換數據了,那麼整個集羣處於嚴重的元數據不一致的狀況,就會有問題。因此cluster_node_timeout能夠調節,若是調得比較大,那麼會下降 ping 的頻率。
每次 ping,會帶上本身節點的信息,還有就是帶上 1/10 其它節點的信息,發送出去,進行交換。至少包含3個其它節點的信息,最多包含總結點-2個其它節點的信息。
redis cluster 的高可用的原理,幾乎跟哨兵是相似的
若是一個節點認爲另一個節點宕機,那麼就是pfail,主觀宕機。若是多個節點都認爲另一個節點宕機了,那麼就是fail,客觀宕機,跟哨兵的原理幾乎同樣,sdown,odown。
在cluster-node-timeout內,某個節點一直沒有返回pong,那麼就被認爲pfail。
若是一個節點認爲某個節點pfail了,那麼會在gossip ping消息中,ping給其餘節點,若是超過半數的節點都認爲pfail了,那麼就會變成fail。
對宕機的 master node,從其全部的 slave node 中,選擇一個切換成 master node。
檢查每一個 slave node 與 master node 斷開鏈接的時間,若是超過了cluster-node-timeout * cluster-slave-validity-factor,那麼就沒有資格切換成master。
每一個從節點,都根據本身對 master 複製數據的 offset,來設置一個選舉時間,offset 越大(複製數據越多)的從節點,選舉時間越靠前,優先進行選舉。
全部的 master node 開始 slave 選舉投票,給要進行選舉的 slave 進行投票,若是大部分 master node(N/2 + 1)都投票給了某個從節點,那麼選舉經過,那個從節點能夠切換成 master。
從節點執行主備切換,從節點切換爲主節點。
整個流程跟哨兵相比,很是相似,因此說,redis cluster 功能強大,直接集成了 replication 和 sentinel 的功能。
#######################