Redis集群模式之Redis Cluster(2)

? ? ? ? 上篇文章我們講解了Redis Cluster中的主要模塊和兩種重定向方式,這篇文章我們來講解一下Redis Cluster的狀態監測和維護。

Redis Cluster狀態監測及維護

? ? ? ? 要講解Redis Cluster中節點的狀態如何維護,我們要先知道Redis Cluster中的節點有哪些狀態,gossip協議是什么以及具體的通訊(心跳)機制。

節點狀態

? ? ? ? Redis Cluster中的每個節點都維護著一份在自己看來當前整個集群的狀態,主要包括:

? ? ? ? (1)當前集群的狀態;

? ? ? ? (2)集群中各節點所負責的Slots信息,及其migrate狀態;

? ? ? ? (3)集群中各節點的Master-Slave狀態;

? ? ? ? (4)集群中各節點的存活狀態及不可達投票。

? ? ? ? 當集群的狀態發生變化時,比如新節點的加入、Slot遷移、節點宕機、新Master的出現等,我們希望這些變化盡快的被發現,傳播到整個集群的所有節點并達成一致。節點之間相互的心跳(PING、PONG、MEET)及其攜帶的數據是集群狀態傳播最主要的途徑。

gossip協議

? ? ? ? gossip協議又稱為epidemic協議,是基于流行病傳播方式的節點或進程之間信息交換的協議。在分布式系統中被廣泛使用,比如我們可以使用gossip協議來確保網絡中所有節點的數據一樣。

? ? ? ? gossip協議已經是P2P網絡中比較成熟的協議了。gossip協議的最大好處是,即使集群節點的數量增加,每個節點的負載也不會增加很多,幾乎是恒定的。這就允許Consul管理的集群規模能橫向擴展到數千個節點。

? ? ? ? Redis集群是去中心化的,彼此之間狀態同步靠gossip協議通信,集群的消息有以下幾種類型:

? ? ? ? (1)Meet:通過cluster meet ip port命令,已有集群的節點會向新的節點發送邀請,加入現有集群。

? ? ? ? (2)Ping:節點每秒會向集群中其他節點發送Ping消息,消息中帶有自己已知的兩個節點的地址、槽、狀態信息、最后一次通信時間等。

? ? ? ? (3)Pong:節點收到Ping消息后會回復Pong消息,消息中同樣帶有自己已知的兩個節點消息。

? ? ? ? (4)Fail:節點Ping不通某節點后,會向集群所有節點廣播該節點掛掉的消息。其他節點收到消息后標記為已下線。????????

? ? ? ? 集群中的每個節點都會定期地向集群中的其他節點發送PING消息,以此交換各個節點狀態信息,檢測各個節點的狀態:在線狀態、疑似下線狀態PFAIL、已下線狀態FAIL。

? ? ? ? 當主節點A通過消息得知主節點B認為主節點D進入疑似下線狀態時,主節點A會在自己的clusterState.nodes字典中找到主節點D所對應的clusterNode結構,并將主節點B的下線報告添加到clusterNode結構的fail_reports鏈表中,并后續關于節點D疑似下線的狀態通過gossip協議通知其他節點。

? ? ? ? 如果集群中,半數以上的主節點都將主節點D報告為下線狀態,那么主節點D就被標記為已下線狀態,將主節點D標記為已下線的節點會向集群廣播主節點D的Fail消息,所有收到Fail消息的節點都會立即更新nodes里面主節點D的狀態,標記為已下線。

? ? ? ? 將node標記為FAIL需要滿足一下兩個條件:①有半數以上的主節點將node標記為PFAIL狀態。②當前節點也將node標記為PFAIL狀態。

通訊狀態和維護

? ? ? ? 什么時候進行心跳?

? ? ? ? Redis節點會記錄其向每一個節點上一次發出ping和收到pong的時間,心跳發送時機與這兩個值有關。通過下面的方式既能保證及時更新集群狀態,又不至于使心跳次數過多:

? ? ? ? (1)每次Cron向所有未建立鏈接的節點發送ping或meet;

? ? ? ? (2)每1秒從所有已知節點中隨機選取5個,向其中上次收到的pong最久遠的一個發送ping。

? ? ? ? (3)每次Cron向收到pong超過timeout/2的節點發送pong;

? ? ? ? (4)收到ping或者meet,立即回復pong。

? ? ? ? 發送哪些心跳數據?

? ? ? ? (1)Header:發送者自己的信息,包括所負責的slots信息、主從信息、ip port信息和狀態信息。

? ? ? ? (2)gossip:發送者所了解的部分其他節點的信息,包括ping_sent,pong_received、ip,port信息、狀態信息(比如發送者認為該節點已經不可達,會在狀態信息中標記其為PFAIL或FAIL)。

? ? ? ? 如何處理心跳數據?

? ? ? ? (1)新節點的加入。發送meet包加入集群,從pong包中的gossip得到未知的其他節點。通過循環上述過程,直到最終加入集群。

