【Redis】哨兵(sentinel)

文章目錄

  • 一、哨兵是什么?
  • 二、 哨兵sentinel文件參數
  • 三、 模仿主機redis宕機
  • 四、哨兵運行流程和選舉原理
    • SDOWN主觀下線
    • ODOWN客觀下線
  • 五、 使用建議


以下是本篇文章正文內容

一、哨兵是什么?

哨兵巡查監控后臺master主機是否故障,如果故障了根據投票數自動將某一個從庫轉換為新主庫,繼續對外服務,俗稱無人值守運維

作用:監控redis運行狀態,包括master和slave,當master down機時,能自動將slave切換成新master

哨兵的四個功能

  • 主從監控
    • 監控主從redis庫運行是否正常
  • 消息通知
    • 哨兵可以將故障轉移的結果發送到客戶端
  • 故障轉移
    • 如果master異常,則會進行主從切換,將其中一個slave作為新master
  • 配置中心
    • 客戶端通過連接哨兵來獲得當前Redis服務的主節點地址

Redis Sentinel架構
客戶端通過哨兵集群訪問redis 主從復制架構,哨兵集群對主從復制進行監視

本案例架構如下
在這里插入圖片描述

  • 3個哨兵
    • 自動監控和維護集群,不存放數據,只是監控
  • 1主2從
    • 用于數據讀取和存放
    • 主機后續可能會變成從機,需要設置訪問新主機的密碼,需要在主機conf文件設置masterauth項訪問密碼為111111,

二、 哨兵sentinel文件參數

  • bind 服務監聽地址,用于客戶端連接
  • daemonize 是否以后臺daemon方式運行
  • protected-mode 安全保護模式
  • port 端口
  • logfile 日志文件路徑
  • pidfile pid日志路徑
  • dir 工作目錄
  • sentiel monitor < master > < ip > < redis-port > < quorm >
    • 設置要監控的master
    • quorm 表示最少有幾個哨兵認可客觀下線,同意故障遷移的法定票數

網絡是不可靠的,有時候一個sentinel會因為網絡堵塞而誤以為一個master redis已經死掉了,在sentinel集群環境下需要多個sentinel互相溝通來確認某個master是否真的死了,
quorum這個參數是進行客觀下線的一個依據,意思是至少有quorum個sentinel認為這個master有故障,才會對這個master進行下線以及故障轉移。
因為有的時候,某個sentinel節點可能因為自身網絡原因,導致無法連接master,而此時master并沒有出現故障,所以,這就需要多個sentinel都一致認為該master有問題,才可以進行下一步操作,這就保證了公平性和高可用。

  • sentiel auth-pass 通過密碼連接master

可以直接把以上參數新建一個文件sentiel.conf寫進redis工作的目錄(即redis.conf所在的目錄)
本案例有三個哨兵,需要新建三個sentiel.conf文件
在這里插入圖片描述

啟動主從redis后,啟動哨兵

redis-sentinel sentinel26379.conf --sentinel
redis-sentinel sentinel26380.conf --sentinel
redis-sentinel sentinel26381.conf --sentinel

Tip:一個哨兵可以同時監控多個redis,只需將配置文件中這些參數進行調整,需要時候可以另行搜索學習。

三、 模仿主機redis宕機

關閉6379主機redis服務器,模仿master掛了

  • 兩臺從機的數據不會丟失

  • 會從其他兩臺從機選出一個新的master

  • 掛掉的master重連回來,直接變成新master的從機

  • 本案例中的 sentinel26379.conf、sentinel26380.conf、sentinel26381.conf會在運行中進行動態更改,在conf文件末尾自動添加主從redis所需要的配置

  • 在master-slave切換中,master的conf文件中會自動多一行slaveof的配置

四、哨兵運行流程和選舉原理

當一個主從配置中的master失效之后,sentinel可以選舉出一個新的master
用于自動接替原master的工作,主從配置中的其他redis服務器自動指向新的master同步數據。一般建議sentinel采取奇數臺,防止某一臺sentinel無法連接到master導致誤切換

SDOWN主觀下線

SDOWN 是單個sentinel 自己主觀上檢測到的關于master的失效狀態,從sentinel的角度來看,如果發送了PING心跳后,在timeout時間內沒有收到合法的回復,就達到了SDOWN的條件

sentinel配置文件中的down-after-milliseconds 設置了判斷主觀下線的時間長度
在這里插入圖片描述
sentinel down-after-milliseconds <masterName> <timeout>

ODOWN客觀下線

ODOWN需要一定數量的sentinel,多個哨兵達成一致意見才能認為一個master客觀上已經宕機

這就用到了二、 哨兵sentinel文件參數中的sentiel monitor < master > < ip > < redis-port > < quorm >命令

