14 redis全量復制與部分復制

在這里插入圖片描述

1、設置主服務器的地址和端口

首先是在從服務器設置需要同步的主服務器信息,包括機器IP, 端口。
主從復制的開啟,完全是在從節點發起的。不需要我們在主節點做任何事情。
從節點開啟主從復制,有3種方式

  1. 配置文件:在從服務器的配置文件中加入:slaveof 主機ip 主機port
  2. 啟動命令: redis-server啟動命令后加入 --slaveof 主機ip 主機port
  3. 客戶端命令: redis服務啟動后,在客戶端執行slaveof IP port命令,此時該實例稱為從節點.
2、建立socket套接字連接

在從節點執行完slave命令后,向主節點發起socket連接。

3、發送ping命令

發送ping命令進行首次請求,目的是:檢查socket連接是否可用,以及主節點當前是否能夠處理請求。
發送ping后可能會出現以下三種情況:

  1. 響應pong: 說明socket連接正常,且主節點當前可以處理請求,復制過程可以繼續
  2. 超市,從節點未收到回復,則斷開連接然后重試
  3. 返回pong以外的響應,比如正在處理超時的腳本等,說明主節點當前無法進行復制的過程,從節點斷開連接并重試。
4、身份權限驗證
  1. 如果從節點中設置了masterauth選項,則從節點需要向主節點進行身份驗證;沒有設置該選項,則不需要驗證。
  2. 從節點進行身份驗證是通過向主節點發送auth命令進行的,auth命令的參數即為配置文件中的masterauth的值。
  3. 如果主節點設置密碼的狀態,與從節點masterauth的狀態一致(一致是指都存在,且密碼相同,或者都不存在),則身份驗證通過,復制過程繼續;如果不一致,則從節點斷開socket連接,并重連。
5、同步數據(pysnc)

同步就是將從節點的數據庫狀態更新成主節點當前的數據庫狀態。具體執行的方式是:從節點向主節點發送psync命令(Redis2.8以前是sync命令),開始同步。 數據同步階段是主從復制最核心的階段,根據主從節點當前狀態的不同,可以分為全量復制部分復制

6、命令持續復制

在數據同步之后,由于主節點不斷的接受到寫入命令,主從節點進入命令傳播階段,主節點將自己執行的寫命令發送給從節點,從節點接收命令并執行,從而保證主從節點數據的一致性。
注意:

  1. 命令傳播是異步的過程,即主節點發送寫命令后并不會等待從節點的回復;因此實際上主從節點之間很難保持實時的一致性,延遲在所難免。數據不一致的程度,與主從節點之間的網絡狀況、主節點寫命令的執行頻率、以及主節點中的repl-disable-tcp-nodelay配置等有關。

主從持續復制階段,從服務器會利用心跳檢測機制定時的向主服務發送消息。

7、全量復制和部分復制
  1. 全量復制:用于初次復制或其他無法進行部分復制的情況,將主節點中的所有數據都發送給從節點,是一個非常重型的操作。
  2. 部分復制:用于網絡中斷等情況后的復制,只將中斷期間主節點執行的寫命令發送給從節點,與全量復制相比更加高效。需要注意的是,如果網絡中斷時間過長,導致主節點沒有能夠完整地保存中斷期間執行的寫命令,則無法進行部分復制,仍使用全量復制。

全量復制的過程:

1.從節點判斷無法進行部分復制,向主節點發送全量復制的請求;或從節點發送部分復制的請求,但主節點判斷無法進行部分復制;
2.主節點收到全量復制的命令后,執行bgsave,在后臺生成RDB文件,并使用一個緩沖區(稱為復制緩沖區)記錄從現在開始執行的所有寫命令。
3.主節點的bgsave執行完成后,將RDB文件發送給從節點;從節點首先清除自己的舊數據,然后載入接收的RDB文件,將數據庫狀態更新至主節點執行bgsave時的數據庫狀態。
4.主節點將緩沖區中的所有寫命令發送給從節點,從節點執行這些寫命令,將數據庫狀態更新至主節點的最新狀態。
5.如果從節點開啟了AOF,則會觸發bgrewriteaof的執行,從而保證AOF文件更新至主節點的最新狀態。

