Redis主從復制數據同步實現原理詳細介紹

文章目錄

  • 一、主從復制的概念
  • 二、全量復制(完整重同步)
  • 三、增量復制(部分重同步)
    • 1. 增量復制的核心思想
    • 2. 增量復制的實現
    • 3. 復制偏移量(replicationoffset)
    • 4. 復制積壓緩沖區(replicationbacklog)
      • 4.1 緩沖區隊列內容
      • 4.2 緩沖區隊列更新
      • 4.3 同步方式判斷
      • 4.4 緩沖區配置優化
    • 5. 服務器的運行ID(runID)
  • 四、心跳檢測
  • 五、關鍵配置參數
  • 總結

Redis 為保證高可用,提供了主從服務器、集群搭建的方案。這樣即使某一個服務器宕機了,Redis 還可以對外提供服務。一般主服務器提供讀寫功能,從服務器只提供讀功能,為保證主從服務器的讀一致性,需要將主服務器的數據同步到從服務器。以下是關于主從服務器實現數據同步的詳細介紹:

一、主從復制的概念

Redis從2.8版本開始,使用PSYNC命令代替SYNC命令來執行復制時的同步操作。PSYNC指令分兩種同步模式:全量復制(完整重同步)增量復制(部分重同步)

Redis 主從服務器在初次連接的時候,會進行一次全量復制,當全量復制完成后會進行增量復制。slave 服務器在數據同步過程中會優先嘗試增量復制,如果不滿足增量復制條件,則發起全量復制。

以下是Redis 在主從復制時選擇兩種模式執行的流程:

在這里插入圖片描述


二、全量復制(完整重同步)

Redis 全量復制使用PSYNC命令,通過讓主服務器創建并發送RDB文件,以及向從服務器發送保存在緩沖區里面的寫命令來進行同步。

以下是Redis全量復制的執行步驟:

  1. 從服務器先判斷是否為初次復制:
    • 如果是初次復制,則通知主服務器進行全量復制;
    • 如果不是初次復制,則通知主服務器進行部分復制,但是主服務器判斷無法進行部分復制,最后主服務器會自己選擇執行全量復制。
  2. 主服務器收到全量復制命令后,執行BGSAVE命令,在后臺生成一個RDB文件,并使用一個緩沖區記錄從現在開始執行的所有寫命令。
  3. 當主服務器的BGSAVE命令執行完畢時,主服務器會將BGSAVE命令生成的RDB文件發送給從服務器,從服務器接收并載入這個RDB文件,將自己的數據庫狀態更新至主服務器執行BGSAVE命令時的數據庫狀態。
  4. 主服務器將記錄在緩沖區里面的所有寫命令發送給從服務器,從服務器執行這些寫命令,將自己的數據庫狀態更新至主服務器數據庫當前所處的狀態。
  5. 如果從服務器開啟了AOF,則會觸發bgrewriteaof的執行,從而保證AOF文件更新至主服務器數據庫的最新狀態。

在這里插入圖片描述


三、增量復制(部分重同步)

Redis 增量復制主要目的是解決主從服務器斷線重連后的 增量數據,避免全量復制的開銷。

1. 增量復制的核心思想

當從服務器在斷線后重新連接主服務器時,主服務器可以將主從服務器連接斷開期間執行的寫命令發送給從服務器,從服務器只要接收并執行這些寫命令,就可以將數據庫更新至主服務器當前所處的狀態。

在這里插入圖片描述

2. 增量復制的實現

增量復制同步功能的實現由以下三個部分構成:

  • 主服務器的復制偏移量(replicationoffset)和從服務器的復制偏移量。
  • 主服務器的復制積壓緩沖區(replicationbacklog)。
  • 服務器的運行ID(runID)。

3. 復制偏移量(replicationoffset)

執行復制的主服務器和從服務器會分別維護一個復制偏移量:

  • 主服務器每次向從服務器傳播N個字節的數據時,就將自己的復制偏移量的值加上N。
  • 從服務器每次收到主服務器傳播來的N個字節的數據時,就將自己的復制偏移量的值加上N。

假設當前主從服務器的復制偏移量的值都為10086,如果這時主服務器向三個從服務器傳播長度為33字節的數據,那么主服務器的復制偏移量將更新為10086+33=10119,而三個從服務器在接收到主服務器傳播的數據之后,也會將復制偏移量更新為10119。
在這里插入圖片描述

主從服務器通過維護復制偏移量,比較復制偏移量的大小,就可以判斷主從服務器是否處于一致狀態:

  • 如果主從服務器處于一致狀態,那么主從服務器兩者的偏移量總是相同的。
  • 相反,如果主從服務器兩者的偏移量并不相同,那么說明主從服務器并未處于一致狀態。