quorm 表示最少有幾個哨兵認可客觀下線,同意故障遷移的法定票數

  • 選舉出領導者哨兵
    當主節點被判斷客觀下線以后,各個哨兵節點會進行協商,先選舉出一個領導者哨兵節點并由該領導者節點進行failover(故障遷移)

    • Raft算法 選出領導者節點

在這里插入圖片描述
監視該主節點的所有哨兵都有可能被選為領導者,選舉使用的算法是Raft算法;
Raft算法的基本思路是先到先得:即在一輪選舉中,哨兵A向B發送成為領導者的申請,如果B沒有同意過其他哨兵,則會同意A成為領導者

  • 由領導者節點開始推動故障切換并選出一個新master

    • 某個slave 成為新 master
    • 其它slave自動進行相關配置和命令修改
    • 老master回來也變為slave
  • 選舉新master的過程:

    • 優先級高的成為新master
    • 否則是復制偏移量大的成為新master(即誰的復制的數據多)
    • 否則看RunID,最小的為新master

以上的failover都是sentinel自己獨立完成,完全無需人工干預

五、 使用建議

  • 哨兵節點的數量應為多個,哨兵本身應該集群,保證高可用
  • 哨兵節點的數量應該是奇數個(這是從投票機制考慮,避免相同票數導致不能決定SDOWN主觀下線)
  • 各個哨兵節點的配置應該一致
  • 如果哨兵節點部署在Docker等容器里,要注意端口的正確映射
  • 哨兵集群+主從復制,并不能保證數據零丟失(因為選舉機制會有時間間隔,導致寫入操作的丟失)

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

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

相關文章

js項目生產環境中移除 console

1、terser-webpack-plugin webpack 構建的項目中安裝使用 安裝&#xff1a; npm install terser-webpack-plugin --save-dev 配置 在webpack.config.js文件中 new TerserPlugin({terserOptions: {output: {comments: false, // 去除注釋},warnings: false, // 去除黃色警告,co…

nx上darknet的使用-目標檢測-自定義訓練與制作預訓練模型

目錄 1 訓練yolov4-tiny 1.1 文件準備 1.1.1 Annotations 1.1.2 JPEGImages 1.1.3 labels 1.1.4 trained_models 1.1.5 classes.name 1.1.6 create_labels_txt.py 1.1.7 custom_training.data 1.1.8 get_labels.py 1.1.9 get_train_val.py 1.1.10 train…

python制作甘特圖的基本知識(附Demo)

目錄 前言1. matplotlib2. plotly 前言 甘特圖是一種常見的項目管理工具&#xff0c;用于表示項目任務的時間進度 直觀地看到項目的各個任務在時間上的分布和進度 常用的繪制甘特圖的工具是 matplotlib 和 plotly 主要以Demo的形式展示 1. matplotlib 功能強大的繪圖庫&a…

內網對抗-基石框架篇單域架構域內應用控制成員組成用戶策略信息收集環境搭建

知識點&#xff1a; 1、基石框架篇-單域架構-權限控制-用戶和網絡 2、基石框架篇-單域架構-環境搭建-準備和加入 3、基石框架篇-單域架構-信息收集-手工和工具1、工作組(局域網) 將不同的計算機按照功能分別列入不同的工作組。想要訪問某個部門的資源&#xff0c;只要在“網絡…

Electron運行報錯:Error Cannot find module ‘node_moduleselectroncli.js‘

Electron運行報錯&#xff1a;Error: Cannot find module ‘node_modules\electron\cli.js’ 顧名思義&#xff0c;命令行執行Electron .時候&#xff0c;會優先從項目目錄查找對應依賴&#xff0c;如果是報錯顯示是找不到項目目錄下的依賴&#xff0c;我們可以從安裝在全局的…

DAMA學習筆記(五)-數據存儲和操作

1.引言 數據存儲與操作包括對存儲數據的設計、實施和支持&#xff0c;最大化實現數據資源的價值&#xff0c;貫穿于數據創建/獲取到處置的整個生命周期。 數據存儲與操作包含兩個子活動&#xff08;圖6-1&#xff09;。 圖6-1 語境關系圖&#xff1a;數據存儲與操作 (1) 數據庫…

記錄vite項目中Cornerstone的兼容問題(持續更新)

&#x1f50e; 在vite項目中打包提示錯誤 ESM integration proposal for Wasm" is not supported currently. ?? 問題描述 Error: Could not load /home/xxx/xxx/node_modules/icr/polyseg-wasm/dist/ICRPolySeg.wasm (imported by node_modules/icr/polyseg-wasm/di…

js ES6 part3

Number 是內置構造函數&#xff0c;用來創建數值 const price 12.345console.log(price.toFixed(2))//保留兩位小數 12.35 綜合案例購物車 <body><div class"list"><!-- <div class"item"><img src"https://yanxuan-item…

【代碼隨想錄】【算法訓練營】【第66天】 [卡碼95]城市間貨物運輸II [卡碼96]城市間貨物運輸III

前言 思路及算法思維&#xff0c;指路 代碼隨想錄。 題目來自 卡碼網。 day 66&#xff0c;周五&#xff0c;ding ding~ [卡碼95] 城市間貨物運輸II 題目描述 卡碼95 城市間貨物運輸II 解題思路 前提&#xff1a; 思路&#xff1a; 重點&#xff1a; 代碼實現 C語言 …

數據結構(Java):隊列Queue集合力扣面試OJ題

1、隊列 1.1 隊列的概念 隊列是一個特殊的線性表&#xff0c;只允許在一端&#xff08;隊尾&#xff09;進行插入數據操作&#xff0c;在另一端&#xff08;對頭&#xff09;進行刪除數據。隊列具有先進先出FIFO(First In First Out)的特性。 入隊&#xff1a;數據只能從隊尾…

有獎競猜!斗牛士軍團與法蘭西騎士的終極之戰,誰將笑傲歐洲之巔?

痛快看球&#xff0c;暢玩游戲&#xff0c;AGON愛攻帶你進入酣暢淋漓的足球世界&#xff01; 7月15日&#xff0c;綠茵賽場硝煙再起&#xff0c;兩支身披榮光的王者之師&#xff0c;一路過關斬將&#xff0c;最終會師決賽。一場萬眾矚目的巔峰對決即將拉開帷幕&#xff0c;究竟…

linux UDP通訊:接口函數示例

一、主要用的接口&#xff1a; //服務器端 1. socket() 創建套接字 2. bind() 綁定套接字 與TCP區別開來&#xff0c;沒有listen()、accept()建立連接的過程 3. 通信 recvfrom() sendto() 4. close //客戶端 1. socket() 創建套接字 與TCP區別開來&#xff0c;沒有connect()建立…

數據結構——排序算法(冒泡、快速、選擇、插入)

文章目錄 1. 概念 2. 十大排序算法 3. 冒泡排序 4. 冒泡代碼實現 5. 快速排序 6. 快速代碼實現 7. 選擇排序 8. 選擇代碼實現 9. 插入排序 10. 插入代碼實現 1. 概念 排序&#xff08;Sort&#xff09;是將無序的記錄序列&#xff08;或稱文件&#xff09;調整成有序…

LabVIEW前面板占滿整個屏幕(轉)

希望在運行一個LabVIEW程序時&#xff0c;它的前面板能夠占據整個屏幕&#xff0c;且不顯示Windows的任務欄或其他任何的LabVIEW菜單選項。怎樣才能實現這一功能&#xff1f; 您可以通過手動配置或編程的方式實現該功能。 手動配置VI屬性 您可以通過以下操作&#xff0c;將…

導入項目,JAVA文件是咖啡杯圖標

問題 從圖中可以看到&#xff0c;JAVA文件是咖啡杯圖標 原因 項目沒有識別為MAVEN項目 解決辦法 進入pom.xml文件&#xff0c;右鍵點擊Add as Maven Project即可

在Ubuntu 16.04上安裝和保護MongoDB的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 簡介 MongoDB 是一個免費且開源的面向文檔的數據庫。它被歸類為 NoSQL 數據庫&#xff0c;因為它不依賴于傳統的基于表的關系型數據庫結…

Spring MVC入門3

看完這篇博客你能學到什么 理解JSON的使用理解注解PathVariable理解解注解RequestPart理解cookie和Session的基本概念理解cookie和Session的區別 如果想真正掌握&#xff0c;還需要自己勤加練習。 正文 JSON JSON概念 JSON&#xff1a;JavaScript Object Notation 【JavaS…

【YOLOv8】 用YOLOv8實現數字式工業儀表智能讀數(一)

上一篇圓形表盤指針式儀表的項目受到很多人的關注&#xff0c;咱們一鼓作氣&#xff0c;把數字式工業儀表的智能讀數也研究一下。本篇主要講如何用YOLOV8實現數字式工業儀表的自動讀數&#xff0c;并將讀數結果進行輸出&#xff0c;若需要完整數據集和源代碼可以私信。 目錄 &…

gin源碼分析

一、高性能 使用sync.pool解決頻繁創建的context對象&#xff0c;在百萬并發的場景下能大大提供訪問性能和減少GC // ServeHTTP conforms to the http.Handler interface. // 每次的http請求都會從sync.pool中獲取context&#xff0c;用完之后歸還到pool中 func (engine *Engin…

在C++中怎樣使用C庫

在C中使用C庫是一個相對直接的過程&#xff0c;因為C是從C發展而來的&#xff0c;并且與C高度兼容。這意味著你可以直接在C代碼中使用C庫函數、頭文件和變量&#xff0c;而無需進行特殊轉換。以下是一些基本的步驟和注意事項&#xff0c;用于在C中使用C庫&#xff1a; 1. 包含…