主頁 >  其他 > Redis資料同步:主從庫實作資料一致

Redis資料同步:主從庫實作資料一致

2021-04-13 10:46:36 其他

Redis資料同步:主從庫實作資料一致

Redis實體宕機了怎么辦

我們知道通過AOF和RDB,如果Redis發生了宕機,它們可以分別通過回放日志和重新讀入 RDB檔案的方式恢復資料,從而保證盡量少丟失資料,提升可靠性,

不過,即使用了這兩種方法,也依然存在服務不可用的問題,比如說,我們在實際使時只運行了以個 Redis實體,那么,如果這個實體宕機了,它在恢復期間,是無法服務新來的資料存取請求的,

那我們總說的Redis具有高可靠性,又是什么意思呢?其實,這里有兩層含義:

  • 1.資料盡量少丟失

  • 2.服務盡量少中斷,

AOF和RDB保證了前者,?對于后者,Redis的做法就是增加副本冗余量 ,將一份資料同時保存在多個實體上,即使有一個實體出現了故障,需要過一段時間才能恢復,其他實體也可以對外提供服務,不會影響業務使用,

多實體保存同一份資料,但是,我們必須要考慮一個問題:這么多副本,它們之間的資料如何保持一致呢?資料讀寫操作可以發給所有的實體嗎?

實際上,Redis提供了主從庫模式,以保證資料副本的一致,主從庫之間采用的是讀寫分離的方式,

  • 讀操作:主庫、從庫都可以接受

  • 寫操作:首先到主庫執行,然后,主庫將寫操作同步給從庫

為什么要采用讀寫分離的方式?

設想一下,在一個一主多從的Redis 系統中,不管是主庫還是從庫,都能接收客戶端的寫操作,那么,一個直接的問題就是:如果客戶端對同一個資料(例如k1)前后修改了三次,每一次的修改請求都發送到不同的實體上,在不同的實體上執行,那么這個資料在這三個實體上的副本就不一致的了(分別是v1、v2和v3),在讀取這個資料的時候,就可能讀取到舊的值,

如果我們非要保持這個資料在三個實體上一致,就要涉及到加鎖、實體間協商是否完成修改等一系列操作,但這會帶來巨額的開銷,當然是不太能接受的,

而主從庫模式一旦采用了讀寫分離,所有資料的修改只會在主庫上進行,不用協調三個實體,主庫有了最新的資料后,會同步給從庫,這樣,主從庫的資料就是一致的,

那么,主從庫同步是如何完成的呢?主庫資料是一次性傳給從庫,還是分批同步?要是主從庫間的網路斷連了,資料還能保持一致嗎?本文就來討論一下主從庫同步的原理,以及應對網路斷連風險的方案,

我們先來看看主從庫間的第一次同步是如何進行的,這也是Redis實體建立主從庫模式后的規定動作,

主從庫間如何進行第一次同步?

當我們啟動多個Redis實體的時候,它們相互之間就可以通過replicaof(Redis 5.0之前使用slaveof)命令形成主庫和從庫的關系,之后會按照三個階段完成資料的第一次同步,

例如,現在有實體1(ip:172.16.19.3)和實體2(ip:172.16.19.5),我們在實體2上執行以下這個命令后,實體2就變成了實體1的從庫,并從實體1上復制資料:

replicaof 172.16.19.3 6379

