10.redis cluster介紹與gossip協議

MrMirror發表於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對所有後設資料進行儲存維護。

  • 優點

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

  • 缺點

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

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 資訊等等。

相關文章