4. 復制積壓緩沖區(replicationbacklog)

復制積壓緩沖區是由主服務器維護的一個固定長度(fixed-size)先進先出(FIFO)隊列,默認大小為1MB。

4.1 緩沖區隊列內容

主服務器的復制積壓緩沖區里面會保存著一部分最近傳播的寫命令,并且復制積壓緩沖區會為隊列中的每個字節記錄相應的復制偏移量。
在這里插入圖片描述

4.2 緩沖區隊列更新

當主服務器進行命令傳播時,它不僅會將寫命令發送給所有從服務器,還會將寫命令入隊到復制積壓緩沖區里面。由于隊列是固定長度,所以隊列內保存的命令在不斷的更新。

如果主從服務器斷開時間很久,主從服務器的復制偏移量可能會相差很大,從服務器的復制偏移量可能已經不再緩沖區了。

在這里插入圖片描述

4.3 同步方式判斷

當從服務器重新連上主服務器時,從服務器會通過PSYNC命令將自己的復制偏移量offset發送給主服務器,主服務器會根據這個復制偏移量來決定對從服務器執行何種同步操作:

  • 如果offset偏移量之后的數據(也即是偏移量offset+1開始的數據)仍然存在于復制積壓緩沖區里面,那么主服務器將對從服務器執行增量復制操作。
  • 相反,如果offset偏移量之后的數據已經不存在于復制積壓緩沖區,那么主服務器將對從服務器執行全量復制操作。

4.4 緩沖區配置優化

Redis為復制積壓緩沖區設置的默認大小為1MB,如果主服務器需要執行大量寫命令,又或者主從服務器斷線后重連接所需的時間比較長,那么這個大小也許并不合適。如果復制積壓緩沖區的大小設置得不恰當,那么PSYNC命令的復制重同步模式就不能正常發揮作用,因此,正確估算和設置復制積壓緩沖區的大小非常重要。

優化配置復制積壓緩沖區大小repl-backlog-size的值,該值最小大小可以根據公式 2*second*writesizeper_second 來計算:

  • second為從服務器斷線后重新連接上主服務器所需的平均時間(以秒計算)。
  • write_size_per_second則是主服務器平均每秒產生的寫命令數據量(協議格式的寫命令的長度總和)。

5. 服務器的運行ID(runID)

除了復制偏移量和復制積壓緩沖區之外,實現增量復制還需要用到服務器運行ID(runID):

  • 每個Redis服務器,不論主服務器還是從服務,都會有自己的運行ID。
  • 運行ID在服務器啟動時自動生成,由40個隨機的十六進制字符組成,例如53b9b28df8042fdc9ab5e3fcbbbabff1d5dce2b3。
  • 當從服務器對主服務器進行初次復制時,主服務器會將自己的運行ID傳送給從服務器,而從服務器則會將這個運行ID保存起來。
  • 當從服務器斷線并重新連上一個主服務器時,從服務器將向當前連接的主服務器發送之前保存的運行ID:
    • 如果從服務器保存的運行ID和當前連接的主服務器的運行ID相同,那么說明從服務器斷線之前復制的就是當前連接的這個主服務器,主服務器可以繼續嘗試執行增量復制操作。
    • 相反地,如果從服務器保存的運行ID和當前連接的主服務器的運行ID并不相同,那么說明從服務器斷線之前復制的主服務器并不是當前連接的這個主服務器,主服務器將對從服務器執行全量復制操作。

四、心跳檢測

在命令傳播階段,從服務器默認會以每秒一次的頻率,向主服務器發送命令:

# replication_offset是從服務器當前的復制偏移量。
REPLCONF ACK <replication_offset>

從服務器發送REPLCONF ACK命令對于主從服務器有三個作用:

  • 檢測主從服務器的網絡連接狀態
    • 如果主服務器超過一秒鐘沒有收到從服務器發來的REPLCONF ACK命令,那么主服務器就知道主從服務器之間的連接出現問題了。
    • 通過向主服務器發送INFO replication命令,在列出的從服務器列表的lag一欄中,我們可以看到相應從服務器最后一次向主服務器發送REPLCONF ACK命令距離現在過了多少秒。
  • 輔助實現min-slaves選項
    • Redis的min-slaves-to-write和min-slaves-max-lag兩個選項可以防止主服務器在不安全的情況下執行寫命令。
    • 比如我們向主服務器設置min-slaves-to-write=3和min-slaves-max-lag=10,那么在從服務器的數量少于3個,或者三個從服務器的延遲(lag)值都大于或等于10秒時,主服務器將拒絕執行寫命令,這里的延遲值就是上面提到的INFO replication命令的lag值。
  • 檢測命令丟失
    • 如果因為網絡故障,主服務器傳播給從服務器的寫命令在半路丟失,那么當從服務器向主服務器發送REPLCONF ACK命令時,主服務器將發覺從服務器當前的復制偏移量少于自己的復制偏移量,然后主服務器就會根據從服務器提交的復制偏移量,在復制積壓緩沖區里面找到從服務器缺少的數據,并將這些數據重新發送給從服務器。
    • 注意,主服務器向從服務器補發缺失數據這一操作的原理和增量復制操作的原理非常相似,這兩個操作的區別在于,補發缺失數據操作在主從服務器沒有斷線的情況下執行,而部分重同步操作則在主從服務器斷線并重連之后執行。

