Redis--哨兵機制詳解

1. 哨兵機制簡介

Redis Sentinel(哨兵)是Redis的高可用性解決方案,它提供了監控、通知、自動故障轉移和配置提供者等功能。Sentinel系統可以監控多個Redis主服務器及其從服務器,并在主服務器失效時自動進行故障轉移,確保Redis服務的可用性。

Redis Sentinel最初在Redis 2.8版本中引入,并在后續版本中不斷優化和完善。它是Redis官方推薦的高可用性解決方案,適用于生產環境中對Redis服務可靠性要求較高的場景。

2. 哨兵機制解決的問題

Redis Sentinel主要解決以下問題:

  1. 單點故障:傳統的Redis主從結構中,主節點故障后需要手動切換,導致服務中斷
  2. 故障檢測:自動檢測Redis實例是否正常運行
  3. 故障轉移:當主節點故障時,自動選舉新的主節點并調整從節點配置
  4. 配置中心:為客戶端提供服務發現功能,獲取可用的Redis服務器地址

3. 哨兵架構

Redis Sentinel的架構包含以下組件:

  1. Sentinel節點:監控Redis主從實例的特殊Redis服務器,運行在特殊模式下
  2. 主節點(Master):處理寫操作的Redis服務器
  3. 從節點(Slave/Replica):復制主節點數據的Redis服務器

Sentinel系統通常由多個Sentinel節點組成,這些節點互相通信并對Redis實例進行監控。為了防止誤判和腦裂問題,Sentinel采用分布式協商機制,要求大多數Sentinel節點達成共識才能執行故障轉移。

4. 哨兵工作原理

4.1 監控機制

Sentinel通過定期發送PING命令來檢測Redis實例是否存活。當一個實例在指定時間內(默認為30秒)沒有響應,或者返回錯誤,Sentinel會將該實例標記為"主觀下線"(Subjectively Down,簡稱SDOWN)。

4.2 故障判定

當一個Sentinel將主節點標記為"主觀下線"后,會詢問其他Sentinel節點是否同意該判斷。如果達到配置的法定數量(quorum)的Sentinel也認為主節點故障,則該主節點被標記為"客觀下線"(Objectively Down,簡稱ODOWN),觸發故障轉移流程。

4.3 故障轉移過程

故障轉移包括以下步驟:

  1. 選舉領導者Sentinel:使用Raft算法選舉一個Sentinel作為領導者,負責執行故障轉移
  2. 選擇新的主節點:領導者Sentinel根據從節點的優先級、復制偏移量、運行ID等因素,選擇一個從節點升級為新的主節點
  3. 配置其他從節點:讓其他從節點復制新的主節點
  4. 更新配置:將故障的舊主節點標記為從節點,在其恢復后會自動成為新主節點的從節點

5. Sentinel配置

5.1 基本配置

一個典型的Sentinel配置文件(sentinel.conf)如下:

# 監控的主節點,名稱為mymaster,IP為127.0.0.1,端口為6379,法定人數為2
sentinel monitor mymaster 127.0.0.1 6379 2# 判定主節點主觀下線的超時時間(毫秒)
sentinel down-after-milliseconds mymaster 30000# 故障轉移超時時間(毫秒)
sentinel failover-timeout mymaster 180000# 同時進行故障轉移的從節點數量
sentinel parallel-syncs mymaster 1

5.2 重要配置參數

  1. quorum:判定主節點客觀下線所需的Sentinel數量
  2. down-after-milliseconds:Sentinel判定實例為主觀下線的超時時間
  3. failover-timeout:故障轉移的超時時間
  4. parallel-syncs:故障轉移時,可以同時從新主節點同步數據的從節點數量
  5. notification-script:故障發生時執行的通知腳本
  6. client-reconfig-script:故障轉移后執行的客戶端重配置腳本

6. Sentinel通信與發現機制

6.1 Sentinel之間的通信

Sentinel節點通過Redis的發布訂閱功能進行通信,每個Sentinel會訂閱__sentinel__:hello頻道,并定期向該頻道發送自身信息。通過這種方式,Sentinel節點可以發現其他Sentinel節點。

