《Redis》哨兵模式

文章目錄

  • 為什么要有哨兵模式呢?
  • 哨兵自動恢復故障主節點
  • 使用docker搭建分布式系統
    • 查看哨兵節點工作
    • 哨兵選舉新的主節點的流程
  • 總結


為什么要有哨兵模式呢?

主從復制的問題
Redis 的主從復制模式可以將主節點的數據改變同步給從節點,這樣從節點就可以起到兩個作?:
第?,作為主節點的?個備份,?旦主節點出了故障不可達的情況,從節點可以作為后備 “頂” 上
來,并且保證數據盡量不丟失(主從復制表現為最終?致性)。第?,從節點可以分擔主節點上的讀
壓?,讓主節點只承擔寫請求的處理,將所有的讀請求負載均衡到各個從節點上。
但是主從復制模式并不是萬能的,它同樣遺留下以下?個問題:

  1. 主節點發?故障時,進?主備切換的過程是復雜的,需要完全的??參與,導致故障恢復時間?法保障。
  2. 主節點可以將讀壓?分散出去,但寫壓?/存儲壓?是?法被分擔的,還是受到單機的限制。
    其中第?個問題是?可?問題,即 Redis 哨兵主要解決的問題。第?個問題是屬于存儲分布式的問題,后面Redis集群就是解決這個問題的。目前先解決第一個問題。

所以當主節點由于死機等問題,無法為客戶端提供服務時,就需要通知大量的客戶端,要更換主節點了。這對于已經部署好一定規模的客戶端集群來說,是無法接受的,且更換主節點需要人工干預,耗時長,對效率大打折扣,所以,就引入了哨兵(Redis Sentinel)來解決這個問題。

哨兵機制是一個獨立的redis-sentinel進程,不用來存儲數據,而是用來監控redis的數據節點。

人工干預情況下:在這里插入圖片描述
依然有許多問題,如果引入了哨兵機制自動修復節點,會大大提高效率。

哨兵自動恢復故障主節點

單獨的哨兵(redis sentinel)進程,提供了多個,這里以三個為例。(哨兵節點,最好是搞奇數個,最少是3個,一般情況下,都是搞三個。)
提供多個哨兵來監控主從節點的原因是防止單獨的哨兵出現誤判某個主節點掛了的情況。
還有如果單獨一個哨兵節點,如果它自己本身都掛了,那就無法自動恢復故障的主節點了。

這些哨兵會對所有要監控的主從節點進行TCP的長連接,連接成功后,定期向節點發送心跳檢測(這里的心跳檢測是應用層實現的,不是tcp中的keep-alive,應用層實現的心跳檢測一般是簡單的ping,pong)

如果發現某一個主節點不回復心跳檢測了,說明有可能掛了,此時多個哨兵討論一致后,如果認為該主節點真的掛了,則會挑選出一個哨兵節點,由這個哨兵節點按照某些挑選規則,挑選出一個新的主節點。

挑選出新的主節點后,哨兵節點會自動控制該被選中的節點,執行slaveof no one,讓他直接稱為新的主節點,并控制其他從節點,修改slaveof到新的主節點上。

哨兵節點會自動通知所有客戶端,告訴他們新的主節點是誰,后續客戶端再進行寫操作,就會針對新的主節點進行操作了。

在這里插入圖片描述

使用docker搭建分布式系統

按理說,上面的6個節點是要部署在6臺不同的服務器主機上的。
一方面為了高可用,不至于一臺主機掛了,影響到其他主機。
一方面就是為了多使用其他主機的硬件資源,來提高效率。

在這里插入圖片描述
虛擬機可以解決,但是非常吃硬件性能,一般的電腦是搞不起的。

所以使用docker,就能解決上述問題。
docker是一個輕量級虛擬機,既能起到像虛擬機一樣的隔離環境作用,又不會吃太多硬件資源。


docker關鍵字:”容器“,容器就是一個輕量級的虛擬機。

操作步驟:

  • 1.安裝docker和docker-compose
    ubuntu下:apt install docker, apt install docker-compose
  • 2.停止之前的redis服務器
    service redis-server stop ,或者ps axu | grep redis,查看redis服務器進程的pid,kill -9 pid 即可。
  • 3.使用docker獲取到redis的鏡像

簡單解釋一下docker的鏡像和容器的關系。

鏡像相當于可執行程序,容器相當于進程。

