Redis原理之哨兵機制(Sentinel)

上篇文章:

Redis原理之主從復制https://blog.csdn.net/sniper_fandc/article/details/149141103?fromshare=blogdetail&sharetype=blogdetail&sharerId=149141103&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目錄

1 哨兵機制恢復主節點故障流程

1.1 整體流程

1.2 sentinel節點作用

2 搭建主從結構+哨兵

2.1 docker拉取redis鏡像

2.2 編排redis數據節點

2.3 編排redis的哨兵節點(sentinel)

2.4 演示故障轉移


????????注意:從節點如何變為主節點?從節點主動執行slaveof no one命令,此時從節點變為主節點。但是如果是主節點掛了,從節點是不會自動變為主節點的。此時只有人工干預來選擇哪個從節點變為主節點,需要改變主從模式的拓撲結構,比較麻煩。而哨兵機制正式解決該問題的手段。

????????哨兵機制:Redis提供的高可用性的實現方案,它是獨立的redis-sentinel進程,不屬于redis提供的redis-server進程。

1 哨兵機制恢復主節點故障流程

1.1 整體流程

????????哨兵節點會和數據節點建立TCP長連接,并采用心跳包機制,定期向數據節點發送ping,數據節點需要回復pong。如果哨兵節點沒有收到pong響應,就會認為該節點不可達(發生故障)。如果是slave節點故障,對讀寫沒有太大影響;如果是master節點故障,則哨兵節點開始工作:

????????1.master節點故障,主從復制終止。

????????2.sentinel節點發現master故障(主觀下線),與其他sentinel進行“協商”,需要大多數sentinel都認為master故障客觀下線),此時才會確認真正發生master故障(只有一個sentinel認為master故障不一定正確,因為可能是因為該sentinel節點發生網絡抖動,從而導致沒有收到pong,而實際可能master正常工作)。

????????3.sentinel節點之間通過Raft算法選舉一位作為領導(leader),leader負責故障轉移過程。

????????注意:Raft算法要求每個哨兵節點只有一票,率先發現故障的先發起自身成為leader的投票,其他哨兵節點先收到誰的投票就先投給誰,達到法定投票的節點成為leader。按照Raft算法規則,誰先發現故障,誰就更可能成為leader。因為偶數節點數有較大可能出現平票,因此最好選擇奇數節點個數的哨兵

????????4.故障轉移:leader遠程控制某個slave執行slaveof no one命令,則該slave晉升為master節點,然后再控制其他slave進行slaveof到新的master節點,維護主從拓撲關系。當故障轉移后,leader會將新的master(ip和端口號)和拓撲關系通知其他客戶端。

????????注意:leader選擇slave的三個指標。先看優先級(配置文件的slave-priority或replica-priority),數值越小越優先;優先級一樣再看offset偏移量,數值越大越優先(說明數據量越接近原來的master);前兩個指標都一樣最后看run id,值越小越優先(由于run id是節點運行時redis自動隨機生成,因此這個指標實際上也是隨機選slave)。

1.2 sentinel節點作用

????????1.監控:監控所有的數據節點和其他哨兵節點。

????????2.故障轉移:master發生故障后負責從slave選擇新的master節點并維護主從拓撲結構。

????????3.通知:將故障轉移后的新master節點和拓撲關系通知給客戶端。

????????注意:sentinel節點數量通常設為奇數比較好,一般是3個。

2 搭建主從結構+哨兵

????????由于搭建真實的多物理機的redis節點成本較高,因此這里使用容器化技術來進行搭建。需要提前安裝docker和docker-compose,docker簡單來講是一個類似虛擬機的容器,它小巧輕量,提供了容器來統一配置環境信息,尤其是在多服務的環境中,配置很容易出現沖突,使用docker創建容器就可以實現多個服務的環境配置的沖突隔離。

????????docker-compose是容器編排工具,在docker中如果容器較多就容易出現多個容器之間的依賴關系(比如先后啟動順序),使用docker-compose就可以幫助我們進行管理。

2.1 docker拉取redis鏡像

