Redis 7.x 系列【23】哨兵模式

有道無術,術尚可求,有術無道,止于術。

本系列Redis 版本 7.2.5

源碼地址:https://gitee.com/pearl-organization/study-redis-demo

文章目錄

    • 1. 概述
    • 2. 工作原理
      • 2.1 監控
      • 2.2 標記下線
      • 2.3 哨兵領袖
      • 2.4 新的主節點
      • 2.5 通知更新
    • 3. 搭建演示
      • 3.1 安裝
      • 3.2 修改配置
      • 3.3 啟動
      • 3.4 測試

1. 概述

官方文檔

主從復制模式常用于數據備份和讀寫分離,當主節點故障時,需要人工干預來處理主節點故障和從節點的升級,在實際應用中,可用性并不高。

Redis 提供了基于哨兵(Sentinel)的高可用解決方案,Sentinel是一個運行在特殊模式下的 Redis 服務端,本身不存儲任何數據,而是作為主從復制模式下的監控和管理工具。當主節點出現故障時,可以提供自動故障轉移功能,從而保證 Redis 服務的連續性和穩定性。

核心功能:

  • 監控:持續檢查主節點和從節點實例是否按預期工作
  • 通知:可以通過 API 通知系統管理員或其他計算機程序,被監控的Redis實例出現問題
  • 自動故障轉移:如果主節點未按預期工作,啟動故障轉移過程,將其中一個從節點被提升為主節點,其他的從節點重新配置使用新的主節點,并且通知在連接時使用的新地址
  • 配置中心:客戶端通過連接哨兵來獲得當前Redis服務的主節點地址

2. 工作原理

2.1 監控

Redis Sentinel 在啟動完成后,首先需要連接到到主從節點進行監控:

在這里插入圖片描述

Sentinel 配置文件中,首先需要配置主節點的地址,首次上線時,會根據該地址連接到主節點,并定期(通常是每1秒)向主節點發送 PING 命令來檢查其狀態。

Sentinel 連接到主節點后,還會通過 INFO 命令獲取所有從節點的地址信息,建立和從節點的連接,并同樣采用心跳機制進行狀態檢查。

多個 Sentinel 節點之間,也需要進行通信,會在主節點中建立一個 __sentinel__:hello 專用通道,利用發布訂閱機制進行數據交互。可以使用可視化工具查看:

在這里插入圖片描述

2.2 標記下線

當某個 Sentinel 節點發送 PING 命令后,主節點在規定的時間內沒有響應,則會標記為主觀下線Subjectively Down)狀態,其他 Sentinel 節點同樣也會檢測到主節點下線,并標記為主觀下線。當主節點被足夠數量的 Sentinel 節點都標記為 S_DOWN ,則標記為客觀下線Objectively Down)狀態。

sentinel monitor 配置項中,可以設置主節點被多少個 Sentinel 標記為 S_DOWN 時,則標記為O_Down

sentinel monitor mymaster 127.0.0.1 6379 2

主觀下線客觀下線,需要多個哨兵達成一致意見,才能認為主節點客觀上已經宕掉,這一步驟是為了防止單個 Sentinel 節點的誤判。

2.3 哨兵領袖

當主節點被判定為客觀下線后,哨兵節點之間會進行投票選舉,以選出哨兵領袖(Leader Sentinel),負責后續的故障轉移工作。

整個選舉過程基于 Raft 算法,當半數以上的哨兵投票通過后就認定該哨兵為哨兵領袖,所以一般將哨兵數量部署為單數,避免腦裂

2.4 新的主節點

Leader Sentinel 會在從節點中,選擇一個新的主節點,選擇的標準一般有:

  • 響應速度,慢的就會被優先過濾掉,說明健壯性不夠
  • 節點配置的優先級,優先級越高,越容易被選中
  • 數據偏移量,偏移量越大,說明數據復制的完整度越高
  • 節點創建時間,越早創建的節點,會優先選擇( 根據RunId 排序)

選出新的主節點后,Leader Sentinel 會調用 REPLICAOF 命令將選出的新節點升級為主節點,其他的從節點更新配置信息,并連接到新的主節點,并確保和新主節點之間的數據同步。

2.5 通知更新

Leader Sentinel 通過發布訂閱通知其他哨兵節點,還可以通過 API 或者腳本發送通知,報告集群的狀態變化和故障情況。

3. 搭建演示

數據節點直接使用之前搭建的一主兩從環境,在此基礎上搭建三個哨兵節點,簡要部署架構圖如下:

在這里插入圖片描述
所有節點網絡訪問地址如下 :

  • 主節點:192.168.56.101:6379
  • 從節點一:192.168.56.102:6379
  • 從節點二:192.168.56.103:6379
  • 哨兵節點一:192.168.56.104:26379
  • 哨兵節點二:192.168.56.105:26379
  • 哨兵節點三:192.168.56.106:26379

3.1 安裝

Redis 7.x 系列【2】單機部署
Redis 7.x 系列【21】主從復制

Redis Sentinel也是一個特殊的 Redis 服務端,安裝方法和普通的 Redis 一樣,參考上面的文檔,在三臺哨兵服務器上安裝即可。

3.2 修改配置

接下來需要修改所有哨兵節點的配置文件,首先從源碼中將 sentinel.conf 配置文件復制到配置目錄:

[root@localhost /]# mkdir /etc/redis
[root@localhost /]# cp ~/redis-7.2.5/sentinel.conf /etc/redis/
[root@localhost bin]# vim sentinel.conf

三個哨兵節點都需要修改配置,首先允許后臺啟動:

daemonize yes

配置當前監控的主節點的名稱、IP、端口,以及進行故障轉移的最少的投票數:

sentinel monitor mymaster 192.168.56.101 6379 2

如果主從節點設置了密碼,還需要配置主節點名稱、認證密碼 (主從密碼需要保持一致):

sentinel auth-pass mymaster 123456

可以配置 Sentinel 節點的密碼(其他哨兵節點的密碼需要保持一致):

requirepass entinel123456

3.3 啟動

這里直接使用命令啟動,先啟動所有主從復制節點,再啟動所有哨兵節點:

[root@localhost bin]# cd /usr/local/bin
[root@localhost bin]# ./redis-sentinel /etc/redis/sentinel.conf

3.4 測試

使用 ./redis-cli 連接任一哨兵節點:

[root@localhost bin]# ./redis-cli -p 26379
127.0.0.1:26379> auth sentinel123456
OK

輸入 info sentinel 查看所有哨兵信息,可以看到當前連接的主節點地址為 192.168.56.101:6379 ,以及從節點和哨兵節點的數量:

127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.56.101:6379,slaves=2,sentinels=3

在主節點服務器上,直接 kill 掉主節點進程:

[root@localhost bin]# ps -ef | grep redis
root     16305     1  0 01:05 ?        00:00:29 ./redis-server *:6379
root     19902 19252  0 11:18 pts/2    00:00:00 grep --color=auto redis
[root@localhost bin]# kill 16305

再次執行 info sentinel 命令,可以看到主節點地址變成了 192.168.56.102:6379 ,自動進行了故障轉移,并選舉了新的主節點(當之前下線的主節點重新連接后,會降級為從節點):

127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.56.102:6379,slaves=3,sentinels=3

查看 sentinel.conf 配置文件,可以看到自動更新了主節點:

在這里插入圖片描述

還會自動更新從節點 redis.conf 配置文件:

在這里插入圖片描述

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

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

相關文章

請求響應(后端必備)

一、請求 1.簡單參數 原始方式: 在原始的web程序中,獲取請求參數,需要通過HttpServletRequest對象手動獲取 RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name request.getP…

什么叫價內期權?直接帶你了解期權價內期權怎么使用?!

今天帶你了解什么叫價內期權?直接帶你了解期權價內期權怎么使用?!價內期權是具有內在價值的期權。期權持有人行權時,對看漲期權而言,行權價格低于標的證券結算價格;對看跌期權而言,標的證券結算…

js 請求blob:https:// 圖片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

前端Vue組件化實踐:自定義加載組件的探索與應用

在前端開發領域,隨著業務邏輯復雜度的提升和系統規模的不斷擴大,傳統的開發方式逐漸暴露出效率低下、維護困難等問題。為了解決這些挑戰,組件化開發作為一種高效、靈活的開發模式,受到了越來越多開發者的青睞。本文將結合實踐&…

Java基礎及進階