五、關鍵配置參數

參數作用推薦值
repl-backlog-size調整復制積壓緩沖區大小2 * 網絡延遲 * 每秒寫入量
repl-diskless-sync啟用無盤復制,減少磁盤 I/Oyes(網絡良好時)
repl-diskless-sync-delay無盤復制延遲時間(秒)5
client-output-buffer-limit slave限制復制緩沖區大小,防止OOM512mb 128mb 60
repl-timeout復制超時時間60s(需大于repl-ping-replica-period
replica-serve-stale-data斷線時是否允許從節點響應讀請求no
replicaof <master_ip> <master_port>指定主節點地址

總結

Redis主從復制通過全量復制確保初始一致性,增量復制優化持續同步效率,結合復制積壓緩沖區偏移量跟蹤機制,實現了高效且可靠的數據同步。合理配置參數和監控網絡狀態是優化復制性能的關鍵。

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

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

相關文章

docker 軟件bug 誤導他人 筆記

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方隨便修改安裝命令&#xff0c;這個在4.4一下是無法使用的&#xff0c;存在誤導他人

Python 進階(六): Word 基本操作

目錄 1. 概述2. 寫入 2.1 標題2.2 段落2.3 表格2.4 圖片2.5 樣式 3. 讀取 1. 概述 Word 是一個十分常用的文字處理工具&#xff0c;通常我們都是手動來操作它&#xff0c;本節我們來看一下如何通過 Python 來操作。 Python 提供了 python-docx 庫&#xff0c;該庫就是為 Wo…

OpenLayers 入門指南【三】:API概要

目錄一、官方文檔二、核心類三、總結一、官方文檔 首頁右側有四個欄目分別是 Docs(文檔):也可以理解為使用指南&#xff0c;涵蓋一下四個模塊 Quick Start(快速入門)&#xff1a;介紹如何快速引入并使用OpenLayers快速構建一個地圖應用FAQ(問答)&#xff1a;介紹一些常見問題的…

JAVA面試寶典 -《Kafka 高吞吐量架構實戰:原理解析與性能優化全攻略》

&#x1f680; Kafka 高吞吐量架構實戰&#xff1a;原理解析與性能優化全攻略 隨著大數據技術在日志收集、埋點監控、訂單流處理等場景的普及&#xff0c;Kafka 已成為流處理架構中的核心組件。它之所以能在海量數據場景下保持高吞吐、低延遲&#xff0c;源于其在架構層面和底…

把sudo搞壞了怎么修復:報錯sudo: /etc/sudo.conf is owned by uid 1000, should be 0

今天部署 NFS 的時候一不小心給/etc目錄下所有的文件都所有者給改了&#xff0c;然后使用sudo的時候就出現了下面的問題&#xff1a; sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudoers i…

VUE前端項目開發1.0.1版本

項目包含用戶權限管理、表單提交、數據上傳下載、儀表盤可視化等功能&#xff0c;非常適合新手從零開始學習Vue3前端開發&#xff0c;下述包含所有開發源代碼&#xff0c;敬請食用 廢話少說先上圖: 登陸界面: 儀表盤管理系統: 用戶管理: 對于普通用戶只有儀表盤和個人信息界…

低代碼平臺能否完全取代傳統前端開發

低代碼平臺不能完全取代傳統前端開發&#xff0c;主要原因包括靈活性有限、性能優化能力不足、復雜定制需求難以實現。 低代碼平臺盡管能快速開發出相對標準化的應用&#xff0c;但在處理復雜、個性化的業務需求時&#xff0c;明顯表現出不足。尤其在需要精細化控制UI界面、高性…

Git 中如何比較不同版本之間的差異?常用命令有哪些?

回答重點1&#xff09; git diff <commit1> <commit2> &#xff1a;比較兩個指定的提交之間的差異。2&#xff09; git diff <branch1> <branch2> &#xff1a;比較兩個分支之間的差異。3&#xff09; git diff <path> &#xff1a;比較工作目錄…

MySQL 8.0 OCP 1Z0-908 題目解析(32)

題目125 Choose three. Identify three functions of MySQL Enterprise Monitor. □ A) Analyze query performance. □ B) Start a logical backup. □ C) Determine the availability of monitored MySQL servers. □ D) Centrally manage users. □ E) Start a MySQL Enterp…

