Redis學習筆記(十六) Sentinel(哨兵)(下)

来源:https://www.cnblogs.com/xtt321/archive/2020/06/08/13069039.html
-Advertisement-
Play Games

消失了一段時間,我又回來啦。不多說,繼續把哨兵看完。 檢測主觀下線狀態 預設情況下,Sentinel會以每秒一次的頻率向所有與他創建了命令連接的實例(主從伺服器以及其他Sentinel)發送PING命令,並通過實例返回的PING命令回覆來判斷實例是否線上。 實例對PING命令的回覆可以分為兩種情況: ...


消失了一段時間,我又回來啦。不多說,繼續把哨兵看完。

 

檢測主觀下線狀態

預設情況下,Sentinel會以每秒一次的頻率向所有與他創建了命令連接的實例(主從伺服器以及其他Sentinel)發送PING命令,並通過實例返回的PING命令回覆來判斷實例是否線上。

實例對PING命令的回覆可以分為兩種情況:

有效回覆:實例返回+PONG、-LOADING、-MASTERDOWN三種回覆的其中一種。

無效回覆:實例返回除+PONG、-LOADING、-MASTERDOWN三種回覆之外的回覆或者規定時間內沒有收到任何回覆。

指定Sentinel判斷實例進入主觀回覆的時間長度是由Sentinel配置文件中的down-after-milliseconds選項指定的。

如果沒有收到master伺服器的回覆,Sentinel就會將master標記為主觀下線,併在master所對應的實例結構的flags屬性中打開SRI_S_DOWN標識。

 

檢查客觀下線狀態

當Sentinel將一個主伺服器判斷為主觀下線之後,為了確認這個主伺服器是否真的已經下線,它會向同樣監視這一主伺服器的其他Sentinel進行詢問,看他們是否也認為主伺服器已經進入下線狀態,當Sentinel從其他Sentinel那裡接收到足夠數量的已下線判斷後,Sentinel就會將主伺服器判定為科幻下線,並對主伺服器執行故障轉移操作。

使用 SENTINEL is-master-down-by-addr < ip >< port >< current_epoch >< runid >

當目標Sentinel收到源Sentinel發來的SENTINEL命令後,解析命令中的參數並根據主伺服器的ip埠號檢查主伺服器是否下線,然後回覆源Sentinel ,< down_state >< leader_runid >< leader_epoch >

根據其他Sentinel發回的SENTINEL命令回覆,統計其他SENTINEL同一主伺服器已下線的數量,當這一數量達到配置指定的判斷客觀下線所需要的數量時,Sentinel會將主伺服器實例結構flags屬性的SRI_O_DOWN標識打開,標識主伺服器已經進入客觀下線狀態。

 

選舉頭領Sentinel

當一個主伺服器被判斷為客觀下線時,監聽這個下線主伺服器的各個Sentinel會進行協商,選舉出一個頭領Sentinel,並由頭領Sentinel對下線主伺服器執行故障轉移操作。

1、所有線上的Sentinel都會有被選為頭領Sentinel的資格,換句話說,監視同一個主伺服器的多個線上Sentinel中的任何一個都有成為領頭Sentinel。

2、每次進行頭領Sentinel選舉之後,不論選舉是否成功,所有Sentinel的配置紀元的值都會自增一次,配置紀元實際上就是一個計數器。

3、在一個配置紀元所有Sentinel都有一次將某個Sentinel設置為局部頭領Sentinel的機會,並且局部領頭一旦設置,在這個配置紀元中就不能再次更改。

4、每個發現主伺服器進入客觀下線的Sentinel都會要求其他Sentinel將自己設置為局部頭領Sentinel。

5、當源Sentinel向目標Seninel發送SENTINEL is-master-down-by-addr命令,並且命令中runid不是*而是源Sentinel的運行ID時,這表示源Sentinel要求目標Sentinel將自己設置為局部頭領Sentinel。

6、Sentinel設置局部頭領Sentinel的規則是先到先得。

7、目標Sentinel在接收到SENTINEL is-master-down-by-addr命令之後,將向源Sentinel返回一條命令回覆,回覆中的leader_runid參數和leader_epoch分別記錄了目標Sentinel的局部頭領Sentinel的運行ID和配置紀元。

8、源Sentinel在接收到目標Sentinel返回的命令之後,會檢查回覆中leader_epoch參數的值和自己的配置紀元是否相同,如果相同,那麼源Sentinel繼續取出回覆中的leader_runid參數,如果leader_runid參數的值和源Sentinel的運行ID一致,那麼標識目標Sentinel將源Sentinel設置為局部頭領Sentinel。