6.2 Sentinel與Redis的通信

Sentinel通過以下方式與Redis實例通信:

  1. 定期PING:檢測Redis實例是否存活
  2. INFO命令:獲取主從關系、復制狀態等信息
  3. 發布訂閱:通過__sentinel__:hello頻道與其他Sentinel通信
  4. 配置修改命令:在故障轉移時重新配置Redis實例

7. 實際應用案例

7.1 部署三個Sentinel節點

推薦至少部署3個Sentinel節點,并分布在不同的物理機器上,以防止單點故障。

# 啟動三個Sentinel實例
redis-sentinel sentinel1.conf
redis-sentinel sentinel2.conf
redis-sentinel sentinel3.conf

7.2 客戶端連接示例(Java)

使用Jedis客戶端連接Sentinel系統:

JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster",                                      // 主節點名稱Set.of("127.0.0.1:26379", "127.0.0.1:26380", "127.0.0.1:26381"),  // Sentinel地址new JedisPoolConfig()                            // 連接池配置
);try (Jedis jedis = sentinelPool.getResource()) {// 使用jedis執行Redis命令jedis.set("key", "value");String value = jedis.get("key");System.out.println(value);
}

使用Lettuce客戶端連接Sentinel系統:

RedisClient redisClient = RedisClient.create();
RedisSentinelAsyncCommands<String, String> connection = redisClient.connectSentinelAsync();// 獲取主節點信息
RedisMasterAsync masterAsync = connection.getMasterAddrByName("mymaster");
masterAsync.thenAccept(master -> {System.out.println("Master: " + master);
});// 連接到Redis主節點
RedisURI sentinelUri = RedisURI.Builder.sentinel("127.0.0.1", 26379, "mymaster").build();
StatefulRedisConnection<String, String> connection = redisClient.connect(sentinelUri);
RedisCommands<String, String> commands = connection.sync();// 執行Redis命令
commands.set("key", "value");
String value = commands.get("key");
System.out.println(value);

8. 最佳實踐與注意事項

8.1 部署建議

  1. 至少三個Sentinel節點:確保高可用和避免腦裂
  2. 分布式部署:Sentinel節點應部署在不同的物理機器上
  3. 合理設置quorum:通常為Sentinel總數的一半加一
  4. 調整超時參數:根據網絡狀況調整down-after-milliseconds等參數

8.2 常見問題與解決方案

  1. 網絡分區導致腦裂:合理設置quorum和部署位置可減少腦裂風險
  2. 誤判下線:調整down-after-milliseconds參數,避免網絡抖動導致的誤判
  3. 客戶端配置:確保客戶端支持Sentinel,并正確配置連接池

8.3 監控與維護

  1. 監控Sentinel日志:及時發現異常情況
  2. 監控故障轉移事件:關注故障轉移的頻率和原因
  3. 定期檢查配置:確保配置參數符合當前系統需求

9. Sentinel與Redis Cluster對比

特性SentinelRedis Cluster
主要目的高可用性高可用性 + 數據分片
數據分布每個節點存儲全量數據數據分片到多個節點
擴展性受單機容量限制可水平擴展
部署復雜度相對簡單較復雜
適用場景數據量不大但需要高可用大數據量且需要擴展

10. 總結

Redis Sentinel是Redis官方提供的高可用性解決方案,通過監控、故障檢測和自動故障轉移機制,確保Redis服務的可靠性。在實際應用中,合理配置Sentinel系統,可以有效防止單點故障,提高系統的可用性。

對于數據量不大但對可用性要求高的場景,Redis Sentinel是一個理想的選擇。而對于需要處理大量數據并要求可擴展性的場景,可以考慮使用Redis Cluster。

無論選擇哪種方案,都需要根據實際業務需求進行合理的配置和調優,確保Redis服務的穩定運行。

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

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

相關文章

無人機機體結構設計要點難點分析