在這里插入圖片描述

  • 第一階段:主從庫間建立連接、協商同步的程序,主要是為全量復制做準備,在這一步,從庫和主庫建立起連接,并告訴主庫即將進行同步,主庫確認回復后,主從庫間就可以開始同步了

    • 具體來說,從庫給主庫發送 psync 命令,表示要進行資料同步,主庫根據這個命令的引數來啟動復制, psync 命令包含了主庫的runID和復制進度 offset 兩個引數,
    • runID : 每個Redis實體啟動時都會?動?成的?個隨機ID,?來唯?標記這個實體,當從庫和主庫第? 次復制時,因為不知道主庫的runID,所以將runID設為“?”,
    • offset: 此時設為-1,表?第?次復制,
  • 主庫收到psync命令后,會?FULLRESYNC回應命令帶上兩個引數:主庫runID和主庫?前的復制進度 offset,回傳給從庫,從庫收到回應后,會記錄下這兩個引數

  • 這里有個地方需要注意,FULLRESYNC回應表示第一次復制采用的全量復制,也就是說,主庫會把當前所有的資料都復制給從庫,

  • 第二階段:主庫將所有資料同步給從庫,從庫收到資料后,在本地完成資料加載,這個程序依賴于記憶體快照生成的RDB檔案,

    • 具體來說,主庫執行 bgsave 命令,生成RDB檔案,接著將檔案發給從庫,從庫接收到RDB檔案后,會先清空當前資料庫,然后加載RDB檔案,這是因為從庫在通過replicaof命令開始和主庫同步前,可能保存了其他資料,為了避免之前資料的影響,從庫需要先把當前資料庫清空,

    • 在主庫將資料同步給從庫的程序中,主庫不會被阻塞,仍然可以正常接收請求,否則,Redis的服務就被中斷了,但是,這些請求中的寫操作并沒有記錄到剛剛生成的RDB檔案中,為了保證主從庫的資料一致性,主庫會在記憶體中用專門的replication buffer,記錄RDB檔案生成后收到的所有寫操作,

  • 第三階段:主庫會把第一階段執行程序中新收到的寫命令,再發送給從庫,具體的操作是,當主庫完成RDB檔案發送后,就會把此時 replication buffer 中的修改操作發給從庫,從庫再重新執行這些操作,這樣一來,主從庫就實作同步了,

主從級聯模式分擔全量復制時的主庫壓力

通過分析主從庫間第一次資料同步的程序可以看到,一次全量復制中,對于主庫來說,需要完成兩個耗時的操作:生成RDB檔案和傳輸RDB檔案

如果從庫數量很多,而且都要和主庫進行全量復制的話,就會導致主庫忙于fork行程生成RDB檔案,進行資料全量同步,fork這個操作會阻塞主執行緒處理正常請求,從而導致主庫回應應用程式的請求速度變慢,此外,傳輸RDB檔案也會占用主庫的網路帶寬,同樣會給主庫的資源使用帶來壓力,那么,有沒有好的解決方法可以分擔主庫壓力呢?

主-從-從 級聯模式:在剛才介紹的主從庫模式中,所有的從庫都是和主庫連接,所有的全量復制也都是和主庫進行的,現在,我們可以通過“主-從-從”模式將主庫生成RDB和傳輸RDB的壓力,以級聯的方式分散到從庫上,

  • 簡單來說,我們在部署主從集群的時候,可以手動選擇一個從庫(比如選擇記憶體資源配置較高的從庫),用于級聯其他的從庫,然后,我們可以再選擇一些從庫(例如三分之一的從庫),在這些從庫上執行如下命令,讓它們和剛才所選的從庫,建立起主從關系,
replicaof 所選從庫的IP 6379

這樣這些從庫就會知道,在進行同步時,不會再和主庫進行互動了,只要和級聯的從庫進行寫操作同步就行了,這就可以減輕主庫上的壓力,如下圖所示:

在這里插入圖片描述

從此一旦主從庫完成了全量復制,它們之間就會維護一個網路連接,主庫會通過這個連接將后續陸續收到的命令操作再同步給從庫,這個程序也稱為基于長連接的命令傳播,可以避免頻繁建立連接的開銷,

但是這個程序中存在著風險點,最常見的就是網路斷連或阻塞,如果網路斷連,主從庫之間就無法進行命令傳播了,從庫的資料自然也就沒辦法和主庫保持一致了,客戶端就可能從從庫讀到舊資料,

主從庫間網路斷連怎么辦?

從Redis 2.8開始,網路斷了之后,主從庫會采用增量復制的方式繼續同步,即只會把主從庫網路斷連期間主庫收到的命令,同步給從庫,