要啟動一個進程,那就要啟動一個可執行程序,才能成功啟動進程。
換句話說,要創建一個容器,那就得有描述該容器的一個模板,根據模板刻畫一個容器出來,才能使用。所以獲取redis鏡像,就相當于獲取相關的容器的可執行程序。
鏡像可以自己構建,也可以拿別人構建好的(官方給的docker hub,類似github,有大量開源的鏡像)

拉取鏡像命令
docker pull redis(docker pull默認就是從配置好的docker hub中拉取的)

檢查是否安裝成功:
docker images
如果看到有redis的鏡像,則說明安裝成功了。

接下來則使用一些配置文件(yml)格式,來實現使用簡單的命令控制多個redis節點,這些節點在docker就是一個個容器,一個節點就使用一個容器。

簡單理解yml格式:
yml格式相對于xml格式來說,xml格式一般都是以標簽的形式成對出現的。

<student><id>1</id><name>張三</name>
</student>

這種格式比較啰嗦,且空間大。

后來就有了json:

{id: 1,name: ”張三“
}

json格式寫起來方便,還減少了空間,json以{}表示層級結構的。

而對于yml格式來說,與json格式有些相似之處:

student:id: 1,name: 張三

yml是以縮進格式來表示層級結構的。

下面創建6個容器,三個是作為redis的數據節點(一主兩從)
三個是作為哨兵節點。


先創建一個目錄

mkdir -p redis/
cd redis/
mkdir -p redis-data/
mkdir -p redis-setinel/
這兩個目錄一個是放redis的數據節點,一個是放哨兵節點的。
cd redis-data/
vim docker-compose.yml (注意:配置文件的名字是固定的,不要改)

(注意縮進表示層級)
version: '3.7'     # 版本號
services:          # services中的master,slave1是自己設定的名字master:image: 'redis'    # 要使用的鏡像名container_name: redis-master    # 容器名字restart: always                 # 一些配置command: redis-server --appendonly yes       ports:   #這里重點說明- 6379:6379slave1:image: 'redis'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379#這里可以直接通過容器名字,直接被docker進行類似域名解析的操作,獲取到redis服務器的ip了ports:- 6380:6379slave2:image: 'redis'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379

port重點說明,docker 中的容器就是一個輕量級的虛擬機,可以隔離環境。
容器內的端口號和容器外的端口好可以相同的。
比如容器內可以使用6379,容器外也可以使用6379。
彼此不沖突。
但是如果想在容器外能夠訪問到容器里面的端口號,
就可以把容器內部的端口號映射成宿主機的端口號。

ports:

  • 6380:6379
    第一個port是宿主機的端口號,第二個port是容器內的端口號
    相當于容器外(宿主機)映射后的端口號就是第一個,第二個就是容器內部自己的端口號

后續想要訪問容器內的某個端口號,就可以直接通過訪問宿主機這個映射的端口號,就等于訪問容器內的那個端口號了。
但是也要注意,映射出去的端口號也不要再使用,防止沖突。

啟動剛才配置的所有容器
docker-compose up -d

通過docker-compose logs就能看到日志信息。
netstat -anp | grep 端口號,通過grep剛才在配置文件寫好的端口號:6379,6380,6381,就能看到三個redis節點已經起來了。


下面要創建三個redis哨兵節點的容器。

cd /redis/redis-sentinel/
vim docker-compose.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:26379sentinel2:image: 'redis:5.0.9'container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- 26380:26379sentinel3: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

解釋networks:指定當前所處的網絡是redis-在這里插入圖片描述
data_default。

接下來創建三個redis哨兵節點的配置文件。

sentinel1.conf,sentinel2.conf,sentinel3.conf。
都放在redis-sentinel/目錄下。

.conf配置文件信息如下

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

在這里插入圖片描述

docker-compose up -d
創建三個哨兵節點
docker network ls
就能看到,只有一個局域網redis-data,而不是有redis-data又有redis-sentinel,這是因為.yml文件的network的作用。


查看哨兵節點工作

接下來就可以查看哨兵節點如何工作了。
docker ps -a,查看工作中的容器,就有三個redis的哨兵節點,三個redis主從節點。
在這里插入圖片描述
接下來手動掛掉主節點

docker stop + 主節點名字(這里是redis-server)
此時主節點掛了,此時哨兵節點已經開始工作了

