【Redis-05】高可用方案-主從哨兵

1 概述

高可用(High Availability)指系統在部分節點故障時仍能持續提供服務的能力。Redis 作為核心緩存組件,主流的高可用方案有主從復制、哨兵模式、集群模式三種。本文介紹主從復制、哨兵模式兩種高可用方案。

2 主從復制

通過 “一主多從” 架構實現數據同步,主節點處理寫請求并異步復制數據到從節點。從節點可承擔讀請求,提升系統吞吐量,但主節點故障時需人工切換,存在單點風險,適用于對自動化要求不高的輕量級場景。

  • 數據冗余,實現數據的熱備份
  • 讀寫分離,負載均衡。主節點負載讀寫,從節點負責讀,提高服務器并發量

2.1 部署架構(1主多從)

在這里插入圖片描述

2.2 復制原理

Redis 的主從復制機制均采用異步復制,我們也稱為樂觀復制,這種復制方式意味著不能完全保證主庫和從庫數據的實時一致性。Redis的主從復制機制可以根據不同的業務場景可以采用不同的應對方式。下面是一些主要場景及其對應的實現方案:

  1. 首次配置完成主從庫之后的全量復制:在從庫第一次連接到主庫時,將采用psync復制方式進行全量復制。這意味著從庫會從頭開始復制主庫中的全部數據。
  2. 主從正常運行期間,準實時同步:在正常運行狀態下,從庫通過讀取主庫的緩沖區來進行增量復制。這個過程涉及復制主庫上發生的新的數據變更。
  3. 從庫第二次啟動(異常或主從網絡斷開后恢復):Append增量數據 + 準實時同步將通過讀取主庫的緩沖區進行部分復制。這種方式能夠快速同步中斷期間發生的數據變更,而不會對主庫造成重大影響。

2.3 數據同步

在主從服務器建立連接確認各自身份之后,就開始數據同步,從服務器向主服務器發送PSYNC命令,執行同步操作,并把自己的數據庫狀態更新至主服務器的數據庫狀態。Redis的主從同步分為:完整重同步(full resynchronization)和部分重同步(partial resynchronization)

2.3.1 全量同步

有兩種情況下是完整重同步,

  • slave連接上master第一次復制的時候;
  • 當主從斷線,重新連接復制的時候有可能是完整重同步(詳細說明見下節)
    在這里插入圖片描述
  1. 從服務器連接主服務器,發送SYNC命令
  2. 主服務器接收到SYNC命名后,開始執行bgsave命令生成RDB文件并使用緩沖區記錄此后執行的所有寫命令
  3. 主服務器basave執行完后,向所有從服務器發送快照文件,并在發送期間繼續記錄被執行的寫命令
  4. 從服務器收到快照文件后丟棄所有舊數據,載入收到的快照
  5. 主服務器快照發送完畢后,開始向從服務器發送緩沖區中的寫命令
  6. 從服務器完成對快照的載入,開始接收命令請求,并執行來自主服務器緩沖區的寫命令

2.3.2 全量同步

部分重同步是用于處理斷線后重復制的情況,先介紹幾個用于部分重同步的部分

  • runid(replication ID),主服務器運行id,Redis實例在啟動時,隨機生成一個長度40的唯一字符串來標識當前節點
  • offset,復制偏移量。主服務器和從服務器各自維護一個復制偏移量,記錄傳輸的字節數。當主節點向從節點發送N個字節數據時,主節點的offset增加N,從節點收到主節點傳來的N個字節數據時,從節點的offset增加N
  • replication backlog buffer,復制積壓緩沖區。是一個固定長度的FIFO隊列,大小由配置參數repl-backlog-size指定,默認大小1MB。需要注意的是該緩沖區由master維護并且有且只有一個,所有slave共享此緩沖區,其作用在于備份最近主庫發送給從庫的數據

當slave連接到master,會執行PSYNC 發送記錄舊的master的runid(replication ID)和偏移量offset,這樣master能夠只發送slave所缺的增量部分。但是如果master的復制積壓緩存區沒有足夠的命令記錄,或者slave傳的runid(replication ID)不對,就會進行完整重同步,即slave會獲得一個完整的數據集副本。
在這里插入圖片描述

2.4 總結

主從復制引入了數據冗余節點,提高了Redis的高可用性,同時提高了Redis服務的讀負載能力。但是Master節點掛了,只能人工干預恢復環境,因此,無人值守變成剛需。

3 哨兵模式

在主從復制基礎上引入獨立的哨兵集群,實時監控主從節點狀態。當主節點故障時,哨兵自動選舉新主節點并完成拓撲重構,實現無人值守的故障轉移。相比主從復制,其自動化程度更高,但仍受限于單主節點的容量上限。哨兵負責三個任務:監控,選主(選擇主庫)和通知。

  • 監控:監控是指哨兵進程運行時,周期性(默認1秒)給所有主從節點發送 PING 命令,當主從節點收到PING 命令后,會發送一個響應命令給哨兵,這樣就可以檢測他們是否仍然在線運行。從庫沒有在規定時間內響應哨兵的PING命令,哨兵就會把它標記為"下線狀態";主庫沒有在規定時間呢響應哨兵的PING命令,哨兵就會判定主庫下線啟動選主流程。
  • 選主:哨兵在主庫掛了以后,按照一定規則從從庫中選出作為新的主庫。
  • 通知:哨兵將選出的新主庫連接信息發給其他從庫,從庫和新主庫建立連接,執行replicaof命令,復制數據。同時,哨兵會把新主庫的連接信息通知給客戶端,讓它們將操作請求發送給新主庫上。

3.3 部署架構

在這里插入圖片描述

3.4 主節點下線

  • SDown主觀下線(Subjectively Down):單個sentinel自己主觀上檢測到的關于master的狀態,從sentinel的角度來看,如果發送了PING心跳后,在一定時間內沒有收到合法的回復,就達到了SDOWN的條件。
  • ODown客觀下線(Objectively Down):需要一定數量的sentinel,多個哨兵達成一致意見才能認為一個master客觀上已經宕機。quorum這個參數是進行客觀下線的一個依據,法定人數/法定票數 意思是至少有quorum個sentinel認為這個master有故障才會對這個master進行下線以及故障轉移。因為有的時候,某個sentinel節點可能因為自身網絡原因導致無法連接master,而此時master并沒有出現故障,所以這就需要多個sentinel都一致認為該master有問題,才可以進行下一步操作,這就保證了公平性和高可用。

3.5 選舉原理

當主節點被判斷客觀下線后,各個哨兵節點會進行協商,先選舉出一個==領導者哨兵節點(兵王)==并由該領導者也即被選舉出的兵王進行failover(故障轉移)。

3.5.1 哨兵選舉

在這里插入圖片描述

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

3.5.2 主節點選擇

在這里插入圖片描述

3.6 總結

在主從復制的基礎上,哨兵引入了主節點的自動故障轉移,進一步提高了Redis的高可用性;但是哨兵的缺陷同樣很明顯:哨兵無法對從節點進行自動故障轉移,在讀寫分離場景下,從節點故障會導致讀服務不可用,這就需要對從節點做額外的監控、切換操作。 此外,哨兵仍然沒有解決寫操作無法負載均衡、存儲能力受到單機限制的問題。

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

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

相關文章

焊接機器人智能節氣裝置

工業焊接作為現代制造業的重要組成部分,廣泛應用于汽車、航空航天、建筑、船舶等多個領域。隨著自動化技術的快速發展,焊接機器人已成為提升焊接效率和質量的關鍵裝備。在傳統焊接及部分自動化焊接過程中,氣體流失問題仍然普遍存在&#xff0…

【6.1.0 漫畫數據庫技術選型】

漫畫數據庫技術選型 🎯 學習目標:掌握架構師核心技能——數據庫技術選型,針對不同業務場景選擇最合適的數據庫方案 🏛? 第一章:關系型數據庫對比選型 🤔 MySQL vs PostgreSQL vs TiDB 想象數據庫就像不同…

CVE-2022-4262/CVE-2022-3038

CVE-2022-4262(Linux內核UAF漏洞)漏洞原理CVE-2022-4262是Linux內核中RDS(Reliable Datagram Sockets)協議實現的一個UAF(Use-After-Free,釋放后使用)漏洞。具體來說:在rds_rdma_ext…

[Token]Token merging for Vision Generation

Token Compression for Vision Domain_Generation 文章目錄Image GenerationToken Merging for Fast Stable Diffusion, CVPRW 2023.Token Fusion: Bridging the Gap between Token Pruning and Token Merging, WACV 2024ToDo: Token Downsampling for Efficient Generation of…

React封裝過哪些組件-下拉選擇器和彈窗表單

背景(S - Situation):在某活動管理系統中,前端頁面需要支持用戶選擇“要配置的當前活動”,并提供「新增」「編輯」功能,操作內容包括填寫活動名稱、ID、版本號等字段。原始實現邏輯分散、復用性差&#xff…

多租戶架構下的多線程處理實踐指南

在現代 SaaS 系統中,多租戶架構(Multi-Tenant Architecture)已成為主流。然而,隨著系統性能要求的提升和業務復雜度的增加,多線程成為不可避免的技術手段。但在多租戶環境下使用多線程,容易引發數據錯亂、租…

MyBatis插件機制揭秘:從攔截器開發到分頁插件實戰

一、攔截器體系架構解析 1.1 責任鏈模式在MyBatis中的實現 MyBatis通過動態代理技術構建攔截器鏈&#xff0c;每個插件相當于一個切面&#xff1a; // 攔截器鏈構建過程 public class InterceptorChain {private final List<Interceptor> interceptors new ArrayList<…

百度文心一言開源ERNIE-4.5深度測評報告:技術架構解讀與性能對比

目錄一、技術架構解讀1.1、ERNIE 4.5 系列模型概覽1.2、模型架構解讀1.2.1、異構MoE&#xff08;Heterogeneous MoE&#xff09;1.2.2、視覺編碼器&#xff08;Vision Encoder&#xff09;1.2.3、適配器&#xff08;Adapter&#xff09;1.2.4、多模態位置嵌入&#xff08;Multi…

Matplotlib 模塊入門

Python 中有個非常實用的可視化庫 ——Matplotlib。數據可視化是數據分析中不可或缺的環節&#xff0c;而 Matplotlib 作為 Python 的 2D 繪圖庫&#xff0c;能幫助我們生成高質量的圖表&#xff0c;讓數據更直觀、更有說服力。接下來&#xff0c;我們將從 Matplotlib 的概述、…

LeetCode 3169.無需開會的工作日:排序+一次遍歷——不需要正難則反,因為正著根本不難

【LetMeFly】3169.無需開會的工作日&#xff1a;排序一次遍歷——不需要正難則反&#xff0c;因為正著根本不難 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-days-without-meetings/ 給你一個正整數 days&#xff0c;表示員工可工作的總天數&#xff08;從第…

VUE3 el-table 主子表 顯示

在Vue 3中&#xff0c;實現主子表&#xff08;主從表&#xff09;的顯示通常涉及到兩個組件&#xff1a;一個是主表&#xff08;Master Table&#xff09;&#xff0c;另一個是子表&#xff08;Detail Table&#xff09;。我們可以使用el-table組件來實現這一功能。這里&#x…

張量數值計算

一.前言前面我們介紹了一下pytorch還有張量的創建&#xff0c;而本章節我們就來介紹一下張量的計算&#xff0c;類型轉換以及操作&#xff0c;這個是十分重要的&#xff0c;我們的學習目標是&#xff1a;掌握張量基本運算、掌握阿達瑪積、點積運算 掌握PyTorch指定運算設備。Py…

部署項目頻繁掉線-----Java 進程在云服務器內存不足被 OOM Killer 頻繁殺死-----如何解決?

一、查詢系統日志grep -i "java" /var/log/messages執行這條命令&#xff0c;檢查系統日志里是否有 Java 進程被 OOM Killer 殺死的記錄。日志中反復出現以下內容&#xff1a;Out of memory: Killed process 3679325 (java) total-vm:2947000kB, anon-rss:406604kB..…

【保姆級教程】基于anji-plus-captcha實現行為驗證碼(滑動拼圖+點選文字),前后端完整代碼奉上!

前言 驗證碼作為Web應用的第一道安全防線&#xff0c;其重要性不言而喻。但你是否還在為以下問題煩惱&#xff1a; 傳統字符驗證碼用戶體驗差&#xff0c;識別率低&#xff1f;驗證碼安全性不足&#xff0c;輕易被爬蟲破解&#xff1f;前后端對接繁瑣&#xff0c;集成效率低&…

HTML-八股

1、DOM和BOM DOM是表示HTML或者XML文檔的標準的對象模型&#xff0c;將文檔中每個組件&#xff08;元素、屬性等&#xff09;都作為一個對象&#xff0c;使用JS來操作這個對象&#xff0c;從而動態改變頁面內容&#xff0c;結合等。 DOM是以樹型結構組織文檔內容&#xff0c;樹…

ADI的EV-21569-SOM核心板和主板轉接卡的鏈接說明

ADI提供給客戶很多DSP的核心板&#xff0c;比如EV-21569-SOM&#xff0c;EV-21593-SOM&#xff0c;EV-SC594-SOM等&#xff0c;非常多&#xff0c;但是沒有底板&#xff0c;光一個核心板怎么用呢&#xff1f;于是我就在想&#xff0c;我的21569評估板就有通用底板&#xff0c;能…

基于 Redisson 實現分布式系統下的接口限流

在高并發場景下&#xff0c;接口限流是保障系統穩定性的重要手段。常見的限流算法有漏桶算法、令牌桶算法等&#xff0c;而單機模式的限流方案在分布式集群環境下往往失效。本文將介紹如何利用 Redisson 結合 Redis 實現分布式環境下的接口限流&#xff0c;確保集群中所有節點的…

ubuntu播放rosbag包(可鼠標交互)

1 前言 眾所周知&#xff0c;ubuntu中播放bag包最主要的工具是rviz&#xff0c;然而rviz有一個無法忍受的缺陷就是不支持鼠標回滾&#xff0c;并且顯示的時間的ros時間&#xff0c;不是世界時間&#xff0c;因此在遇到相關bug時不能與對應的世界時間對應。基于以上&#xff0c…

一文理解緩存的本質:分層架構、原理對比與實戰精粹

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry 一文理解緩存的本質&#xff1a;分層架構、原理對比與實戰精粹 “緩存讓系統飛起來”——但每一層緩存有何不同&#xff1f;…

【離線數倉項目】——電商域DIM層開發實戰

摘要本文主要介紹了電商域離線數倉項目中DIM層的開發實戰。首先闡述了DIM層的簡介、作用、設計特征、典型維度分類以及交易支付場景下的表示例和客戶維度表設計。接著介紹了DIM層設計規范&#xff0c;包括表結構設計規范、數據處理規范以及常見要求規范。然后詳細講解了DIM層的…