? ? ? ? (2)slots信息。判斷發送者聲明的slots信息,跟本地記錄的是否有不同。如果不同,并且發送者epoch較大,更新本地記錄;如果不同,并且發送者epoch比較小,發送update信息通知發送者。

? ? ? ? (3)Master slave信息。發現發送者的master、slave信息變化,更新本地狀態。

? ? ? ? (4)節點FAIL探測(故障發現)。超過超時時間仍然沒有收到pong包的節點會被當前節點標記為PFAIL;PFAIL標記會隨著gossip傳播;每次收到心跳包會檢測其中對其他節點的PFAIL標記,當做對該節點FAIL的投票維護在本機;對某個節點的PFAIL標記達到大多數時,將其變為FAIL標記并廣播FAIL消息。

? ? ? ? gossip的存在使得集群狀態的改變可以更快的達到整個集群。每個心跳包中會包含多個gossip包,那么多少個才是合適的呢,Redis的選擇是N/10,其中N是節點數,這樣可以保證在PFAIL投票的過期時間內,節點可以收到80%機器關于失敗節點的gossip,從而使其順利進入Fail狀態。

? ? ? ? 如何將信息廣播給其它節點?

? ? ? ? 當需要發布一些非常重要需要立即送達的消息時,上述心跳+gossip的方式就顯得捉襟見肘了,這時就需要向所有集群內的機器廣播信息,使用廣播發的場景:

? ? ? ? 節點的Fail信息:當發現某一節點不可達時,探測節點會將其標記為PFAIL狀態,并通過心跳傳播出去。當某一節點發現這個節點的PFAIL超過半數時修改其為FAIL并發起廣播。

? ? ? ? Failover Request信息:slave嘗試發起FailOver時廣播其要求投票的信息。

? ? ? ? 新Master信息:Failover成功的節點向整個集群廣播自己的信息。

故障恢復

? ? ? ? 當slave發現自己的master變為FAIL狀態時,便嘗試進行Failover,以期成為新的Master。由于掛掉的Master可能會有多個Slave。Failover的過程需要經過類Raft協議的過程在整個集群內達到一致,具體的過程如下:

? ? ? ? (1)Slave發現自己的Master變為FAIL;

? ? ? ? (2)將自己記錄的集群currentepoch+1,并廣播Failover Request信息;

? ? ? ? (3)其他節點收到該消息,只有Master響應,判斷請求者的合法性,并發送FAILOVER_AUTH_ACK,對每一個epoch只發送一次ack;

? ? ? ? (4)嘗試Failover的Slave收集FAILOVER_AUTH_ACK;

? ? ? ? (5)超過半數后變為新Master;

? ? ? ? (6)廣播Pong通知其他集群節點。

? ? ? ? 這篇文章我們主要講解了Redis Cluster的狀態監測和維護,大家有什么問題或勘誤可以在評論區留言,筆者看到都會回復的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83777.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83777.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Step-Audio-AQAA 解讀:邁向「純語音」交互的端到端 LALM 新里程

引言:AI 從聽到說 大型音頻語言模型(Large Audio-Language Models, LALMs)正在徹底改變我們與機器交互的方式。我們不再滿足于簡單的文本問答,而是期望 AI 能夠像人類一樣,通過自然的語音進行交流,理解我們的意圖,并以富有表現力的聲音回應。然而,構建一個能夠直接從語…

基于邊緣計算的絲桿狀態實時監測系統設計?

基于邊緣計算的絲桿狀態實時監測系統設計,可從系統架構、各層功能設計、關鍵技術應用等方面入手,以下為詳細介紹: 系統架構設計 基于邊緣計算的絲桿狀態實時監測系統通常由感知層、邊緣層和云端三部分組成。感知層負責數據采集,…

LeetCode 每日一題 2025/6/9-2025/6/15

記錄了初步解題思路 以及本地實現代碼;并不一定為最優 也希望大家能一起探討 一起進步 目錄 6/9 440. 字典序的第K小數字6/10 3442. 奇偶頻次間的最大差值 I6/11 3445. 奇偶頻次間的最大差值 II6/12 3423. 循環數組中相鄰元素的最大差值6/13 2616. 最小化數對的最大…

PyTorch張量操作中dim參數的核心原理與應用技巧:

今天在搭建神經網絡模型中重寫forward函數時,對輸出結果在最后一個維度上應用 Softmax 函數,將輸出轉化為概率分布。但對于dim的概念不是很熟悉,經過查閱后整理了一下內容。 PyTorch張量操作精解:深入理解dim參數的維度規則與實踐…

Day 31

1. 規范的文件命名 核心原則: 清晰明確:文件名應準確描述內容(如data_preprocessing.py) 風格統一: 推薦小寫下劃線(Python慣例,如model_training.py) 或使用駝峰式&#xff08…

學習Oracle------認識VARCHAR2