????????使用命令來拉取redis的鏡像(拉取之間需要停掉所有的redis服務):

????????docker pull redis:5.0.9

2.2 編排redis數據節點

????????編排就是用yml文件來配置多個容器的信息,包括但不限于創建什么容器、容器參數信息(名稱、端口號等等),通過一個命令就能批量啟動這些容器。

????????這里搭建一主兩從的主從結構,需要定義docker-compose.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

????????其中,services下的master、slave1和slave2是服務的名字(自己起),image則是容器基于的鏡像,container_name是容器名稱,restart是如果節點掛了是否重啟,command則是啟動節點的方式,ports是端口映射(把物理機的端口映射到容器的端口,容器端口和物理機端口獨立,容器端口和容器端口獨立,映射了后就可以讓物理機訪問容器)。

????????使用命令docker-compose up -d(-d表示后臺方式啟動)即可啟動這三個容器:

????????這里可以使用redis-cli -p 6379來連接啟動的節點:

????????注意:為什么不把3個數據節點和3個哨兵節點放到一個yml文件?因為如果是哨兵節點先啟動,就會認為master節點故障,從而故障轉移,但是此時數據節點還未啟動,因此這樣操作無效。雖然不會對全局容器產生影響,但是對于執行日志的觀察不利。

2.3 編排redis的哨兵節點(sentinel)

????????這里操作和上述一樣:

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:26379networks:default:external:?truename: redis-data_default

????????由于sentinel啟動依賴配置文件sentinel.conf,而在運行過程中sentinel會對配置文件進行修改來適應具體節點的情況(配置重寫rewrite),因此不能使用同一個配置文件。volumes參數則描述了配置文件分別映射為三個文件,初始狀態一樣,但是一旦啟動文件內容就會發生變化。這三個配置文件(sentinel1.conf、sentinel2.conf和sentinel3.conf)內容如下:

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

????????bing描述哨兵可被所有ip訪問,port描述哨兵的端口號,

????????sentinel monitor依次描述監控哪個主節點、主節點ip(這里使用主節點名稱類似域名,docker可自動解析為ip)、主節點端口號、法定選票(少數服從多數,達到選票數量才會一致認為master出現故障)。

????????sentinel down-after-milliseconds描述了心跳包超時時間,超過這個時間沒有接收到pong就認為master出現故障。

????????同時,由于使用docker-compose啟動一組容器,這相當于創建一個局域網(網絡名是docker-compose.yml所在的目錄+_default)。如果沒有networks字段的配置,這組sentinel節點就又創建了一個局域網,兩個局域網無法直接互相訪問。因此需要把這組節點加入到數據節點所在的局域網中,配置networks字段的原因正是上述闡述。

????????使用命令:docker network ls可以查看創建的局域網:

????????具體操作結果如下:

????????注意:上述操作中如果啟動容器失敗,就需要檢查配置文件,然后使用命令docker-compose down來關閉容器,再重新啟動。使用命令docker-compose logs可以查看docker容器的日志上述和docker容器相關的命令必須在yml文件同級的目錄下進行。

????????使用命令docker ps -a查看目前啟動的容器:

2.4 演示故障轉移

????????使用docker stop redis-master命令關閉master節點:

????????觀察日志發現,sdown表示主觀下線,即sentinel-3哨兵節點首先發現master故障。odown表示客觀下線,sentinel-3獲得的票數達到法定票數(2票):

????????下圖表示投票記錄,其他兩個哨兵節點均給sentinel-3進行投票,因此sentinel-3成為leader:

????????sentinel-3作為leader選擇ip為172.18.0.4的slave節點(端口號為6380)為新的master,而172.18.0.2的節點是故障的master節點:

????????觀察6380的節點,role已經變成master,同時只有一個從節點連接,從節點的ip是182.18.0.3(端口號為6381):

????????如果使用docker start redis-master命令讓原來的master恢復,則它不會變為master,而是成為從節點:

????????由此可見,哨兵節點自動的完成了從監控=>發現故障=>選舉leader=>leader故障轉移=>轉移完成通知的過程,極大的保證了主從復制的高可用性。