Spring處理器和Bean的生命周期

Spring處理器和Bean的生命周期Spring處理器是對Bean對象的的開發可以對BeanDifinition進行操作&#xff0c;例如動態添加、修改BeanDefinition、動態修改Bean。&#xff0c;也可以在Bean對象創建后對Bean對象進行代理增強。注意&#xff1a;對于處理器要又一個正確的認知&#…

Spring Framework源碼解析——BeanFactory

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl1. BeanFactory 概述 BeanFactory 是 Spring IoC 容器的最基礎接口&#xff0c;它定義了獲取、配置和管理 Bean 的核心方法。它是 Spring 框架中容器體系的頂層接口之一&#…

C# 計算梯形面積和周長的程序(Program to calculate area and perimeter of Trapezium)

梯形是至少有一對邊平行&#xff0c;其他兩條邊可以不平行的四邊形。平行邊稱為梯形的底&#xff0c;其他兩條邊稱為梯形的腿。平行邊之間的垂直距離稱為梯形的高。公式 &#xff1a; 梯形面積&#xff1a; 0.5 * (a b) * h梯形周長&#xff1a; a b c d例子&#xff1a; 輸…

【計算機考研(408)- 數據結構】數組和特殊矩陣

數組和特殊矩陣 數組 數組的定義 數組是由n(n>1)個相同類型的數據元素構成的有限序列。每個數據元素稱為一個數組元素&#xff0c;每個元素在n個線性關系中的序號稱之為該元素的下標&#xff0c;下標的取值范圍稱為數組的維界。 數組是[[線性表]]的推廣&#xff0c;一維數組…

Agent架構與工作原理:理解智能體的核心機制

Agent架構與工作原理&#xff1a;深入理解智能體的核心機制 AI Agent的核心組成部分 一個完整的AI Agent通常由以下幾個核心模塊組成&#xff1a; 1. 規劃模塊&#xff08;Planning Module&#xff09; 規劃模塊是Agent的"大腦"&#xff0c;負責制定行動策略。它接收…

解決vscode中vue格式化后縮進太小的問題,并去除分號 - 設置Vetur tabSize從2到4,設置prettier取消分號semi

效果圖 左邊原來的&#xff0c;右邊是設置后的效果 實現步驟 安裝插件 Vetur 安裝插件 prettier Vscode > 文件 > 首選項 > 設置 搜索vetur > 找到比較下面的“Vetur > Format > Options: Tab Size” > 設置縮進為4 在附近找到“Vetur > Format: De…

計算機發展史:電子管時代的輝煌與局限

在計算機的發展歷程中&#xff0c;電子管時代猶如一顆璀璨的流星&#xff0c;短暫卻耀眼。它接過了機械計算裝置的接力棒&#xff0c;以電子管為核心元件&#xff0c;開啟了計算機的電子化征程&#xff0c;為后續的計算機發展奠定了堅實的基礎。這段從 20 世紀 40 年代到 50 年…

div和span區別

區別1區別2App.vue代碼 <template><div class"container"><h1>&#x1f3af; DIV 和 SPAN 標簽的區別演示</h1><!-- 第一部分&#xff1a;基本區別演示 --><section class"demo-section"><h2>&#x1f4e6; 1. …

channel_up和lane_up

一、channel_up 1.當aurora通道完成初始化&#xff0c;channel準備發送或者接收數據的時候拉高 2.channel_up屬于協議的鏈路層 3.當所有的通道的lane_up都成功拉高&#xff0c;并且完成通道綁定channel bonding,就拉高channel_up二、lane_up 1.lane初始化成功后拉高&#xff1b…

GDPR合規團隊協作軟件:保障企業數據安全的關鍵

隨著數據隱私問題日益成為全球關注的焦點&#xff0c;GDPR&#xff08;General Data Protection Regulation&#xff0c;通用數據保護條例&#xff09; 的實施成為企業在數據管理中的一項重要法律要求。特別是對于需要在團隊之間協作并共享信息的企業來說&#xff0c;選擇合規的…

【圖像質量評價指標】信噪比(Signal-to-Noise Ratio,SNR)

文章目錄一、基本定義二、判斷圖像信噪比是否過低&#xff08;經驗值&#xff0c;僅供參考&#xff09;三、SNR與圖像質量指標關系四、評估方法 代碼復現 —— 評估一張圖像的信噪比&#xff08;1&#xff09;有參考圖像&#xff08;推薦&#xff09;&#xff08;2&#xff09…