[Redis]哨兵機制

哨兵機制概念

在傳統主從復制機制中,會存在一些問題:

1. 主節點發生故障時,進行主備切換的過程是復雜的,需要人工參與,導致故障恢復時間無法保障。

2. 主節點可以將讀壓力分散出去,但寫壓力/存儲壓力是無法被分擔的,還是受到單機的限制。

哨兵機制就是為了解決第一個高可用問題的

當主節點出現故障時,哨兵機制能自動完成故障發現和故障轉移,并通知應用方,從而實現真正的高可用。?哨兵機制是一個分布式架構,其中包含若干個redis哨兵節點和Redis數據節點,每個哨兵節點會對數據節點和其余Sentinel節點進行監控,當它發現節點不可達時,會對節點做下線標識。如果下線的是主節點,它還會和其他的哨兵節點進行“協商”,當大多數哨兵節點對主節點不可達這個結論達成共識之后,它們會在內部“選舉”出一個領導節點來完成自動故障轉移的工作,同時將這個變化實時通知給Redis應用方。整個過程是完全自動的,不需要人工介入。

?

?

環境規劃

redis版本:5.0.9

我們將使用docker搭建redis哨兵環境

docker-compose?來進行容器編排

1)創建三個容器,作為redis的數據節點(主從結構,一主兩從)

2)創建三個容器,作為redis的哨兵節點

目錄結構:

搭建數據節點

docker-compose.yml是 Docker Compose 使用的配置文件,它定義了多個 Docker 容器的服務、網絡和卷的配置。通過這個文件,你可以使用一條命令來批量啟動多個docker容器

配置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

version: '3.7'指定 Docker Compose 文件的版本。版本 3.7 支持更高級的功能和配置選項。

services:定義一組服務,每個服務對應一個容器。在這里,我們定義了三個服務,分別是主節點master和兩個從節點slave。

image:指定要使用的鏡像,這里是我們提前拉取的redis:5.0.9鏡像

container_name: 指定容器的名稱。這樣,你可以通過這個名稱來引用和管理容器。

restart: always:指定容器的重啟策略。在這里配置為always,表示無論容器是因何原因退出,Docker 都會自動重啟該容器。

command:設置啟動命令,為主節點和從節點配置不同的命令

ports:映射主機端口到容器端口。前一個是主機端口,后一個是容器端口。就是說,在主機里這三個redis分別是6379,6380,6381端口,映射到各自容器的6379端口

啟動docker compose配置的服務

在docker-compose.yml配置文件同級目錄下使用命令:

sudo docker-compose up -d

?up表示構建、(重新)創建、啟動并連接配置文件中定義的所有服務。如果某些服務已經在運行,up命令會重新啟動它們。

-d表示 --detach?選項,它會將服務在后臺運行。如果沒有-d選項,服務將會在前臺運行,并輸出日志信息到當前終端窗口

?

如果啟動后發現前面的配置有誤,需要重新操作,使用?docker-compose down 即可停止并刪除 剛才創建好的容器.?

?查看運行日志

同級目錄下使用命令:

sudo docker-compose logs

?

?可以看見成功加載了三個容器

也可以使用命令:

sudo docker ps -a

顯示容器的列表?

可以在最后一列看到名字分別是redis-slave1、redis-slave2、redis-master代表三個數據節點

搭建成功

驗證

連接主節點

可以看到,主節點,有兩個連接的從節點?

搭建哨兵節點

?(其實也可以把哨兵節點的yml配置文件和上面的配置文件寫到一起,這里分成兩組,主要是為了方便觀察)

哨兵節點配置

放在redis-sentinel目錄中,分別創建三個,內容完全相同

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

sentinel?monitor表示監聽的redis節點,第一個redis-master是給哨兵內部的名字,第二個是主節點ip,但是這里用的是docker,所以就寫容器名,會自動DNS成對應的ip,6379表示端口,2表示票數,如果有哨兵節點覺得主節點掛了,那就投1票,當票數大于等于2時,就認為主節點真的掛了,就會啟動后面的流程

sentinel down-after-milliseconds redis-master 1000主節點和哨兵之間通過心跳包來進行溝通.如果心跳包在指定的時間(1000ms)內還沒回來,就視為是節點出現故障.

為什么要創建三個一樣的文件,而不用同一個呢?

因為redis-sentinel 在運行中可能會對配置進行重寫,修改文件內容.如果用一份文件,就可能出現修改 混亂的情況.

配置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 

volume:配置掛載的卷,將主機上的文件或目錄映射到容器內部。

networks:表示要加入的網絡而不是創建新的網絡,因為是兩個配置文件,會啟用兩個局域網,為了讓數據節點和哨兵節點互相認識并通信,所以要加入到一個網絡中。

啟動docker compose配置的服務

在docker-compose.yml配置文件同級目錄下使用命令:

sudo docker-compose up -d

?

查看運行日志