docker-compose logs ,查看日志
在這里插入圖片描述
可以看到哨兵已經選出了新的主節點了。所以故障恢復完成。

哨兵選舉新的主節點的流程

細節都在圖中了,看圖

在這里插入圖片描述

總結

在這里插入圖片描述

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

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

相關文章

零基礎保姆級本地化部署文心大模型4.5開源系列

近兩年隨著大模型的迅猛崛起&#xff0c;吸引了各行各業的廣泛關注&#xff0c;更對我們的工作方式與生活產生著顯著積極影響。在這樣一個技術范式轉換的關鍵節點&#xff0c;百度文心大模型開源事件無疑具有里程碑意義——它不僅為中國自主研發的AI技術底座打開了通向世界的大…

【筆記】PyCharm 2025.2 EAP 創建 Poetry 和 Hatch 環境的踩坑實錄與反饋

https://youtrack.jetbrains.com/issue/PY-82407/Incorrect-Python-Version-and-Virtual-Environment-Path-When-Creating-Poetry-and-Hatch-Environments-via-GUI-in-PyCharm-2025.2-EAP 在 Python 開發的道路上&#xff0c;PyCharm 一直是我們信賴的開發利器。然而&#xff0…

ASP.NET Web Pages 安裝使用教程

一、ASP.NET Web Pages 簡介 ASP.NET Web Pages 是微軟推出的一種輕量級 Web 開發框架&#xff0c;適合快速開發動態網站。它使用 Razor 語法&#xff0c;可以將 HTML 與 C# 或 VB.NET 無縫融合&#xff0c;特別適合初學者和小型項目。 二、Web Pages 與 MVC 的區別 特性Web …

基于 ethers.js 的區塊鏈事件處理與錢包管理

幣圈工具箱 bqbot.cn 月訪問量達90whttps://bqbot.cn/jms.html &#xff08;在線版地址&#xff09; Event事件 檢索事件 const { ethers } require("hardhat"); async function SearchEvent() {try {const provider new ethers.JsonRpcProvider("http://1…

SpringBoot系列—入門

目錄 1 第一個SpringBoot程序 1.1 創建SpringBoot項目 1.2 選擇SpringBoot版本和必要依賴 1.3 項目目錄結構 1.4 編寫Hello World代碼 1.5 運行程序 1.6 不需要IDEA也能創建SpringBoot程序 1.7 部署程序 1.8 pom.xml依賴問題 1.9 無Maven選項問題 1.10 SpringBoot版…

你的Prompt還有很大提升

與AI協作&#xff0c;Prompt&#xff08;提示詞&#xff09;是溝通的橋梁。一個優秀的Prompt能讓AI的輸出事半功倍&#xff0c;而一個模糊的Prompt則可能導致南轅北轍的結果。如果你覺得AI的回答不夠精準、缺乏深度&#xff0c;或者總帶著一股“AI味”&#xff0c;那很可能是你…

3、Configuring Topics

如果您在應用程序上下文中定義了KafkaAdmin bean&#xff0c;它可以自動向代理添加主題。為此&#xff0c;您可以將每個主題的NewTopicBean添加到應用程序上下文中。2.3版本引入了一個新的類TopicBuilder&#xff0c;使創建此類bean更加方便。以下示例顯示了如何執行此操作&…

FastAPI+React19開發ERP系統實戰第04期