全量復制流程圖:
在這里插入圖片描述
通過全量復制的過程可以看出,全量復制是非常重型的操作:

1.主節點通過bgsave命令fork子進程進行RDB持久化,該過程是非常消耗CPU、內存(頁表復制)、硬盤IO的;
2.主節點通過網絡將RDB文件發送給從節點,對主從節點的帶寬都會帶來很大的消耗。
3.從節點清空老數據、載入新RDB文件的過程是阻塞的,無法響應客戶端的命令;如果從節點執行bgrewriteaof,也會帶來額外的消耗。

部分復制
由于全量復制在主節點數據量較大時效率太低,因此提供部分復制的方式。

部分復制依賴于三個重要的概念:

1.復制偏移量
2.復制積壓緩沖區
3.服務器運行ID(runid)

復制偏移量:
執行復制的雙方,主從節點,分別會維護一個復制偏移量offset: 主節點每次向從節點同步了N字節數據后,將修改自己的復制偏移量offset+N 從節點每次從主節點同步了N字節數據后,將修改自己的復制偏移量offset+N。
offset用于判斷主從節點的數據庫狀態是否一致: 如果二者offset相同,則一致; 如果offset不同,則不一致,此時可以根據兩個offset找出從節點缺少的那部分數據。

復制積壓緩沖區:
主節點內部維護了一個固定長度的、先進先出(FIFO)隊列 作為復制積壓緩沖區,其默認大小為1MB 在主節點進行命令傳播時,不僅會將寫命令同步到從節點,還會將寫命令寫入復制積壓緩沖區。

由于復制積壓緩沖區定長且是先進先出,所以它保存的是主節點最近執行的寫命令;
當主從節點offset的差距過大超過緩沖區長度時,將無法執行部分復制,只能執行全量復制。
為了提高網絡中斷時部分復制執行的概率,可以根據需要增大復制積壓緩沖區的大小(通過配置repl-backlog-size);例如如果網絡中斷的平均時間是60s,而主節點平均每秒產生的寫命令(特定協議格式)所占的字節數為100KB,則復制積壓緩沖區的平均需求為6MB,保險起見,可以設置為12MB,來保證絕大多數斷線情況都可以使用部分復制。

從節點將offset發送給主節點后,主節點根據offset和緩沖區大小決定能否執行部分復制:
如果offset偏移量之后的數據,仍然都在復制積壓緩沖區里,則執行部分復制
如果offset偏移量之后的數據已不在復制積壓緩沖區中(數據已被擠出),則執行全量復制

服務器運行ID(runid):

1.每個Redis節點,都有其運行ID2.運行ID由節點在啟動時自動生成。
3.主節點會將自己的運行ID發送給從節點,從節點會將主節點的運行ID存起來。
1.如果從節點保存的runid與主節點現在的runid相同,說明主從節點之前同步過,主節點會繼續嘗試使用部分復制(到底能不能部分復制還要看offset和復制積壓緩沖區的情況)2.如果從節點保存的runid與主節點現在的runid不同,說明從節點在斷線前同步的Redis節點并不是當前的主節點,只能進行全量復制。

psync命令的大體流程

在這里插入圖片描述

1.如果從節點之前沒有復制過任何主節點,或者之前執行過slaveof no one命令,從節點就會向主節點發送psync命令,請求主節點進行數據的全量同步
2.如果前面從節點已經同步過部分數據,此時從節點就會發送psync {runid} {offset}命令給主節點,其中runid是上一次主節點的運行ID,offset是當前從節點的復制偏移量。

主節點收到psync命令后,會出現以下三種可能:

1.主節點返回 fullresync {runid} {offset}回復,表示主節點要求與從節點進行數據的完整全量復制,其中runid表示主節點的運行ID,offset表示當前主節點的復制偏移量
2.如果主服務器返回 +continue,表示主節點與從節點會進行部分數據的同步操作,將從服務器缺失的數據復制過來即可。
3.如果主服務器返回 -err,表示主服務器的Redis版本低于2.8,無法識別psync命令,此時從服務器會向主服務器發送sync命令,進行完整的數據全量復制

心跳檢測機制的作用