學習Oracle------認識VARCHAR2 VARCHAR2 是 Oracle 數據庫中專門用于存儲可變長度字符串的數據類型,它是 Oracle 對標準 SQL 數據類型 VARCHAR 的增強和替代。以下是全面解析: 核心概念 名字含義: VAR Variable(可變&#xff09…

記錄jackson解析出錯

Jackson 屬性名大小寫 Bug 記錄 問題描述 在前后端交互過程中,前端傳遞的 JSON 字段名為駝峰風格(如 qTitle),后端 Java 實體類字段名也為駝峰(如 private String qTitle;)。 但在反序列化時,…

泰國數碼電商系統定制|3C產品詳情泰語化+售后管理,適配泰國數碼零售

隨著全球數字化的加速,電商行業正在迅速發展,尤其是以泰國為代表的東南亞市場。泰國不僅是一個擁有龐大消費者群體的市場,而且其日益增長的互聯網使用率和手機普及率使得數碼產品的銷售潛力巨大。在這樣的大背景下,針對泰國市場的…

59、定制化原理-SpringBoot定制化組件的幾種方式

59、定制化原理-SpringBoot定制化組件的幾種方式 在Spring Boot中,定制化組件的方式多樣,以下是幾種常見的方法及其原理: #### 修改配置文件 通過修改application.properties或application.yml文件,利用ConfigurationProperties注…

機器學習--分類

陽性(Positive)和陰性(Negative) 陽性(Positive) 正類:通常指的是我們關注的類別或事件;陰性(Negative) 負類: 指的是與陽性相反的類別或事件。…

三星MZQL2960HCJR-00BAL高性能固態硬盤控制器SSD云計算和高端存儲專用 電子元器件解析

MZQL2960HCJR-00BAL 電子元器件解析 1. 基本類型與功能 MZQL2960HCJR-00BAL 是 三星(Samsung) 推出的一款 企業級NVMe SSD主控芯片,屬于 高性能固態硬盤控制器,專為 數據中心、云計算和高端存儲 設計。 關鍵特性: 接…

Blender——建構、粒子、燈光、動畫

Blender是一款開源的三維建模和動畫軟件,可用于創建3D模型、動畫、渲染圖像和視頻,還支持雕刻、紋理繪制、粒子系統等功能。 建構篇: 基本操作: 視角的控制: 控制觀察視角: 鼠標中鍵 平移視圖: Shift鼠標中鍵 縮放視…

節日快樂啊

<section data-role"paragraph" class"_135editor"> <p> <br/> </p> </section> <p> 瑪哈特2025中國國際金屬成形展覽會邀請函 </p><style>* { margin: 0; …

PHP和Node.js哪個更爽?

先說結論&#xff0c;rust完勝。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最開始在蘇寧的時候寫了幾年php&#xff0c;當時覺得php真的是世界上最好的語言&#xff0c;因為當初活在舒適圈里&#xff0c;不愿意跳出來&#xff0c;就好比當初活在…

LeetCode - 387. 字符串中的第一個唯一字符

題目 387. 字符串中的第一個唯一字符 - 力扣&#xff08;LeetCode&#xff09; 思路 用哈希表統計每個字符出現的次數 創建一個 unordered_map<char, int>&#xff0c;遍歷字符串&#xff0c;把每個字符出現的次數存進去。 再遍歷字符串&#xff0c;找到第一個只出現…

python從環境變量和配置文件中獲取配置參數

前言 從環境變量和配置文件中獲取配置參數&#xff0c;相關庫&#xff1a; python-dotenv&#xff1a;第三方庫&#xff0c;需要使用pip安裝configparser&#xff1a;標準庫 代碼 test.ini [mysql] host "192.168.0.10" port 3306 user "root" pas…

HarmonyOS5 運動健康app(一):健康飲食(附代碼)

一、核心數據模型設計 代碼通過兩個接口構建了飲食管理的基礎數據結構&#xff1a; interface footItem {name: string; // 營養名稱&#xff08;蛋白質/碳水/脂肪&#xff09;weight: number; // 重量&#xff08;克&#xff09; }interface DietItem {name: string; // 食物…

MQ選型及RocketMQ架構總覽

一、什么是MQ MQ&#xff08;MessageQueue&#xff09; Message(消息)&#xff1a;消息是在不同進程之間傳遞的數據&#xff0c;這些進程可以在同一臺機器上&#xff0c;也可以在不同的機器上。 Queue&#xff08;隊列&#xff09;&#xff1a;隊列原意是指一種具有FIFO&#…

python與java的區別

java老程序員來學習python了&#xff0c;記錄一下兩種類型語言的區別&#xff1a; Python與Java變量類型對比 python里面定義變量不需要指定變量的數據類型&#xff0c;并且是可以修改成其他類型java里面定義變量要指定變量的數據類型&#xff0c;指定以后不可以修改成其他數據…

固件簽名技術深度解析:HSM模塊如何守護設備安全,CAS系統如何賦能產業升級

引言&#xff1a;數字時代的固件安全危機 在萬物互聯的今天&#xff0c;全球設備固件安全事件頻發&#xff1a;某汽車品牌因固件漏洞導致百萬車輛被遠程控制&#xff0c;某醫療設備廠商因固件篡改引發數據泄露&#xff0c;某工業控制系統因非法固件升級造成生產線癱瘓……這些…