一、效果預覽 1.1 首頁 1.2 首頁暗黑模式 1.3 登錄頁 1.4 登錄頁暗黑模式 二、搭建React開發環境 2.1 項目依賴 package.json {"name": "erp-web","version": "1.0.0","description": "ERP系統前端 - React 19&quo…

數據庫|了解達夢數據庫并做安裝前的準備

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 你都用過哪些數據庫&#xff1f; 使用過的數據庫中覺得哪個數據庫最好用&#xff1f; 你使用過達夢數據庫嗎&#xff1f; 最近在做的一個SCADA項目&#xff0c;要求信創版本&#xff0c;其中數據庫也要使用信創目錄…

Java驅動AI革命:Spring AI八篇進階指南——從架構基礎到企業級智能系統實戰

系列文章目錄 提示&#xff1a;下面列出了整個系列的完整目錄&#xff0c;建議收藏本篇作為總覽入口&#xff1a;本人將在7月份更新完畢 第一篇&#xff1a;Spring AI 概述與架構設計 第二篇&#xff1a;Spring AI 基本組件詳解——ChatClient、Prompt、Memory 第三篇&#x…

hysAnalyser --- 支持菁彩視聽雙Vivid媒體信息解析

摘要 本文主要介紹 hysAnalyser 支持HDR Vivid格式的分析案例&#xff0c;滿足用戶分析HDR vivid 和 Audio Vivid格式的需要。 現將 hysAnalyser 新版本(v1.1.000)發布給網友使用&#xff0c;希望能幫助到更多音視頻開發的愛好者。使用過程中&#xff0c;若遇到問題請您通過 G…

C++中NULL等于啥

文章目錄 **一、`NULL` 的標準定義****二、常見實現方式**1. **定義為整數 `0`**2. **定義為 `0L` 或 `(void*)0`**(較少見)**三、與C語言的關鍵區別****四、`NULL` 在C++中的問題**1. **重載函數匹配歧義**2. **模板參數推導錯誤****五、C++11+ 的替代方案:`nullptr`****六…

pyhton基礎【20】面向對象進階一

目錄 一.進階 類方法和靜態方法 屬性(Properties) 繼承和多態 抽象基類(Abstract Base Classes - ABCs) 魔術方法(Magic Methods) 組合和聚合 使用場景 二.私有屬性 實現對數據的隱藏 設置私有屬性 添加額外對屬性操作的方法 三.私有方法 實現對方法的隱藏 直接…

滲透信息收集- Web應用漏洞與指紋信息收集以及情報收集

目錄 1. 整體流程與目標概述 2. 常用工具及其用途 2.1 掃描與枚舉工具 2.2 情報與數據聚合工具 2.3 流量攔截與手工驗證工具 3. 詳細技術手法與步驟 3.1 準備階段 3.2 主動掃描與指紋識別 3.3 數據交叉驗證與漏洞確認 3.4 進一步滲透與隱蔽操作 4. 實際工作經驗與注…

ASP.NET代碼審計 MVC架構 SQL注入漏洞n

接口路由 /Maintenance/GetMaintenanceList MaintenanceController.cs代碼 Maintenance 控制器里面的 GetMaintenanceList 方法 接收參數 id 傳進 MaintenanceManager.GetMaintenanceList 方法調用 MaintenanceManager.cs代碼 這里 id 和 faultId 不一樣是不影響的 C# 按順序匹…

Python入門Day4

Python中數據的常用操作 數據拷貝 根據以下代碼可以看出l1和l2實際上都是對于數據的引用&#xff0c;當l1被改變了&#xff0c;l2也會發生同樣的改變&#xff0c;l2 l1只是將l2指向了l1所指向的地址。 >>> l1 [1,2,[3,4],[5,6]] >>> l2 l1 >>>…

計算機網絡中的常用表項梳理

核心表項對比 表項 全稱 工作層級 主要功能 涉及設備 典型生命周期 MAC表 媒體訪問控制表 數據鏈路層&#xff08;二層&#xff09; Mac地址和端口關系 交換機、網橋 動態學習 FDB表 轉發數據庫 &#xff08;Forwarding DataBase&#xff09; 數據鏈路層&#xf…

百度輪崗:任命新CFO,崔珊珊退居業務二線

文 | 大力財經2025 年 7 月 1 日&#xff0c;百度組織再次變革&#xff0c;崔珊珊退居二線引發的行業關注。百度創始人李彥宏發布的內部信&#xff0c;宣布的新一輪組織調整里&#xff0c;崔珊珊退居二線這一變動&#xff0c;格外引人矚目。崔珊珊&#xff0c;這位在百度人力資…

TAMPER-RTC(STM32F103) 引腳說明

我來查看ST官方手冊中關于TAMPER-RTC引腳的具體說明。 Ran tool Ran tool Ran tool Read file: doc/STM32F103VGT6/STM32F103VGT6_specification.txt Read file: doc/STM32F103VGT6/STM32F103VGT6_specification.txt Ran tool Read file: doc/STM32F103VGT6/STM32F103VGT6_spec…

BUUCTF在線評測-練習場-WebCTF習題[極客大挑戰 2019]HardSQL1-flag獲取、解析

解題思路 打開靶場、熟悉的感覺 上次是過濾了很多字符&#xff0c;用了雙寫繞過進行注入即可&#xff0c;這次進階了難度 先老規矩判斷下閉合 11 123 報錯提示 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version…