同級目錄下使用命令:

sudo docker-compose logs

?

可以發現正在監控主節點172.18.0.4 6379

驗證哨兵機制

主節點掛掉

sudo docker stop redis-master?

?查看哨兵日志

?這里從sdown master redis-master 172.18.0.4 6379之前都是啟動時的日志

后面是主節點掛了后的日志

sdown是主觀下線,就是說這個節點主觀認為主節點掛了(投一票)

odown是客觀下線,就是說主節點客觀掛了(票數超過設置)

表示票數達到3/2,超過規定,?認為主節點已經不能正常工作了,開啟選取新的主節點的流程

表示選取172.18.0.3作為主節點代替172.18.0.4?

重啟原來的主節點

sudo docker start redis-master

?

?這個節點變成從節點,并設置主節點為172.18.0.3

選取新主節點流程

主觀下線

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

并投一票故障

客觀下線

當故障得票數>=配置的法定票數之后,意味著redis-master故障這個事情被坐實了.此時觸發客觀下線(ODown)

選舉出哨兵的leader

因為選取新主節點的工作不能讓大家一起做,會亂套,所以現在需要在哨兵節點中選舉出一個領導leader節點,來選舉新主節點

這個選舉的過程涉及到 Raft 算法

1.每個哨兵節點都給其他所有哨兵節點,發起一個"拉票請求"

2.收到拉票請求的節點,會回復一個"投票響應".響應的結果有兩種可能,投or不投

如果已經發現主節點客觀下線,需要選舉leader,但是沒有收到拉票請求,就會投給自己,然后向其他哨兵拉票。

如果哨兵收到多個拉票請求,會投票給收到第一個請求的哨兵。

?3.一輪投票完成之后,發現得票超過半數的節點,自動成為leader

如果平票,再投一次

把哨兵節點的個數設置為奇數,可以減小平票的可能,提高效率

leader哨兵選舉新主節點

?leader 挑選出合適的slave成為新的 master

挑選規則:

1.比較優先級.優先級高(數值小的)的上位.優先級是redis配置文件中的配置項( slave-priority或replica-priority )

2.比較 replication offset 誰復制的數據多,高的上位

3.比較 run id ,誰的id小,誰上位.

選舉后

當某個slave節點被指定為master之后,

1. leader 指定該節點執行?slave no one ,成為master

2. leader 指定剩余的slave節點,都依附于這個新master

注意事項

? 哨兵節點不能只有一個,否則哨兵節點掛了也會影響系統可用性.

? 哨兵節點最好是奇數個,方便選舉leader,得票更容易超過半數.

? 哨兵節點不負責存儲數據,仍然是redis主從節點負責存儲.

? 哨兵+主從復制解決的問題是"提高可用性",不能解決"數據極端情況下寫丟失"的問題.

? 哨兵+主從復制不能提高數據的存儲容量,當我們需要存的數據接近或者超過機器的物理內存,這樣的結構就難以勝任了。

為了能存儲更多的數據,就引入了集群.

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

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

相關文章

印章誰在管、誰用了、用在哪?契約鎖讓您打開手機一看便知

“印章都交給誰在管”、“哪些人能用”、“都有哪些業務在用”…這些既是管理者最關心的印章問題也是影響印章安全的關鍵要素。但是公司旗下分子公司那么多,各類公章、法人章、財務章、合同章一大堆,想“問”明白很難。 契約鎖電子簽及印控平臺推出“印章…

14-11 2024 年的 13 個 AI 趨勢

2024 年的 13 個 AI 趨勢 人工智能對環境的影響和平人工智能人工智能支持的問題解決和決策針對人工智能公司的訴訟2024 年美國總統大選與人工智能威脅人工智能、網絡犯罪和社會工程威脅人工智能治療孤獨與對人工智能的情感依賴人工智能影響者中國爭奪人工智能霸主地位人工智能…

一句話回答的前端面試題

該篇文章為一句話的答案,想看更詳細的面試題請看這篇>《前端面試題》 原型鏈: 實例與原型的鏈條,原型是prototype,鏈是__proto__,每個函數有一個原型對象,函數在創建時有一個默認屬性 prototype&#x…

YOLOv10全網最新創新點改進系列:融合GSConv+Slim Neck,雙改進、雙增強,替換特征融合層實現, 輕量化漲點改進策略,有效漲點神器!

YOLOv10全網最新創新點改進系列:融合GSConvSlim Neck,雙改進、雙增強,替換特征融合層實現, 輕量化漲點改進策略,有效漲點神器! 所有改進代碼均經過實驗測試跑通!截止發稿時YOLOv10已改進40&…

【數據結構】06.棧隊列

一、棧 1.1棧的概念及結構 棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出LIFO(Last In First Out)的原則。 壓棧&#…

FPGA就業方向以及主要工作