一、 設計要點1.輕量化&#xff1a;核心目標&#xff1a; 最大程度減輕結構重量&#xff0c;提升有效載荷能力、續航時間、飛行速度和機動性。實現手段&#xff1a; 選用高比強度/比剛度材料&#xff08;碳纖維復合材料、航空鋁合金、鈦合金、工程塑料&#xff09;、拓撲優化、…

AI時代的數據庫革命:電科金倉的“融合+AI“戰略解析

在人工智能時代的大變局下&#xff0c;數據庫要走向何方&#xff1f; 7月15日&#xff0c;中國電科旗下金倉數據庫以一場名為“融合進化 智領未來”的發布會&#xff0c;提出了自己的核心主張&#xff1a;真正的未來數據庫&#xff0c;是“融合”為體&#xff0c;“AI”為用。電…

與deepseek的問答:dot net與Borland VCL的關系

Borland VCL與.NET/C#關系分析borland delphi如神一般地存在&#xff01;試分析.net、c#與Borland VCL的關系。Borland Delphi及其VCL&#xff08;Visual Component Library&#xff09;框架在軟件開發史上確實具有傳奇地位&#xff0c;尤其在Windows桌面應用開發領域。而隨著.…

SAP在未啟用負庫存的情況下,庫存卻出現了負數-補充S4 1709 BUG

SAP在未啟用負庫存的情況下&#xff0c;庫存卻出現了負數-補充S4 1709 BUG共用物料合并發料&#xff1a;單行發料數量沒有超過庫存數量&#xff0c;但合計發料數量超過庫存數量了&#xff0c;系統還是可以過賬&#xff0c;沒有任何提示&#xff0c;如下圖所示&#xff1a;庫存數…

SpringBoot項目中常見注解

RequiredArgsConstructor 注解 類上添加該注解&#xff0c;Lombok 會自動生成一個構造函數&#xff0c;用于注入 final 或 NonNull 修飾的字段 ConfigurationProperties注解 用于將配置文件中的屬性注入到某個類的字段上 sky:jwt:admin-secret-key: itcastadmin-ttl: 7200000ad…

一鍵修復ipynb,Jupyter Notebook損壞文件

背景最近在寫一個數據分析項目時&#xff0c;不幸遇到了 斷電導致電腦重啟 的突發情況。當我再次打開 Jupyter Notebook 文件&#xff08;.ipynb&#xff09;時&#xff0c;發現文件已經損壞&#xff0c;Jupyter 無法正常讀取它&#xff0c;甚至有時直接報錯&#xff1a;Unread…

React入門學習——指北指南(第三節)

React 組件 在前面的內容中,我們了解了 React 的基礎知識和入門案例。本節將深入探討 React 中最核心的概念之一 —— 組件。組件是構建 React 應用的基礎,理解組件的工作原理和使用方法,對于掌握 React 開發至關重要。 什么是組件? 在 React 中,組件是具有獨立功能和 …

容器化環境下的服務器性能瓶頸與優化策略

更多云服務器知識&#xff0c;盡在hostol.com在容器化環境中&#xff0c;性能優化并不是一個簡單的“加硬件”或“增加資源”就能解決的問題。隨著技術的進步&#xff0c;越來越多的公司選擇使用容器技術&#xff08;如Docker、Kubernetes&#xff09;來提高應用的靈活性、可移…

GaussDB 數據庫架構師修煉(八) 等待事件(2)-ASP報告分析

1 ASP報告簡介ASP-Active Sesion Profile &#xff08;活躍會話檔案信息&#xff09;&#xff0c;ASP每秒獲取活躍會話事件&#xff0c;放到內存中&#xff0c;內存中的數據達閾值&#xff0c;會落盤gs_asp表中。ASP Report根據輸入的時間段與slot個數&#xff0c;從內存和磁盤…

CentOS7 安裝 Redis

在 CentOS 7 上配置 Redis 服務器需要完成安裝、配置和服務管理。以下是詳細步驟&#xff1a;安裝 Redis安裝依賴&#xff1a;yum install -y gcc tcl下載并解壓 Redis&#xff1a;cd /usr/local/wget https://download.redis.io/releases/redis-6.2.6.tar.gztar -zxvf redis-6…

《C++ list 完全指南:從基礎到高效使用》