增量復制時,主從庫之間如何保持同步?

  • 增量復制的重點在 repl_backlog_buffer這個緩沖區,當主從庫斷連后,主庫會把斷連期間收到的寫操作命令,寫入 replication buffer,同時也會把這些操作命令寫入 repl_backlog_buffer 這個緩沖區,

  • repl_backlog_buffer 是一個環形緩沖區,主庫會記錄自己寫到的位置,從庫則會記錄自己已經讀到的位置

  • 剛開始的時候,主庫和從庫的寫讀位置在一起,這算是它們的起始位置,隨著主庫不斷接收新的寫操作,它在緩沖區中的寫位置會逐步偏離起始位置,我們通常用偏移量來衡量這個偏移距離的大小,對主庫來說,對應的偏移量就是 master_repl_offset,主庫接收的新寫操作越多,這個值就會越大,

  • 同樣,從庫在復制完寫操作命令后,它在緩沖區中的讀位置也開始逐步偏移剛才的起始位置,此時,從庫已復制的偏移量 slave_repl_offset 也在不斷增加,正常情況下,這兩個偏移量基本相等

主從庫連接恢復后:

  • 主從庫的連接恢復之后,從庫首先會給主庫發送 psync 命令,并把自己當前的 slave_repl_offset 發給主庫,主庫會判斷從庫的master_repl_offsetslave_repl_offset 之間的差距,

  • 在網路斷連階段,主庫可能會收到新的寫操作命令,所以,一般來說,master_repl_offset 會大于 slave_repl_offset,此時,主庫只用把master_repl_offsetslave_repl_offset 之間的命令操作同步給從庫就行,

當然這里需要注意的是,因為 repl_backlog_buffer 是一個環形緩沖區,所以在緩沖區寫滿后,主庫會繼續寫入,此時,就會覆寫掉之前寫入的操作,如果從庫的讀取速度比較慢,就有可能導致從庫還未讀取的操作被主庫新寫的操作覆寫了,這會導致主從庫間的資料不一致,

從庫還未讀取的操作被主庫新寫的操作覆寫?
要想辦法避免這一情況,一般而言,我們可以調整 repl_backlog_size 這個引數,這個引數和所需的緩沖空間大小有關,緩沖空間的計算公式是:緩沖空間大小 = 主庫寫入命令速度 * 操作大小 - 主從庫間網路傳輸命令速度 * 操作大小,在實際應用中,考慮到可能存在一些突發的請求壓力,我們通常需要把這個緩沖空間擴大一倍,即 repl_backlog_size = 緩沖空間大小 * 2,這也就是 repl_backlog_size的最終值,

示例:如果主庫每秒寫入2000個操作,每個操作的大小為2KB,網路每秒能傳輸1000個操作,那么,有1000個操作需要緩沖起來,這就至少需要2MB的緩沖空間,否則,新寫的命令就會覆寫掉舊操作了,為了應對可能的突發壓力,我們最終把 repl_backlog_size 設為4MB,

這樣一來,增量復制時主從庫的資料不一致風險就降低了,不過,如果并發請求量非常大,連兩倍的緩沖空間都存不下新操作請求的話,此時,主從庫資料仍然可能不一致, 針對這種情況,一方面,你可以根據Redis所在服務器的記憶體資源再適當增加 repl_backlog_size值,比如設定成緩沖空間大小的4倍,另一方面,你可以考慮使用切片集群來分擔單個主庫的請求壓力,

小結

Redis的主從庫同步的基本原理,三種模式:全量復制、基于長連接的命令傳播,以及增量復制,

  • 全量復制雖然耗時,但是對于從庫來說,如果是第一次同步,全量復制是無法避免的,

    • 所以建議:一個Redis實體的資料庫不要太大,一個實體大小在幾GB比較合適,這樣可以減少RDB檔案生成、傳輸和重新加載的開銷,另外,為了避免多個從庫同時和主庫進行全量復制,給主庫過大的同步壓力, 我們也可以采用“主-從-從”級聯模式,來緩解主庫的壓力
  • 長連接復制是主從庫正常運行后的常規同步階段,在這個階段中,主從庫之間通過命令傳播實作同步,不過,這期間如果遇到了網路斷連,就需要使用增量復制,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275433.html

標籤:其他

上一篇:CSDN【精品專欄】第14期

下一篇:Centos7安裝Redis

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more