1. 程式人生 > 資料庫 >淺析redis cluster介紹與gossip協議

淺析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對所有元資料進行儲存維護。

淺析redis cluster介紹與gossip協議

優點

元資料的讀取和更新時效性非常好,元資料的變更都能立即更新到集中式儲存節點中,其它節點讀取的時候就可以感知到;

缺點

所有的元資料的更新壓力全部集中在一個地方,可能會導致元資料的儲存有壓力。

2. gossip協議

redis 維護叢集元資料採用的是gossip協議,所有節點都持有一份元資料,不同的節點如果出現了元資料的變更,就不斷將元資料傳送給其它的節點,讓其它節點也進行元資料的變更。

淺析redis cluster介紹與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 資訊等等。

總結

到此這篇關於redis cluster介紹與gossip協議的文章就介紹到這了,更多相關redis cluster和gossip協議內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!