下篇文章:

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

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

相關文章

uniapp打包成 apk

1. 先把項目打包成 index.html 上傳到寶塔服務器,關聯到域名 2.然后再用hbuilder新建一個 基礎模板的 uniapp 3.再修改代碼,采用iframe方式打包 pages/index/index <template><web-view v-if="showWebView" :src="webViewSrc" @message=&qu…

RPG57.創建玩家拾取物品類一:創建可拾取物品類的基類

1。新建一個基類&#xff0c;用于玩家可拾取物品的父類然后// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Components/SphereComponent.h" #include "GameFramewo…

k8s之持久化存儲流程

K8s 中的 Pod 在掛載存儲卷時需經歷三個的階段&#xff1a;Provision/Delete&#xff08;創盤/刪盤&#xff09;、Attach/Detach&#xff08;掛接/摘除&#xff09;和 Mount/Unmount&#xff08;掛載/卸載&#xff09; Provisioning Volumes 時序流程詳解 一、流程圖 sequenc…

python學智能算法(二十四)|SVM-最優化幾何距離的理解

引言 前序學習過程中&#xff0c;已經對幾何距離的概念有了認知&#xff0c;學習鏈接為&#xff1a;幾何距離 這里先來回憶幾何距離δ的定義&#xff1a; δmin?i1...myi(w∥w∥?xib∥w∥)\delta \min_{i1...m}y_{i}(\frac{w}{\left \| w \right \|}\cdot x_{i}\frac{b}{\le…

創建游戲或互動體驗:從概念到實現的完整指南

Hi&#xff0c;我是布蘭妮甜 &#xff01;在數字時代&#xff0c;游戲和互動體驗已成為娛樂、教育和商業領域的重要組成部分。本文將帶你了解如何使用JavaScript創建引人入勝的游戲和互動體驗&#xff0c;從基礎概念到實際實現。 文章目錄一、游戲開發基礎1.1 游戲循環1.2 游戲…

SpringMVC + Tomcat10

1. Tomcat 10的servlet包路徑變了&#xff0c;javax -> jakarta 2. DispatcherServlet從Spring6 才開始使用jakarta.servlet.http.Servlet 3. Spring6 需要JDK 17 1. pom <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org…

Django `transaction.atomic()` 完整使用指南

目錄 #概述#基本用法#事務一致性保障機制#破壞一致性的常見場景#高級用法#最佳實踐#診斷與調試#附錄 概述 transaction.atomic() 是 Django 提供的數據庫事務管理工具&#xff0c;用于確保一系列數據庫操作要么全部成功提交&#xff0c;要么全部回滾&#xff0c;維護數據的一致…

UDP協議的端口161怎么檢測連通性

UDP 端口 161 (SNMP) 連通性檢測的專業指南 UDP 161 端口是 SNMP (Simple Network Management Protocol) 服務的標準端口。由于其無連接特性&#xff0c;檢測需要特殊方法。以下是全面的檢測方案&#xff1a; 一、專業檢測方法 1. 使用 SNMP 專用工具&#xff08;推薦&#xff…

進階數據結構:紅黑樹

嘿&#xff0c;各位技術潮人&#xff01;好久不見甚是想念。生活就像一場奇妙冒險&#xff0c;而編程就是那把超酷的萬能鑰匙。此刻&#xff0c;陽光灑在鍵盤上&#xff0c;靈感在指尖跳躍&#xff0c;讓我們拋開一切束縛&#xff0c;給平淡日子加點料&#xff0c;注入滿滿的pa…

如何上傳github(解決git的時候輸入正確的賬號密碼,但提示認證失敗)

如何上傳github文件&#xff0c;刪除文件 1.重點 GitHub 從 2021 年 8 月 13 日起移除了對密碼認證的支持。你需要使用個人訪問令牌(Personal Access Token, PAT)或 SSH 密鑰來進行認證。 2.生成SSH key 進入設置點擊New SSH Key名字隨便取&#xff0c;可以自己方便記3.上傳文件…

多級緩存架構與熱點探測系統核心技術解析