JAVA特性 基礎語法 一、Java程序的命令行工具 二、final、finally、finalize 三、繼承 class 父類 { //代碼 }class 子類 extends 父類 { //代碼 }四、Vector、ArrayList、LinkedList 五、原始數據類型和包裝類 六、接口和抽象類 JAVA進階 Java引用隊列 Object counter ne…

PostgreSQL行級安全策略探究

前言 最近和朋友討論oracle行級安全策略(VPD)時,查看了下官方文檔,看起來VPD的原理是針對應用了Oracle行級安全策略的表、視圖或同義詞發出的 SQL 語句動態添加where子句。通俗理解就是將行級安全策略動態添加為where 條件。那么PG中的行級安全策略是怎…

搭建基于 ChatGPT 的問答系統

搭建基于 ChatGPT 的問答系統 📣1.簡介📣2.語言模型,提問范式和 token?2.1語言模型?2.2Tokens?2.3Helper function輔助函數(提問范式) 📣3.評估輸入-分類📣4.檢查輸入-審核?4.1審核4.1.1 我…

使用UDP通信接收與發送Mavlink2.0協議心跳包完整示例

1.克隆mavlink源碼 https://github.com/mavlink/mavlink.git 2.進入mavlink目錄,安裝依賴 python3 -m pip install -r pymavlink/requirements.txt 3.生成Mavlink的C頭文件 mavlink % python3 -m pymavlink.tools.mavgen --lang=C --wire-protocol=2.0 --output=generated…

1-5歲幼兒胼胝體的表面形態測量

摘要 胼胝體(CC)是大腦中的一個大型白質纖維束,它參與各種認知、感覺和運動過程。盡管CC與多種發育和精神疾病有關,但關于這一結構的正常發育(特別是在幼兒階段)還有很多待解開的謎團。雖然早期文獻中報道了性別二態性,但這些研究的觀察結果…

【Linux網絡】select{理解認識select/select與多線程多進程/認識select函數/使用select開發并發echo服務器}

文章目錄 0.理解/認識回顧回調函數select/pollread與直接使用 read 的效率差異 1.認識selectselect/多線程(Multi-threading)/多進程(Multi-processing)select函數socket就緒條件select的特點總結 2.select下echo服務器封裝套接字…

C++ 類和對象 賦值運算符重載

前言: 在上文我們知道數據類型分為自定義類型和內置類型,當我想用內置類型比較大小是非常容易的但是在C中成員變量都是在類(自定義類型)里面的,那我想給類比較大小那該怎么辦呢?這時候運算符重載就出現了 一 運算符重載概念&…

安全防御:防火墻基本模塊

目錄 一、接口 1.1 物理接口 1.2 虛擬接口 二、區域 三、模式 3.1 路由模式 3.2 透明模式 3.3 旁路檢測模式 3.4 混合模式 四、安全策略 五、防火墻的狀態檢測和會話表技術 一、接口 1.1 物理接口 三層口 --- 可以配置IP地址的接口 二層口: 普通二層…

Java面試題:分庫分表

分庫分表 當數據量非常大時,就需要通過分庫分表的方式進行壓力分攤,避免數據庫訪問壓力過大 分庫分表的前提: 業務數據達到一定量級:單表數據量達到1000w或20g 優化解決不了性能問題 分庫分表策略 垂直拆分 垂直分庫 以表為依據,根據業務將不同表拆分到不同庫中 eg:根…

車載終端_RTK定位|4路攝像頭|駕駛輔助系統ADAS定制方案

現代車輛管理行業的發展趨勢逐漸向智能化和高效化方向發展,車載終端成為關鍵的工具之一。在這個背景下,一款特別為車隊管理行業設計的車載終端應運而生。該車載終端采用8寸多點觸控電容屏,搭載聯發科四核處理器,主頻2.0GHz&#x…

如何安裝node.js

Node.js Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行時環境。 主要特點和優勢: 非阻塞 I/O 和事件驅動:能夠高效處理大量并發連接,非常適合構建高并發的網絡應用,如 Web 服務器、實時聊天應用等。 例如,在…

FeignClient詳解

FeignClient 是 Spring Cloud Open Feign 中的一個注解,它用于定義一個 Feign 客戶端,Feign 是一個聲明式的 Web 服務客戶端,使得編寫 Web 服務客戶端變得更加簡單。以下是 FeignClient 注解的詳細說明: 定義 Feign 客戶端&#x…

網絡安全——防御(防火墻)帶寬以及雙機熱備實驗

12,對現有網絡進行改造升級,將當個防火墻組網改成雙機熱備的組網形式,做負載分擔模式,游客區和DMZ區走FW3,生產區和辦公區的流量走FW1 13,辦公區上網用戶限制流量不超過100M,其中銷售部人員在其…

Swift入門筆記

Swift入門筆記 簡單值控制流函數和閉包對象和類枚舉和結構體并發協議和擴展錯誤處理泛型 簡單值 // 聲明變量 var myVariable 42 myVariable 50// 聲明常量 let myConstant 42// 聲明類型 let implicitInteger 70 let implicitDouble 70.0 let explicitDouble: Double 7…

排序相關算法--3.選擇排序

之前涉及的堆排序就是選擇排序的一種,先進行選擇。 基本選擇排序: 最簡單,也是最沒用的排序算法,時間復雜度高并且還是不穩定的排序方法,項目中很少會用。 過程: 在一個長度為 N 的無序數組中,…