【Redis】哨兵(Sentinel)機制

文章目錄

  • 1. Redis Sentinel的概念
    • 1.1 基本概念
    • 1.2 引出高可用
  • 2. Redis Sentinel的部署(基于docker)
    • 2.1 部署
    • 2.2 驗證
    • 2.3 選舉流程

在這里插入圖片描述
Redis 的主從復制模式下,?旦主節點由于故障不能提供服務,需要人工進行主從切換,同時?量的客?端需要被通知切換到新的主節點上,對于上了?定規模的應用來說,這種?案是無法接受的,于是Redis從2.8開始提供了RedisSentinel(哨兵)來解決這個問題

1. Redis Sentinel的概念

1.1 基本概念

在介紹RedisSentinel之前,先對?個名詞概念進?必要的說明
在這里插入圖片描述
Redis Sentinel 是Redis 的?可?實現?案,在實際的?產環境中,對提?整個系統的?可?是?常有幫助的

1.2 引出高可用

主從復制模式很好,但是并不是萬能的,它同樣遺留下以下?個問題:

  1. 主節點發?故障時,進?主從切換的過程是復雜的,需要完全的??參與,導致故障恢復時間?法保障。
  2. 主節點可以將讀壓?分散出去,但寫壓?/存儲壓?是?法被分擔的,還是受到單機的限制。

其中第?個問題是高可用問題,即Redis哨兵主要解決的問題;第?個問題是屬于存儲分布式的問題,留給Redis集群去解決。

人工恢復主節點故障
Redis 主從復制模式下,主節點故障后需要進?的人工工作是?較繁瑣的,我們在圖中?致展?了整體過程

在這里插入圖片描述
在這里插入圖片描述

哨兵?動恢復主節點故障

當主節點出現故障時,RedisSentinel能?動完成故障發現和故障轉移,并通知應用方,從?實現真正的?可?。

Redis Sentinel 是?個分布式架構,其中包含若?個Sentinel節點和Redis數據節點,每個Sentinel 節點會對數據節點和其余Sentinel節點進?監控(這些進程之間,建立tcp長連接,定期發送心跳包)。

  • 當它發現節點不可達時,會對節點做下線表示。
  • 如果下線的是主節點,它還會和其他的Sentinel節點進?“協商”(防止誤判),當?多數Sentinel節點對主節點不可達這個結論達成共識之后,它們會在內部“選舉”出?個領導節點來完成?動故障轉移的?作,同時將這個變化實時通知給Redis應用方。

整個過程是完全?動的,不需要人工介入
在這里插入圖片描述

針對主節點故障的情況,故障轉移流程?致如下:

  1. 主節點故障,從節點同步連接中斷,主從復制停?。
  2. 哨兵節點通過定期監控發現主節點出現故障。哨兵節點與其他哨兵節點進?協商,達成多數認同主節點故障的共識。這步主要是防?該情況:出故障的不是主節點,?是發現故障的哨兵節點,該情況經常發?于哨兵節點的?絡被孤?的場景下。
  3. 哨兵節點之間使?Raft算法選舉出?個領導??,由該節點負責后續的故障轉移?作。
  4. 哨兵領導者開始執?故障轉移:從節點中選擇?個作為新主節點(slaveof no one);讓其他從節點同步新主節點(slaveof host port)
  5. 通知應?層轉移到新主節點。

在這里插入圖片描述
通過上面的介紹,可以看出Redis Sentinel具有以下幾個功能:

  • 監控:Sentinel節點會定期檢測Redis數據節點、其余哨兵節點是否可達。
  • 故障轉移:實現從節點晉升(promotion)為主節點并維護后續正確的主從關系。
  • 通知:Sentinel節點會將故障轉移的結果通知給應??

2. Redis Sentinel的部署(基于docker)

2.1 部署

  1. 安裝docker和docker-compose

apt install docker-compose

  1. 停?之前的redis-server
 # 停?redis-server
service redis-server stop# 停?redis-sentinel 如果已經有的話.
service redis-sentinel stop
  1. 使?docker獲取redis鏡像
docker pull redis:5.0.9

解決 Docker 錯誤:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled 的問題