《C list 完全指南&#xff1a;從基礎到高效使用》 文章目錄《C list 完全指南&#xff1a;從基礎到高效使用》一、forward_list和list比較二、list的接口介紹1.list的構造2.list iterator的使用3.list的容量操作4.list的訪問操作5.list的其他操作接口三、list的迭代器失效四、…

CIU32L051 DMA+Lwrb環形隊列實現串口無阻塞性數據的收發 + 數據百分百不丟失的實現

1.Lwrb的介紹&#xff08;博主功能的實現是基于RT-thread系統實現&#xff09; Lwrb是由Tilen Majerle編寫的一個線程安全的環形隊列&#xff0c;通常與DMA配合實現數據的無阻塞性收發&#xff0c;同時&#xff0c;配合DMA的傳輸過半中斷&#xff0c;傳輸完成中斷&#xff0c;以…

【C++】C++ 的入門知識2

本篇文章主要講解 C 的入門語法知識引用、inline 關鍵字與 nullptr 關鍵字。 目錄 1 引用 1&#xff09; 引用的概念與定義 &#xff08;1&#xff09; 引用的概念 &#xff08;2&#xff09; 引用的定義 2&#xff09; 引用的特性 3&#xff09; 引用的使用場…

基于Kafka實現動態監聽topic功能

生命無罪&#xff0c;健康萬歲&#xff0c;我是laity。 我曾七次鄙視自己的靈魂&#xff1a; 第一次&#xff0c;當它本可進取時&#xff0c;卻故作謙卑&#xff1b; 第二次&#xff0c;當它在空虛時&#xff0c;用愛欲來填充&#xff1b; 第三次&#xff0c;在困難和容易之間&…

機械學習初識--什么是機械學習--機械學習有什么重要算法

一、什么是機械學習機器學習&#xff08;Machine Learning&#xff09;是人工智能&#xff08;AI&#xff09;的一個重要分支&#xff0c;它使計算機能夠通過數據自動學習規律、改進性能&#xff0c;并在沒有明確編程的情況下完成特定任務。其核心思想是讓機器從數據中 “學習”…

普通大學生大三這一年的想法

目錄 大三期間的經歷與反思 公益活動&#xff1a;社會責任感的體現 比賽&#xff1a;個人成長的助推器 培訓與思想提升 大學教育的本質與人才培養 構建自我的道與未來規劃 大學教育的未來與個人定位 結語 大三期間的經歷與反思 大三&#xff0c;大學生活的分水嶺&#…

Python——入門

目錄 變量 變量類型 動態類型 注釋 輸出輸入 運算符 算術運算符 關系運算符 邏輯運算符 賦值運算符 條件語句 循環語句 函數 函數作用域 函數嵌套調用 函數默認參數 關鍵字參數 列表 切片 列表遍歷 新增元素 查找元素 刪除元素 列表拼接 元組…

華為榮耀部分機型從鴻蒙降回EMUI的一種方法

一、準備說明 1、這里介紹使用華為手機助手、海外代理軟件結合固件將部分華為榮耀手機鴻蒙系統降級回EMUI系 統的一種方式&#xff1b; 2、需要降級的手機需要再出廠時內置系統為EMUI&#xff0c;出廠時為鴻蒙系統的無法進行降級操作&#xff1b; 3、降級有風險&#xff0…

maven <dependencyManagement>標簽的作用

作用 dependencyManagement標簽的作用&#xff1a;在父工程pom文件中聲明依賴&#xff0c;但不引入&#xff1b;在子工程中用到聲明的依賴時&#xff0c;可以不加依賴的版本號&#xff0c;這樣可以統一管理工程中用到的依賴版本。 示例 先創建一個項目 dependencyManagement-de…

JSON格式化與結構對比

說明 功能格式化json字符串為最簡格式&#xff0c;并標識值類型&#xff1b;比對json字符串結構。第三方依賴fastjson: 用于解析json、判斷json值類型&#xff1b;springframework自帶的字符串判斷&#xff0c;可以不依賴該方法&#xff0c;改為自行實現&#xff1b;slf4j: 用于…