1.檢查主從服務器的網絡連接狀態		//主節點信息中可以看到所屬的從節點的連接信息state 表示從節點狀態offset 表示復制偏移量lag 表示延遲值(幾秒之前有過心跳檢測機制)
2.輔助實現min-slaves選項//如果將兩個參數的注釋取消,那么如果從服務器的數量少于3個,或者三個從服務器的延遲(lag)大于等于10秒時,主服務器都會拒絕執行寫命令min-slaves-to-write 3	//min-slaves-to-write 3min-slaves-max-lag 10 //延遲值
3.檢測命令丟失 //在從服務器的連接信息中可以看到復制偏移量,如果此時主服務器的復制偏移量與從服務器的復制偏移量不一致時,主服務器會補發缺失的數據。

在這里插入圖片描述

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

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

相關文章

【神印王座】龍皓晨美妝勝過月夜,魔神皇識破無視,撮合月夜阿寶

Hello,小伙伴們,我是拾荒君。 《神印王座》國漫第82集已更新,拾荒君和大多數人一樣,更新就去看了。魔神皇楓秀,威嚴凜然,突然空降月魔宮,整個宮殿都在這股無與倫比的強大氣息中顫栗。為了順利躲避魔神皇的…

稻谷飄香金融助力——建行江門市分行助力鄉村振興

7月的臺山,稻谷飄香。在大耕戶李勝業的農田里,金燦燦的稻谷翻起層層稻浪,收割機在稻浪里來回穿梭,割稻、脫粒、裝車等工序一氣呵成。空氣中彌漫著豐收的喜悅。 夏糧迎豐收的背后,是中國建設銀行江門市分行&#xff08…

遠端WWW服務支持TRACE請求

安全掃描的時候,掃出來的問題,這里不分享如何處理,就只分享下,如何找到有問題的端口。 通過命令 curl -v -X TRACE -I ip:port,這里的ip和端口就是掃描出有問題的服務器地址ip以及開放的服務端口。 觀察返回值&#x…

Python基礎:生成器(Generators)和生成器表達式(Generator Expressions)詳解

生成器(Generators)和 生成器表達式(Generator Expressions)是 Python 中用于處理迭代器和序列數據的強大工具。它們允許你按需生成值,而不是一次性生成所有值,從而節省內存和提高性能。 1. 生成器&#x…

深度強化學習筆記與無線通信應用案例

這里寫自定義目錄標題 參考資料比較和分類基礎知識16.3 有模型學習16.3.1 策略評估遞歸形式:Bellman 等式 16.3.2 策略改進16.3.3 策略迭代16.3.3 值迭代 16.4 免模型學習on-policy off-policy16.4.1 蒙特卡羅強化學習16.4.2 時序差分學習Sarsa算法:同策…

睡前隨筆記錄

一個人從出生到長大,就像一部手機從新用到舊。手機里面積累了太多的緩存,積累了太多的照片,各種app的數據,安裝了各式各樣的程序。 所以大概這就是年紀越大,記性越差的原因嗎?就像一個屋子,堆滿…

TableStructureRec: 表格結構識別推理庫來了

目錄 引言lineless_table_rec: 無線表格識別庫安裝使用結果 wired_table_rec:有線表格識別庫安裝使用結果 寫在最后 引言 TableStructureRec 倉庫是用來對文檔中表格做結構化識別的推理庫,包括來自 PaddleOCR 的表格結構識別算法模型、來自阿里讀光有線…

新版Testwell CTC++代碼覆蓋率測試工具帶來哪些新變化?

代碼覆蓋率測試工具Testwell CTC在版本10中引入了新的工具ctcreport來直接從符號和數據文件生成HTML報告。詳細的特性描述可以在測試井CTC幫助中找到。在本文檔中,描述了與前一代報告相比的改進和變化。 Adaptable Layout可調整布局 您可以選擇一個適合于項目結構的…

scanf的返回值

總所周知,scanf是C提供的庫函數的內容,而絕大多數定義的函數都會有一個返回值。 那么scanf的返回值是什么呢? 查了CPP的解釋后,返回值就是返回的是scanf讀取的數據的個數。 這個概念可能比較抽象。先看如下示例: 我們…

QT QJsonObject 插入 QByteArray十六進制數據