# 1. 修改 Docker 配置文件
sudo nano /etc/docker/daemon.json# 2.將以下內容添加到配置文件中:
{"registry-mirrors" : ["https://docker.m.daocloud.io","https://docker-cf.registry.cyou"],"insecure-registries" : ["docker.mirrors.ustc.edu.cn"],"debug": true,"experimental": false
}
# 3.重啟 Docker 服務
sudo systemctl restart docker

在這里插入圖片描述

編排redis主從節點:創建三個容器,作為redis數據節點

  1. 編寫docker-compose.yml

創建/root/redis/docker-compose.yml,同時cd到yml所在?錄中,編寫yml文件

version: '3.7'
services:master:image: 'redis:5.0.9'container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: 'redis:5.0.9'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6380:6379slave2:image: 'redis:5.0.9'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379
  1. 啟動所有容器
 docker-compose up -d
  1. 查看運??志
 docker-compose logs

在這里插入圖片描述

編排 redis-sentinel節點

  1. 編寫docker-compose.yml

創建/root/redis-sentinel/docker-compose.yml,同時cd到yml所在?錄中

version: '3.7'services:sentinel1:image: 'redis:5.0.9'container_name: redis-sentinel-1restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/etc/redis/sentinel.confports:- "26379:26379"sentinel2:image: 'redis:5.0.9'container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- "26380:26379"  sentinel3:image: 'redis:5.0.9'container_name: redis-sentinel-3restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/etc/redis/sentinel.confports:- "26381:26379" 
networks:default:external:name: redis-data_default
  1. 創建配置?件

創建sentinel1.conf、sentinel2.conf、sentinel3.conf,三份?件的內容是完全相同的

bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000

sentinel monitor 主節點名 主節點ip 主節點端? 法定票數
sentinel down-after-milliseconds:主節點和哨兵之間通過?跳包來進?溝通,如果?跳包在指定的時間內還沒回來,就視為是節點出現故障.

  1. 啟動所有容器
 docker-compose up -d
  1. 查看運??志
 docker-compose logs

在這里插入圖片描述

2.2 驗證

至此,我們的節點就編排好了

下面我們來驗證一下哨兵效果
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

結論

  • Redis主節點如果宕機,哨兵會把其中的?個從節點,提拔成主節點.
  • 當之前的Redis主節點重啟之后,這個主節點被加?到哨兵的監控中,但是只會被作為從節點使?

2.3 選舉流程

假定當前環境如上?介紹,三個哨兵(sentenal1、sentenal2、sentenal3),?個主節點(redis-master),兩個從節點(redis-slave1,redis-slave2),當主節點出現故障,就會觸發重新?系列過程

  1. 主觀下線

當redis-master 宕機,此時redis-master和三個哨兵之間的?跳包就沒有了,此時站在三個哨兵的?度來看,redis-master出現嚴重故障,因此三個哨兵均會把redis-master判定為主觀下線(SDown)

  1. 客觀下線

此時,哨兵sentenal1、sentenal2、sentenal3均會對主節點故障這件事情進?投票,當故障得票數>=配置的法定票數之后,此時意味著redis-master故障這個事情被做實了,此時觸發客觀下線(ODown)

  1. 選舉出哨兵的leader

接下來需要哨兵把剩余的slave中挑選出?個新的master,這個?作不需要所有的哨兵都參與,只需要選出個代表(稱為leader),由leader負責進?slave升級到master的提拔過程,這個選舉的過程涉及到Raft 算法。

下面的過程是面試重點

選舉leader的過程:

  • 每個哨兵都只有一票
  • 當哨兵A第一個發現主節點是客觀下線時,就立即給自己投一票,并告知哨兵B、C(相當于拉票)
  • 哨兵B、C反應慢半拍,當收到哨兵A的告知,并且自己手中的票還在,就投給哨兵A
    • 若有多個拉票請求,則投給先到達的
  • 如果總票數超過哨兵數量的一半,則leader選舉完成(哨兵個數為奇數個,就是為了方便投票)
  • 其實,投票的過程,就是看哪個哨兵的反應快(網絡延遲小)

leader選好后,就需要推舉從節點,從節點變為主節點的過程:

  • 查看節點優先級:每個redis節點,都配置了一個優先級slave-priority,優先級高的勝出
  • 優先級相同,查看offsetoffset越大,表示從節點同步主節點的數據越多,二者越接近,offset大的勝出
  • 優先級、offset都相同,查看runid:節點的runid是隨機的,此時就看緣分了

