1. 程式人生 > >10.redis cluster介紹與gossip協議

10.redis cluster介紹與gossip協議

## 一、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對所有元資料進行儲存維護。 ![](https://img2020.cnblogs.com/blog/2136379/202009/2136379-20200907102559173-1607791644.png)   * **優點** 元資料的讀取和更新時效性非常好,元資料的變更都能立即更新到集中式儲存節點中,其它節點讀取的時候就可以感知到; * **缺點** 所有的元資料的更新壓力全部集中在一個地方,可能會導致元資料的儲存有壓力。 ### 2. gossip 協議 redis 維護叢集元資料採用的是gossip 協議,所有節點都持有一份元資料,不同的節點如果出現了元資料的變更,就不斷將元資料傳送給其它的節點,讓其它節點也進行元資料的變更。 ![](https://img2020.cnblogs.com/blog/2136379/202009/2136379-20200907102610613-1983444640.png) * **優點** 元資料的更新比較分散,不是集中在一個地方,降低了壓力; * **缺點** 元資料的更新有延時,可能導致叢集中的一些操作會有一些滯後。     ## 三、深入剖析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 資訊等等。