一、redis cluster 介紹
- 自動將資料進行分片,每個 master 上放一部分資料
- 提供內建的高可用支援,部分 master 不可用時,還是可以繼續工作的
redis cluster架構下的每個redis都要開放兩個埠號,比如一個是6379,另一個就是加1w的埠號16379。
-
6379埠號就是redis伺服器入口。
-
16379埠號是用來進行節點間通訊的,也就是 cluster bus 的東西,cluster bus 的通訊,用來進行故障檢測、配置更新、故障轉移授權。cluster bus 用的是一種叫gossip 協議的二進位制協議,用於節點間高效的資料交換,佔用更少的網路頻寬和處理時間。
二、節點間的內部通訊機制
叢集後設資料的維護有兩種方式:集中式、Gossip 協議。
redis cluster 節點間採用 gossip 協議進行通訊。
1. 集中式
將叢集後設資料集中儲存在一個節點上。典型代表是大資料領域的 storm。它是分散式的大資料實時計算引擎,是集中式的後設資料儲存的結構,底層基於 zookeeper對所有後設資料進行儲存維護。
- 優點
後設資料的讀取和更新時效性非常好,後設資料的變更都能立即更新到集中式儲存節點中,其它節點讀取的時候就可以感知到;
- 缺點
所有的後設資料的更新壓力全部集中在一個地方,可能會導致後設資料的儲存有壓力。
2. gossip 協議
redis 維護叢集後設資料採用的是gossip 協議,所有節點都持有一份後設資料,不同的節點如果出現了後設資料的變更,就不斷將後設資料傳送給其它的節點,讓其它節點也進行後設資料的變更。
- 優點
後設資料的更新比較分散,不是集中在一個地方,降低了壓力;
- 缺點
後設資料的更新有延時,可能導致叢集中的一些操作會有一些滯後。
三、深入剖析gossip 協議
gossip 協議包含多種訊息,包含 ping、pong、meet、fail等等。
- meet:某個節點在內部傳送了一個gossip meet 訊息給新加入的節點,通知那個節點去加入我們的叢集。然後新節點就會加入到叢集的通訊中
redis-trib.rb add-node
- ping:每個節點都會頻繁給其它節點傳送 ping,其中包含自己的狀態還有自己維護的叢集後設資料,互相通過 ping 交換後設資料。
- pong:ping 和 meet訊息的返回響應,包含自己的狀態和其它資訊,也用於資訊廣播和更新。
- fail:某個節點判斷另一個節點 fail 之後,就傳送 fail 給其它節點,通知其它節點說這個節點已當機。
繼續深入剖析ping訊息
-
ping 時要攜帶一些後設資料,如果很頻繁,可能會加重網路負擔。因此,一般每個節點每秒會執行 10 次 ping,每次會選擇 5 個最久沒有通訊的其它節點。
-
當然如果發現某個節點通訊延時達到了 cluster_node_timeout / 2,那麼立即傳送 ping,避免資料交換延時過長導致資訊嚴重滯後。比如說,兩個節點之間都 10 分鐘沒有交換資料了,那麼整個叢集處於嚴重的後設資料不一致的情況,就會有問題。所以 cluster_node_timeout 可以調節,如果調得比較大,那麼會降低 ping 的頻率。
-
每次 ping,會帶上自己節點的資訊,還有就是帶上 1/10 其它節點的資訊,傳送出去,進行交換。至少包含 3 個其它節點的資訊,最多包含 總節點數減 2 個其它節點的資訊。
10000 埠:
每個節點都有一個專門用於節點間通訊的埠,就是自己提供服務的埠號+10000,比如 6379,那麼用於節點間通訊的就是16379埠。每個節點每隔一段時間都會往另外幾個節點傳送 ping 訊息,同時其它幾個節點接收到 ping 之後返回 pong。
交換的資訊:資訊包括故障資訊,節點的增加和刪除,hash slot 資訊等等。