新的主節點選好后,leader就會控制這個節點,執行slave no one,成為master節點;在控制其它節點,執行slaveof,讓這些節點,以新的master作為主節點。

上述過程,都是"??值守",Redis?動完成的,這樣做就解決了主節點宕機之后需要???預的問題,提?了系統的穩定性和可?性

?些注意事項:

  • 哨兵節點不能只有?個,否則哨兵節點掛了也會影響系統可?性.
  • 哨兵節點最好是奇數個,?便選舉leader,得票更容易超過半數.
  • 哨兵節點不負責存儲數據,仍然是redis主從節點負責存儲
    • 哨兵節點可以使用配置不是很高的節點
  • 哨兵+主從復制解決的問題是"提?可?性",不能解決"數據極端情況下寫丟失"的問題
    • 即主節點寫的數據,從節點還未同步,主節點就掛了。所以需要寫多份數據
  • 哨兵+主從復制不能提?數據的存儲容量,當我們需要存的數據接近或者超過機器的物理內存,這樣的結構就難以勝任了
    • 為了能存儲更多的數據,需要引?了集群

在這里插入圖片描述

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

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

相關文章

初識Linux · 五種IO模型和非阻塞IO

目錄 前言: 五種IO模型 什么是IO IO模型 非阻塞IO 前言: 前文我們已經將網絡的基本原理介紹完了,都是通過圍繞TCP/IP四層協議,將應用層,傳輸層,網絡層,數據鏈路層全部介紹完畢&#xff0c…

Node.js 24發布:性能與安全雙提升

在科技的迅速發展中,Node.js作為一個備受青睞的開源跨平臺Java運行環境,近日迎來了其24.0版本的正式發布。此次更新不僅承諾提升性能和安全性,還為開發者提供了更為順暢的開發體驗,值得我們深入探討。 Node.js 24.0的最大亮點之一…

SLAM文獻之-SuperOdometry: Lightweight LiDAR-inertial Odometry and Mapping

《Super Odometry: IMU-centric LiDAR-Visual-Inertial Estimator for Challenging Environments》是一篇旨在增強 SLAM 系統在惡劣環境下魯棒性的工作,尤其關注塵霧、煙霧等遮擋條件下的魯棒估計。下面從算法原理、公式推導、創新點和應用場景四個方面進行詳細解析…

指令燒錄ORIN NANO操作系統

1 概述 模組為ORIN NANO 4GB版本 Ubuntu系統為18.04虛擬機 說明:刷機過程會有重新連接USB的操作,燒寫過程需要注意虛擬機提示,官方不建議使用虛擬機,建議直接使用ubuntu操作系統的機器。 2 下載燒錄所需文件 進入到下載網址&am…

游戲引擎學習第287天:加入brain邏輯

Blackboard:動態控制類似蛇的多節實體 我們目前正在處理一個關于實體系統如何以組合方式進行管理的問題。具體來說,是在游戲中實現多個實體可以共同或獨立行動的機制。例如,我們的主角擁有兩個實體組成部分,一個是身體&#xff0…

QML定時器Timer和線程任務WorkerScript

定時器 Timer 屬性 interval: 事件間隔毫秒repeat: 多次執行,默認只執行一次running: 定時器啟動triggeredOnStart: 定時器啟動時立刻觸發一次事件 信號 triggered(): 定時時間到,觸發此信號 方法 restart(): 重啟定時器start(): 啟動定時器stop(): 停止…

Linux中的域名解析服務器

一、DNS(域名系統)詳解 1. 核心功能與特點 特性說明核心作用將域名(如 www.example.com)轉換為 IP 地址(如 192.168.1.1),實現人類可讀地址與機器可讀地址的映射。端口與協議- 默認端口&#…

Springboot2

