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對所有元數據進行存儲維護。

  • 優點

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

  • 缺點

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

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 信息等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM