0x01、Redis 主從復制的實現原理是什么?

Redis 主從復制概述

Redis 的主從復制是一種機制,允許一個主節點(主實例)將數據復制到一個或多個從節點(從實例)。通過這一機制,從節點可以獲取主節點的數據并與之保持同步。

復制流程
  1. 開始同步:從節點通過向主節點發送 PSYNC 命令請求同步。
  2. 全量復制:如果是第一次連接或之前的連接失效,從節點會請求進行全量復制,主節點會將當前數據快照(RDB 文件)發送給從節點。
  3. 增量復制:全量復制完成后,主從之間保持一個長連接,主節點會通過此連接將后續的寫操作傳遞給從節點,從而確保數據一致性。

Redis 主從架構

下圖展示了一個 Redis 主從架構:

復制
復制
Redis 主
Redis 從
Redis 從

在這一架構中,僅主節點可以進行寫入操作,而其他從節點通過復制來保持數據的一致性。這種機制不僅保障了數據一致性,還通過將讀請求分散到多個節點,提高了系統的吞吐量和可用性。

寫請求
讀請求
讀請求
復制
復制
客戶端
redis主
redis從
redis從

主從復制原理詳解

Redis 的主從復制主要有兩種同步方式:全量同步和增量同步。

1. 全量同步

下圖描述了全量同步的流程:

主節點 從節點 psync ? -1 fullresync runid offset 執行 bgsave 傳輸 rdb 存儲 runid offset 清空本地數據\n加載 rdb 加載完畢 緩存的新寫入命令\nreplication buffer 同步緩存的新寫操作 執行寫入命令 主節點 從節點
  • 流程
    • 從節點發送命令 psync ? -1 觸發全量同步請求。
    • 主節點接收到請求后,發現從節點傳遞的 run ID 為“?”(表示未知),因此判斷為需要進行全量同步,并返回其自身的 run ID 以及當前的復制進度。
    • 主節點執行 bgsave 生成 RDB 文件,同時將新接收到的寫入命令存儲在一個名為 replication buffer 的臨時緩沖區中。
    • RDB 文件生成完成后,主節點將其發送給從節點,從節點在接收后清空舊數據并加載新的 RDB 數據。
    • 加載完成后,主節點將 replication buffer 中緩存的寫入命令發送給從節點,以確保數據的一致性。
2. 增量同步
  • 背景:在網絡不穩定的情況下,主節點的一部分寫操作可能未能成功傳遞給從節點。全量同步的數據量較大且耗時,因此 Redis 引入了增量同步(從 Redis 2.8 版本開始)。
  • 使用 repl_backlog_buffer
    • repl_backlog_buffer 是一個環形緩沖區,默認大小為 1 MB,用于存儲主節點最近的寫入命令。
    • 當從節點重新連接時,如果它的 run ID 與主節點一致,并且 offset 值在 repl_backlog_buffer 中,主節點將從緩沖區中查找相應的命令并發送給從節點,以實現增量同步。

replication buffer 與 repl_backlog_buffer 的區別

  • replication buffer

    • 每個從節點都有一個獨立的 replication buffer,用于實時傳輸寫命令。其大小是動態調整的。可以通過配置 client-output-buffer-limit 來控制其大小,以防止緩沖區過大導致的連接問題。
  • repl_backlog_buffer

    • repl_backlog_buffer 在主節點上是唯一的,主要用于存儲最近的寫命令,以便從節點在重新連接時能夠進行部分重同步。該緩沖區的大小是固定的,主要用于支持增量同步。

通過以上設計,Redis 能夠實現高可用性和高性能的數據管理。

當然可以!下面是你要的 Markdown 格式:題目和選項部分在前,所有答案和解析統一放在最后,方便做題和核對。


Redis 主從復制選擇題(共 5 題)

1. 在 Redis 主從復制中,如果從節點是第一次連接主節點,或者之前的連接失效,從節點會如何進行同步?
A. 從節點會請求全量復制,主節點將當前數據快照(RDB 文件)發送給從節點  
B. 從節點會請求全量復制,主節點將當前內存快照以流的形式發送  
C. 從節點會請求主節點的 AOF 日志文件  
D. 從節點請求主節點的 replication buffer 中的數據  

2. Redis 主從復制中,以下哪個緩沖區是用于存儲最近的寫命令,并用于從節點重新連接進行部分重同步?
A. replication buffer  
B. client-output-buffer-limit  
C. repl_backlog_buffer  
D. psync命令緩沖區  

3. 如何避免 Redis 主從復制中頻繁進行全量同步?
A. 增強主節點內存大小  
B. 增加從節點數量  
C. 增加 repl_backlog_buffer 和 client-output-buffer-limit 的大小  
D. 增加主節點 CPU 數量  

4. 對于從節點延遲較大的情況,如何控制從節點使用的內存緩沖?
A. 調整主節點的 RDB 文件生成頻率  
B. 限制從節點的 client-output-buffer-limit  
C. 調整 client-output-buffer-limit 控制主節點的 replication buffer 大小  
D. 增加網絡帶寬  

5. 當增量同步失敗后,為什么 Redis 會選擇進行全量同步?
A. repl_backlog_buffer 中的數據已經被覆蓋  
B. repl_backlog_buffer 中的數據被誤刪  
C. 主節點丟失了隊列內的 runid  
D. 從節點數據損壞  

? 答案與解析

1. 正確答案:A
解析:當從節點首次連接或失聯重新連接時,主節點會向其發送全量數據快照(RDB 文件)進行同步。


2. 正確答案:C
解析:repl_backlog_buffer 是用于部分同步的緩沖區,記錄最近的寫命令。


3. 正確答案:C
解析:增加相關 buffer 的大小可以有效避免 offset 被覆蓋,從而減少全量同步頻率。


4. 正確答案:B
解析:client-output-buffer-limit 控制從節點在主節點上的輸出緩存,限制可避免資源過度消耗。


5. 正確答案:A
解析:如果從節點 offset 太舊,而 repl_backlog_buffer 已被覆蓋,則只能重新進行全量同步。


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

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

相關文章

整活 kotlin + springboot3 + sqlite 配置一個 SQLiteCache

要實現一個 SQLiteCache 也是很簡單的只需要創建一個 cacheManager Bean 即可 // 如果配置文件中 spring.cache.sqlite.enable false 則不啟用 Bean("cacheManager") ConditionalOnProperty(name ["spring.cache.sqlite.enable"], havingValue "t…

深入探索如何壓縮 WebAssembly

一、初始體積:默認 Release 構建 我們從最基礎的構建開始,不開啟調試符號,僅使用默認的 release 模式: $ wc -c pkg/wasm_game_of_life_bg.wasm 29410 pkg/wasm_game_of_life_bg.wasm這是我們優化的起點 —— 29,410 字節。 二…

多角度分析Vue3 nextTick() 函數

nextTick() 是 Vue 3 中的一個核心函數,它的作用是延遲執行某些操作,直到下一次 DOM 更新循環結束之后再執行。這個函數常用于在 Vue 更新 DOM 后立即獲取更新后的 DOM 狀態,或者在組件渲染完成后執行某些操作。 官方的解釋是,當…

前端面試-自動化部署

基礎概念 什么是CI/CD?在前端項目中如何應用?自動化部署相比手動部署有哪些優勢?常見的自動化部署工具有哪些?舉例說明它們的區別(如Jenkins vs GitHub Actions)。如何通過Git Hook實現自動化部署&#xf…

架構生命周期(高軟57)

系列文章目錄 架構生命周期 文章目錄 系列文章目錄前言一、軟件架構是什么?二、軟件架構的內容三、軟件設計階段四、構件總結 前言 本節講明架構設計的架構生命周期概念。 一、軟件架構是什么? 二、軟件架構的內容 三、軟件設計階段 四、構件 總結 就…

GPTNet如何革新創意與效率

引言 人工智能正在以前所未有的速度改變我們的工作與生活方式,從智能寫作到視覺創作,AI工具已成為不可或缺的伙伴。在眾多平臺中,GPTNet以其強大的功能整合和直觀體驗嶄露頭角。它不僅匯集了GPT系列、Claude、Grok、Gemini等頂級對話模型&am…

【計網】SSL/TLS核心原理

序言 在HTTP協議中,信息是明文傳輸的,因此為了通信安全就有了HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)協議。HTTPS也是一種超文本傳送協議,在HTTP的基礎上加入了SSL/TLS協議,SSL/TLS依靠證書來驗證服務端的…

Web Components 開發與集成

以下是關于 Web Components 開發與集成 的系統知識梳理,涵蓋核心概念、高級特性、集成與優化等內容: 一、Web Components 核心概念 技術作用核心 APICustom Elements定義可復用的自定義 HTML 元素customElements.define()、生命周期鉤子(connectedCallback 等)Shadow DOM封…

day26 學習筆記

文章目錄 前言一、圖像顏色轉換1.HSV顏色空間2.顏色轉換 二、灰度化1.最大值法2.平均值法3.加權均值法 三、二值化1.全局閾值法1.閾值法(THRESH_BINARY)2.反閾值法(THRESH_BINARY_INV)3.截斷閾值法(THRESH_TRUNC)4.低閾值零處理(THRESH_TOZERO)5.超閾值零處理(THRESH_TOZERO_IN…

威鋒VL822-Q7T10GHUB芯片適用于擴展塢顯示器

一、概述 VL822-Q7T是VIA Lab(威盛電子旗下專注于USB相關技術研發的子公司)精心打造的一款高性能USB 3.1 Gen2集線器控制器芯片。在當今數字化時代,USB接口作為設備連接與數據傳輸的核心通道,其性能與穩定性至關重要。VL822-Q7T憑…

華為OD機試真題——最小的調整次數/特異性雙端隊列(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式! 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《最小的調…

關于 Spring Boot 微服務解決方案的對比,并以 Spring Cloud Alibaba 為例,詳細說明其核心組件的使用方式、配置及代碼示例

以下是關于 Spring Boot 微服務解決方案的對比,并以 Spring Cloud Alibaba 為例,詳細說明其核心組件的使用方式、配置及代碼示例: 關于 Spring Cloud Alibaba 致力于提供微服務開發的一站式解決方案! https://sca.aliyun.com/?spm7145af80…

常見的爬蟲算法

1.base64加密 base64是什么 Base64編碼,是由64個字符組成編碼集:26個大寫字母AZ,26個小寫字母az,10個數字0~9,符號“”與符號“/”。Base64編碼的基本思路是將原始數據的三個字節拆分轉化為四個字節,然后…

B樹、紅黑樹、B+樹和平衡二叉樹(如AVL樹)的區別

B樹、紅黑樹、B樹和平衡二叉樹(如AVL樹)的區別及優缺點的總結: 1. 平衡二叉樹(AVL樹) 結構:二叉搜索樹,每個節點的左右子樹高度差不超過1。平衡方式:通過旋轉(左旋/右旋…

Python Cookbook-6.5 繼承的替代方案——自動托管

任務 你需要從某個類或者類型繼承,但是需要對繼承做一些調整。比如,需要選擇性地隱藏某些基類的方法,而繼承并不能做到這一點。 解決方案 繼承是很方便的,但它并不是萬用良藥。比如,它無法讓你隱藏基類的方法或者屬…

長短期記憶網絡:從理論到創新應用的深度剖析

一、引言 1.1 研究背景 深度學習在人工智能領域的發展可謂突飛猛進,而長短期記憶網絡(LSTM)在其中占據著至關重要的地位。隨著數據量的不斷增長和對時序數據處理需求的增加,傳統的神經網絡在處理長序列數據時面臨著梯度消失和梯…

vue3.2 + element-plus 實現跟隨input輸入框的彈框,彈框里可以分組或tab形式顯示選項

效果 基礎用法&#xff08;分組選項&#xff09; 高級用法&#xff08;帶Tab欄&#xff09; <!-- 彈窗跟隨通用組件 SmartSelector.vue --> <!-- 彈窗跟隨通用組件 --> <template><div class"smart-selector-container"><el-popove…

C語言中冒泡排序和快速排序的區別

冒泡排序和快速排序都是常見的排序算法&#xff0c;但它們在原理、效率和應用場景等方面存在顯著區別。以下是兩者的詳細對比&#xff1a; 一、算法原理 1. 冒泡排序 原理&#xff1a;通過重復遍歷數組&#xff0c;比較相鄰元素的大小&#xff0c;并在必要時交換它們的位置。…

軟件信息安全性測試如何進行?有哪些注意事項?

隨著信息技術的高速發展&#xff0c;軟件已經成為我們生活和工作中不可或缺的一部分。然而&#xff0c;隨著軟件產品的廣泛普及&#xff0c;軟件信息安全性問題也日益凸顯&#xff0c;因此軟件信息安全性測試必不可少。那么軟件信息安全性測試應如何進行呢?在進行過程中又有哪…

springboot集成mybaits-generator自動生成代碼

文章目錄 概述創建springboot項目pom文件aplication.yml代碼生成類mybatis-plus提供的變量controller模板mapper模板總結 概述 創建springboot項目&#xff0c;在這里使用的是springboot 2.6.13版本&#xff0c;引入的項目依賴包如pom文件所寫&#xff0c;jdk使用1.8&#xff…