1、搭建環境 2、配置文件 application.properties application.yml 3、springboot接收請求 springspringmvc 接收請求 響應數據 4、springboot集成jdbc spring-boot-starter-jdbc.jar JdbcTemplate(update|query) 5、springboot自動裝配原理(重點&#x…

【課堂筆記】核方法和Mercer定理

文章目錄 Kernal引入定義Mercer定理描述有限情形證明一般情形證明 Kernal 引入 在實際數據中常常遇到不可線性分割的情況,此時通常需要將其映射到高維空間中,使其變得線性可分。例如二維數據: 通過映射 ? ( x 1 , x 2 ) ( x 1 2 , 2 x 1…

談談未來iOS越獄或巨魔是否會消失

2024年10月的預測,先說結論: 巨魔iOS17.1消失概率為99%。 因為巨魔強依賴的漏洞就是一個簽名漏洞,攻擊面有限又經過2輪修復,第3次出現漏洞的概率極低。而越獄的話由于系統組件和服務較多,所以出現漏洞概率高攻擊面多&…

根據當前日期計算并選取上一個月和上一個季度的日期范圍,用于日期控件的快捷選取功能

1.選擇月份范圍 代碼如下&#xff1a; <el-date-picker v-model"value" type"monthrange" align"right" unlink-panels range-separator"至"start-placeholder"開始月份" end-placeholder"結束月份" :picker-…

用戶棧的高效解析邏輯

一、背景 在之前的博客 內核邏輯里抓取用戶棧的幾種方法-CSDN博客 里&#xff0c;介紹了使用內核邏輯進行用戶棧的函數地址的抓取邏輯&#xff0c;但是并沒有涉及如何解析出函數符號的邏輯。 就如perf工具一樣&#xff0c;它也是分為兩個步驟&#xff0c;一個步驟是內核態抓取…

vue3 el-table 行號

在 Vue 3 中&#xff0c;使用 Element Plus 的 <el-table> 組件來創建表格時&#xff0c;如果你想添加行號&#xff08;即每一行的編號&#xff09;&#xff0c;可以通過自定義列來實現。下面是如何實現的步驟&#xff1a; 1. 安裝 Element Plus 首先&#xff0c;確保你…

Linux:進程信號---信號的保存與處理

文章目錄 1. 信號的保存1.1 信號的狀態管理 2. 信號的處理2.1 用戶態與內核態2.2 信號處理和捕捉的內核原理2.3 sigaction函數 3. 可重入函數4. Volatile5. SIGCHLD信號 序&#xff1a;在上一章中&#xff0c;我們對信號的概念及其識別的底層原理有了一定認識&#xff0c;也知道…

UML 圖的細分類別及其應用

統一建模語言&#xff08;UML&#xff0c;Unified Modeling Language&#xff09;是一種用于軟件系統建模的標準化語言&#xff0c;廣泛應用于軟件工程領域。UML 圖分為多種類別&#xff0c;每種圖都有其特定的用途和特點。本文將詳細介紹 UML 圖的細分類別&#xff0c;包括 類…

「極簡」扣子(coze)教程 | 小程序UI設計進階!控件可見性設置

大師兄在上一期的內容中對用戶的UI做了一些簡單的介紹。這期大師兄繼續介紹UI設計上的進階小技巧&#xff0c;幫我們獲得更好的使用體驗。 扣子&#xff08;coze&#xff09;編程 「極簡」扣子(coze)教程 | 3分鐘學會小程序UI設計&#xff01;從零開始創建頁面和瓷片按鈕 「極…

2025年滲透測試面試題總結-快手[實習]安全工程師(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 快手[實習]安全工程師 一面問題分析與詳細回答 1. 自我介紹 4. 項目問題與解決 7. 防止SQL注入&…

WordPress Madara插件存在文件包含漏洞(CVE-2025-4524)

免責聲明 本文檔所述漏洞詳情及復現方法僅限用于合法授權的安全研究和學術教育用途。任何個人或組織不得利用本文內容從事未經許可的滲透測試、網絡攻擊或其他違法行為。使用者應確保其行為符合相關法律法規,并取得目標系統的明確授權。 對于因不當使用本文信息而造成的任何直…

互聯網大廠Java面試場景:從Spring Boot到分布式緩存技術的探討

互聯網大廠Java面試場景&#xff1a;從Spring Boot到分布式緩存技術的探討 場景描述 互聯網大廠某次Java開發崗面試&#xff0c;主考官是一位嚴肅的技術專家&#xff0c;而應聘者則是搞笑的程序員“碼農明哥”。面試圍繞音視頻場景的技術解決方案展開&#xff0c;探討從Sprin…

leetcode hot100刷題日記——8.合并區間

class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.empty()){//復習empty函數啊&#xff0c;日記1有的return {};}// 按照區間的起始位置進行排序sort(intervals.begin(), intervals.end());vect…