FPGA(Field-Programmable Gate Array)作為可編程邏輯器件,在多個行業和領域中都有廣泛的應用。具備FPGA技能的專業人士可以在多個方向上找到就業機會,以下是FPGA主要的就業方向及其對應的主要工作職責: 通信行業 職位…

LangChain終極內幕指南,學會langchain就看它了

1.概述 在人工智能迅速演進的時代,諸如Open AI的ChatGPT和Google的Bard等大型語言模型(LLMs)正徹底改變我們與技術互動的方式。這些技術巨頭和SaaS公司正在競相利用LLMs的威力,創造更為智能和實用的應用程序。 然而,真正的變革并非僅僅停留…

低壓電工精選歷年真題附答案

1.當電壓為5V時,導體的電阻值為5歐,那么當電阻兩端電壓為2V時,導體的電阻值為()歐。[單選題] A 、10B、5(正確答案) C、2 2.當電氣火災發生時,應首先切斷電源再滅火,但當電源無法切斷時,只能帶電滅火&…

Finding and exploting an unused API endpoint

Using 0$ account buy a piece of lether priced at $133 1、嘗試訪問api接口 大概率可能訪問不到,但是可以嘗試訪問下 /api/swagger/v1 /openapi.json 2、頁面功能點尋找 api send to Repeter 3、Find Supported HTTP請求 POST方法測試 通過測試得知支持GET方法和PATC…

C語言實現的人員管理系統(順序表版)

該系統具有以下主要功能: 添加人員信息:在有空間的前提下,用戶輸入人員的工號、姓名、性別、聯系電話和 QQ 號等信息,系統會自動檢查編號的唯一性,確保不重復。查找人員信息:提供按工號和姓名兩種查找方式…

av_read_frame 代碼研究

------------------------------------------------------------ author: hjjdebug date: 2024年 07月 05日 星期五 11:02:51 CST av_read_frame 代碼研究 ------------------------------------------------------------ 有人只標注一層,標注一層太膚淺了.不能了解底層之精妙…

Lianwei 安全周報|2024.07.01

新的一周又開始了,以下是本周「Lianwei周報」,我們總結推薦了本周的政策/標準/指南最新動態、熱點資訊和安全事件,保證大家不錯過本周的每一個重點! 政策/標準/指南最新動態 01 出于安全考慮,拜登下令禁用卡巴斯基殺毒…

【康復學習--LeetCode每日一題】3115. 質數的最大距離

題目: 給你一個整數數組 nums。 返回兩個(不一定不同的)質數在 nums 中 下標 的 最大距離。 示例 1: 輸入: nums [4,2,9,5,3] 輸出: 3 解釋: nums[1]、nums[3] 和 nums[4] 是質數。因此答案是…

SpringBoot各類數量限制及超出后拋出的異常

前言 在使用SpringBoot開發接口時,動不動的就發生各種超過默認值的限制,這里總結了下SpringBoot默認限制的設置以及可能會發生的異常,便于問題的排查和快速修改默認值。 配置項配置項說明默認值超過大小后拋出的異常spring.servlet.multipa…

系統管理(System Keeping):全新迭代,優化您的開發體驗

隨著科技的不斷進步和用戶需求的日益增長,系統管理(System Keeping)不斷進行迭代更新,致力于為用戶帶來更加高效、便捷的開發體驗。本次全新迭代,不僅在界面與交互上進行了革新,更在功能整合、個性化與安全…

ECOLOGY9重置系統管理員密碼

ECOLOGY9系統管理員密碼忘記需要重置: 1、KB2110之后版本加了防篡改邏輯,數據庫中初始話密碼需要將hashdata、signdata更新為空,執行如下語句初始化 update HrmResourceManager set password ‘C4CA4238A0B923820DCC509A6F75849B’,salt‘’…

Android --- Service

出自于此,寫得很清楚。關于Android Service真正的完全詳解,你需要知道的一切_android service-CSDN博客 出自【zejian的博客】 什么是Service? Service(服務)是一個一種可以在后臺執行長時間運行操作而沒有用戶界面的應用組件。 服務可由其他應用組件…

萬字長文|關于 OpenAI 接口開發你應該知道的一切

這篇文章中個人結合自己的實踐經驗把 OpenAI 官方文檔解讀一遍。但是原文檔涉及內容眾多,包括微調,嵌入(Embeddings)等眾多主題,我這里重點挑選自己開發高頻使用到的,需要詳細了解的可以自行前往官網閱讀。…

Java中的文本搜索與全文檢索引擎

Java中的文本搜索與全文檢索引擎 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 在現代應用程序中,處理和搜索大量文本數據是一項關鍵任務。傳統的…

2024科技文化節程序設計競賽

補題鏈接 https://www.luogu.com.cn/contest/178895#problems A. 簽到題 忽略掉大小為1的環&#xff0c;答案是剩下環的大小和減環的數量 #include<bits/stdc.h> #include<iostream> #include<cstdio> #include<vector> #include<map> #incl…