10.redis cluster介紹與gossip協議
阿新 • • 發佈:2020-09-07
## 一、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 資訊等等。