多級緩存架構與熱點探測系統核心技術解析 &#x1f4cc; 一、多級緩存架構 1. 為什么需要多級緩存&#xff1f; ? 本地緩存優勢&#xff1a; &#x1f680; 減少網絡請求&#xff0c;提升訪問性能&#x1f310; 分布式系統中天然具有分布式緩存特性?? 有效降低遠程緩存&…

iOS 性能監控工具全解析 選擇合適的調試方案提升 App 性能

在iOS應用開發中&#xff0c;性能往往是決定用戶體驗的關鍵因素之一。用戶體驗的優劣&#xff0c;不僅取決于功能的實現&#xff0c;還在于流暢度、響應速度、資源消耗等方面的表現。因此&#xff0c;性能監控工具在iOS開發中的重要性不可小覷。 無論是提升應用的啟動時間、減少…

C++ :vector的介紹和使用

vector學習時一定要學會查看reference 目錄 前言 一、vector基本概念 1.1vector是什么&#xff1f; 1.2內存管理 二、vector的使用 2.1vector的構造 2.2vector iterator 的使用 2.3vector 空間增長問題 2.4vector的元素訪問 2.5vector 增刪查改 總結 前言 在C編程中&#x…

iOS OC 圖片壓縮

純代碼,不廢話,歡迎copy使用,記得點贊 +(NSData *)imageData:(UIImage *)image maxSize:(int)maxSize{ // 設置最大文件大小(200KB) NSLog(@"執行壓縮方案 期望壓縮目標%dk",maxSize); return [self compressImage:image toMaxSize:maxSize]; } // 主壓縮方…

如何更改 SQLserver 數據庫存儲的位置 想從C盤換到D盤

在 SQL Server 中更改數據庫存儲位置&#xff08;從 C 盤遷移到 D 盤&#xff09;需要通過以下步驟完成&#xff1a;1. 確定數據庫文件的當前位置首先查詢數據庫文件的當前路徑&#xff1a;sqlSELECT name, physical_name AS current_location FROM sys.master_files WHERE dat…

【unitrix】 6.8 加一運算(add_one.rs)

一、源碼 這是一個使用 Rust 類型系統實現二進制數加一操作的代碼。 use crate::number::{O, I, B, Null, Bit, NormalizeIf};/// 類型級加一操作 trait /// /// 為二進制數類型實現加一操作&#xff0c;返回新的類型 pub trait AddOne {/// 加一操作的結果類型type Output;//…

國內Ubuntu訪問不了github、 huggingface等

各位小伙伴們&#xff0c;大家好呀。 大家是不是經常遇到訪問不了github、huggingface的情況呀。 在Ubuntu中可以這樣做。 訪問這個網站網站測速-Ping檢測-Trace查詢-Dig查詢-路由跟蹤查詢-tools.ipip.net&#xff0c; 對于github.com&#xff0c;在這個網站輸入github.com…

「Java EE開發指南」如何用MyEclipse創建企業應用項目?(一)

由于有了項目模型和管理工具&#xff0c;現在可以創建Java EE企業應用程序。在本文中您將了解到&#xff1a; 企業應用項目模型項目組織、依賴關系和類解析 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 1. 企業應用項目模型 MyEclipse提供了一個企業應用程序項…

ubuntu 22.04 pam 模塊設置用戶登錄失敗鎖定

1、ubuntu 22.04 配置方法 /etc/pam.d/common-auth 加到如下行后 # auth [success1 defaultignore] pam_unix.so nullok # 添加如下內容 auth [defaultdie] pam_faillock.so authfail auth sufficient pam_faillock.so authsucc/etc/pam.d/common…

Linux 定時任務全解析:atd 與 crond 的區別及實戰案例(含日志備份 + 時間寫入)

1. atd 和 crond 兩個任務管理程序的區別atd&#xff1a;用于執行一次性的定時任務&#xff0c;即設置任務在某個特定的時間點僅執行一次 &#xff0c;適合處理不需要重復執行的定時操作&#xff0c;比如在未來某個確切時間執行一個腳本、發送一份文件等場景。crond&#xff1a…