場景描述 有一組十六進制數使用QByteArray進行存儲;需要將其插入QJsonObject,然后通過網絡發送出去;接收到后,再轉換回QByteArray; 操作代碼 1. QByteArray轉換QString插入QJsonObject QString str ""; …

io500 壓測

目的 編譯環境 centos 7.9安裝包 yum groupinstall Development\ Tools yum install -y libevent-devel hwloc-devel libcephfs-devel.x86_64 編譯 open mpi 下載地址 https://www.open-mpi.org/software/ompi/v5.0/編譯 rpmbuild --rebuild openmpi-4.1.6-1.src.rpm安裝…

Leetcode 155. 最小棧

class MinStack {//用一個輔助棧存儲對應棧元素為棧頂時的最小值//當原棧插入一個元素時&#xff0c;輔助棧插入此值與當前輔助棧棧頂的值&#xff08;即插入前的最小值&#xff09;的較小值Stack<Integer> sta1;Stack<Integer> sta2;public MinStack() {sta1 new…

Redis(哨兵模式)

哨兵模式的定義&#xff1a; 是Redis的一種高可用解決方案&#xff0c;通過運行多個Redis實例來監控主從Redis實例的狀態&#xff0c;當主實例出現故障時&#xff0c;哨兵會自動選舉一個從實例作為新的主實例&#xff0c;從而保證系統的高可用性。哨兵模式可以監控多個主從Red…

2023亞太杯數學建模競賽C題詳細代碼解析建模

C題&#xff1a;The Development Trend of New Energy Electric Vehicles in China中國談新能源電動汽車的發展趨勢 第一問部分&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.prep…

Axios 通過a標簽下載文件 跨域下載

<!-- a標簽占位 --><a ref"down" ></a>getTest() {this.$axios.request({url: https://cnv13.55.la/download?file_key3695fa9461a0ae59cf3148581e4fe339&handle_typeexcel2pdf,method: get,responseType: blob, // 切記類型 blob}).then(re…

RC4密碼(python實現)

def RC4_INIT(key):keylist(key)for i in range(len(key)):key[i]ord(key[i]) #需要將key中的每個字符轉換為整數進行異或k[0 for i in range(256)]s[0 for i in range(256)]j0lengthlen(key)for i in range(256):s[i]ik[i]key[i%length] #如果key為123&#xff0c;則實際填充…

實現二叉搜索樹的查找、插入和刪除功能(思路+圖文+代碼詳解)

文章目錄 二叉搜索樹一、搜索樹1.二叉搜索樹的查找2.二叉搜索樹的插入3.二叉搜索樹的刪除4.性能分析 二叉搜索樹 HashMap和HashSet的底層是一個哈希表 TreeMap 和TreeSet底層是一棵搜索樹&#xff08;紅黑樹&#xff09; 涉及到一些搜索查找的場景可以調用Map和Set接口 一、…

Action!錄屏工具免費完整版,錄屏軟件,打開即可解鎖最新完整可用版本,支持GPU加速HDR視頻錄制和播放

一、軟件簡介 本次帶來的錄屏工具已升級為【完整版本】&#xff0c;所有功能全部可用。該錄屏工具支持GPU硬件加速&#xff0c;可以智能識別主流硬件設備&#xff0c;支持通過GPU進行HDR視頻錄制和播放進行。視頻錄制幀率最高支持360FPS&#xff0c;直播視頻幀率最高支持60FPS…

Java反射機制

我是南城余&#xff01;阿里云開發者平臺專家博士證書獲得者&#xff01; 歡迎關注我的博客&#xff01;一同成長&#xff01; 一名從事運維開發的worker&#xff0c;記錄分享學習。 專注于AI&#xff0c;運維開發&#xff0c;windows Linux 系統領域的分享&#xff01; 本…

RK3399平臺開發系列講解(內核入門篇)ConfigFS 的核心數據結構

??返回專欄總目錄 文章目錄 一、關鍵數據結構二、config_item 的結構體三、屬性和方法沉淀、分享、成長,讓自己和他人都能有所收獲!?? ??虛擬文件系統 ConfigFS 是一個特殊的文件系統,旨在提供一種動態配置 Linux 內核和設備的機制。 一、關鍵數據結構 ConfigFS 的核…