9、如果某個Sentinel被半數以上的Sentinel設置為局部領頭Sentinel,那麼這個Sentinel就稱為頭領Sentinel。

10、如果在給定時間限制內,沒有一個Sentinel被選舉為頭領Sentinel,那麼各個Sentinel將在一段時間之後再次進行選舉,直到選出頭領Sentinel。

 

故障轉移

在選舉出頭領Sentinel之後,頭領Sentinel將對這個下線的伺服器執行故障轉移操作。

1、在已下線主伺服器屬下的所有從伺服器裡面,挑選出一個從伺服器,並將其轉換為主伺服器。

挑選過程:

(1)刪除列表中的所有處於下線或者斷線狀態的從伺服器。

(2)刪除列表中所有最近5秒內沒有服務過頭領Sentinel的INFO命令的從伺服器。

(3)刪除與已下線主伺服器連接斷開超過down-after-milliseconds * 10 毫秒的從伺服器。

(4)按照優先順序進行排序,如果優先順序最高的有多台,則按照偏移量最大的排序,如果還有多台,則按照運行ID排序取運行ID最小的從伺服器。

2、讓已下線主伺服器屬下的所有從伺服器改為複製新的主伺服器。

發送命令SLAVEOF < 新主伺服器的IP ><新主伺服器的PORT>

3、將已下線主伺服器設置為新的主伺服器的從伺服器,當這個舊的主伺服器重新上線時,他就會成為新的主伺服器的從伺服器。


每天學一點,總會有收穫。

說明:尊重作者知識產權,文中內容參考《Redis設計與實現》,僅在此做學習與大家分享。


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 在本章中,主要是藉機這個C#基礎篇的系列整理過去的學習筆記、歸納總結並更加理解透徹。 在.Net開發中,我們經常會遇到並使用過委托,如果能靈活的掌握並加以使用會使你在編程中游刃有餘,然後對於很多接觸C#時間不長的開發者而言,較好的理解委托和事件並不容易。 本節主要是講述對委托的定義、委托的使用 ...
  • 在打開頁面時報錯:無法使用前導 .. 在頂級目錄上退出 原因:頂級目錄不能使用../ 經過查找,發現站點地圖裡出問題了 把../去掉後正常 或者在地址前加~/(表示應用程式的根目錄) ...
  • 一、WPF介紹 WPF全稱 Windows Presentation Foundation,幹啥用的? 主要是用來製作Windows桌面客戶端軟體的。 .Net平臺下製作Windows桌面客戶端軟體主要有兩個,一個Winform,還有一個就是WPF了。 事件驅動時代:開發客戶端便採用Winform, ...
  • 最近刷題倒是沒停,但是感覺大部分遇到的不是很適合拿來水博客,畢竟方法套路比較相似。年兄推薦下做了兩道首碼和的題,感覺這類題型的思路很棒,也可以歸納成一個方法,故再來水一篇。題目均來自力扣Leetcode,傳送門。 簡單來說,首碼和適合於解決 連續,求和 相關的問題。遇到的問題如果包含相關要求,可以考 ...
  • 一:背景 1. 講故事 最近也是奇怪,在社區里看到好幾篇文章聊static的玩法以及怎麼拿這個和麵試官扯半個小時,有點意思,點進去看都是java版的,這就沒意思了,怎麼也得有一篇和麵試官扯C#中的 static用法撒,既然沒有人開這個頭,那我就獻醜了。。。,下麵以QA的方式記述,大家可以代入一下能回 ...
  • SRAM大多是由CMOS管組成的揮發性靜態存儲器。在掉電後存儲器中所存數據就會丟失。隨機靜態存儲器可以對任何地址進行讀寫操作,通過鎖存器的原理對數據進行保存,在無操作狀況下,鎖存器處於穩態,保持數據穩定,不用進行周期性的電荷刷新。SRAM由基本單元構成的陣列以及外圍電路構成,其中陣列的劃分和外圍電路 ...
  • 摘自:https://www.cnblogs.com/zhuchenglin/p/8686924.html 1. /bin目錄 / b i n目錄包含了引導啟動所需的命令或普通用戶可能用的命令(可能在引導啟動後)。這些命令都是二進位文件的可執行程式( b i n是b i n a r y - -二進位 ...
  • docker-distribution搭建的倉庫非常簡陋,它甚至連一個用戶認證都沒有,更別提多用戶;今天我們來介紹另外一款docker倉庫工具harbor;harbor這款工具相對docker-distribution來講功能上豐富了許多;它支持多租戶,可擴展的API和web ui ,支持跨多個h... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...