欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Redis的主從同步原理

 更新時(shí)間:2023年07月26日 11:27:58   作者:半夏之沫  
Redis為了保證服務(wù)高可用,其中一種實(shí)現(xiàn)就是主從模式,本篇文章將對(duì)主從模式中為了保證主節(jié)點(diǎn)和從節(jié)點(diǎn)數(shù)據(jù)一致而實(shí)現(xiàn)的主從同步機(jī)制進(jìn)行學(xué)習(xí),感興趣的同學(xué)可以參考閱讀下

正文

一. 主從數(shù)據(jù)同步概述

Redis主從模式中,一個(gè)高可用的Redis服務(wù)由一個(gè)Redis主節(jié)點(diǎn)(Master,后續(xù)簡(jiǎn)稱為主節(jié)點(diǎn))和若干Redis從節(jié)點(diǎn)(Slave,后續(xù)簡(jiǎn)稱為從節(jié)點(diǎn))組成。

Redis中采用讀寫分離來保證主節(jié)點(diǎn)和從節(jié)點(diǎn)之間的數(shù)據(jù)一致性,具體實(shí)現(xiàn)如下。

  • 主節(jié)點(diǎn)支持數(shù)據(jù)寫入數(shù)據(jù)讀取,從節(jié)點(diǎn)只支持數(shù)據(jù)讀取;
  • 主節(jié)點(diǎn)會(huì)與從節(jié)點(diǎn)之間執(zhí)行主從數(shù)據(jù)同步,以保證主節(jié)點(diǎn)數(shù)據(jù)與從節(jié)點(diǎn)數(shù)據(jù)一致。

主從數(shù)據(jù)同步分為如下幾種情況。

  • 從節(jié)點(diǎn)與主節(jié)點(diǎn)建立連接時(shí)進(jìn)行全量同步;
  • 主節(jié)點(diǎn)與從節(jié)點(diǎn)正常運(yùn)行時(shí)的同步;
  • 主節(jié)點(diǎn)與從節(jié)點(diǎn)連接斷開后又重連時(shí)會(huì)進(jìn)行增量同步或全量同步。

本篇文章將對(duì)Redis中的主從數(shù)據(jù)同步的幾種情況進(jìn)行學(xué)習(xí)。

二. 從節(jié)點(diǎn)與主節(jié)點(diǎn)建立連接時(shí)的全量同步

從節(jié)點(diǎn)與主節(jié)點(diǎn)建立連接時(shí)的全量同步可以用下圖進(jìn)行示意。

對(duì)于上圖所示步驟,說明如下。

  • 從節(jié)點(diǎn)通過配置文件中的replicaof {masterip} {port} 獲得主節(jié)點(diǎn)ipport,然后向主節(jié)點(diǎn)發(fā)送psync {repID} {offset} 指令,其中repID表示主節(jié)點(diǎn)唯一標(biāo)識(shí),offset為復(fù)制偏移量,因?yàn)楫?dāng)前從節(jié)點(diǎn)與主節(jié)點(diǎn)尚未連接,且尚未開始復(fù)制,所以repID?offset為-1;
  • 主節(jié)點(diǎn)收到psync {repID} {offset} 指令后,會(huì)響應(yīng)從節(jié)點(diǎn)并發(fā)送fullresync {repID} {offset} 指令,從節(jié)點(diǎn)會(huì)將主節(jié)點(diǎn)的repIDoffset保存下來;
  • 主節(jié)點(diǎn)收到psync {repID} {offset} 指令后,會(huì)執(zhí)行bgsave異步的生成RDB文件,然后主節(jié)點(diǎn)將RDB文件發(fā)送給從節(jié)點(diǎn),從節(jié)點(diǎn)接收到RDB文件后,會(huì)清空內(nèi)存數(shù)據(jù),然后加載RDB文件的數(shù)據(jù)到內(nèi)存中;
  • 由于主節(jié)點(diǎn)生成RDB文件時(shí)是異步生成的,此時(shí)主節(jié)點(diǎn)是非阻塞的,可以繼續(xù)處理業(yè)務(wù),所以在生成RDB文件期間發(fā)送RDB文件期間從節(jié)點(diǎn)加載RDB文件期間主節(jié)點(diǎn)執(zhí)行的寫指令均會(huì)存放到緩沖區(qū)replication_buffer中,所以當(dāng)從節(jié)點(diǎn)加載完RDB文件后,主節(jié)點(diǎn)會(huì)將replication_buffer中的內(nèi)容發(fā)送給從節(jié)點(diǎn),從節(jié)點(diǎn)會(huì)執(zhí)行replication_buffer中的指令,從而達(dá)到和主節(jié)點(diǎn)一致的狀態(tài)。

特別說明:在全量同步期間,主節(jié)點(diǎn)是非阻塞的,同時(shí)從節(jié)點(diǎn)很大程度上是非阻塞的,從節(jié)點(diǎn)的非阻塞表現(xiàn)在可以通過配置讓從節(jié)點(diǎn)在全量同步期間使用舊內(nèi)存數(shù)據(jù)來處理查詢指令,但是從節(jié)點(diǎn)在刪除舊內(nèi)存數(shù)據(jù)并加載RDB文件數(shù)據(jù)到內(nèi)存中這段時(shí)間里,從節(jié)點(diǎn)是阻塞的(4.0版本前,刪除舊數(shù)據(jù)和加載RDB文件都會(huì)阻塞從節(jié)點(diǎn),4.0版本開始,刪除舊數(shù)據(jù)可以通過配置變成不阻塞從節(jié)點(diǎn),但是加載RDB文件還是會(huì)阻塞從節(jié)點(diǎn))。

最后說明一個(gè)異常情況,那就是replication_buffer是有大小限制的,如果replication_buffer大小超過了限制,主節(jié)點(diǎn)會(huì)斷開與從節(jié)點(diǎn)的同步連接,此時(shí)replication_buffer的數(shù)據(jù)會(huì)被清空,然后會(huì)重新開始全量同步,所以replication_buffer大小需要設(shè)置一個(gè)合理值。

三. 主節(jié)點(diǎn)與從節(jié)點(diǎn)正常運(yùn)行時(shí)的同步

參見Redis replication | Redis中的一段話。

When a master and a replica instances are well-connected, the master keeps the replica updated by sending a stream of commands to the replica to replicate the effects on the dataset happening in the master side due to: client writes, keys expired or evicted, any other action changing the master dataset.

即正常運(yùn)行期間,主節(jié)點(diǎn)會(huì)向從節(jié)點(diǎn)發(fā)送寫指令流來同步主節(jié)點(diǎn)的數(shù)據(jù)變更到從節(jié)點(diǎn)。

四. 主節(jié)點(diǎn)與從節(jié)點(diǎn)斷開連接又重連時(shí)的增量同步

在第二節(jié)中提到了從節(jié)點(diǎn)在啟動(dòng)后并需要與主節(jié)點(diǎn)進(jìn)行全量同步時(shí),會(huì)向主節(jié)點(diǎn)發(fā)送psync {repID} {offset} 指令,這里先對(duì)repIDoffset進(jìn)行解釋。

repID

repIDReplication ID,是Redis節(jié)點(diǎn)作為主節(jié)點(diǎn)啟動(dòng)時(shí),或者從節(jié)點(diǎn)被晉升為主節(jié)點(diǎn)時(shí),該主節(jié)點(diǎn)都會(huì)生成一個(gè)新的repID(思考一下什么情況還會(huì)有舊的repID),后續(xù)連接到該主節(jié)點(diǎn)的從節(jié)點(diǎn)在第一次全量同步的建立連接階段會(huì)保存一份主節(jié)點(diǎn)的repID,所以具有相同repID的節(jié)點(diǎn)的數(shù)據(jù)具有相關(guān)性。

offset

offset即偏移量,可以理解為當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)的邏輯時(shí)間。舉個(gè)例子,某個(gè)節(jié)點(diǎn)Aoffset為500,和節(jié)點(diǎn)A具有相同repID的節(jié)點(diǎn)Boffset為520,那么表明節(jié)點(diǎn)B的數(shù)據(jù)比節(jié)點(diǎn)A的數(shù)據(jù)更新,節(jié)點(diǎn)A需要再執(zhí)行一些寫指令才能夠讓節(jié)點(diǎn)A的數(shù)據(jù)狀態(tài)和節(jié)點(diǎn)B一致。

有了上述兩點(diǎn)認(rèn)識(shí),現(xiàn)在思考一個(gè)問題:主節(jié)點(diǎn)和從節(jié)點(diǎn)如果因?yàn)槟承┰颍瑪嚅_了連接,而斷開連接這段時(shí)間里主節(jié)點(diǎn)又處理了一些寫指令,那么從節(jié)點(diǎn)重新連接后,應(yīng)該怎么將斷開連接那段時(shí)間里的寫指令同步給重連的從節(jié)點(diǎn)?通常的想法就是再執(zhí)行一次全量同步,在2.8之前的版本,確實(shí)是這么實(shí)現(xiàn)的,但從2.8版本開始,引入了增量同步,具體的實(shí)現(xiàn)如下。

  • 主節(jié)點(diǎn)維護(hù)著一份repl_backlog_buffer緩沖區(qū)域,叫做復(fù)制積壓緩沖區(qū),主節(jié)點(diǎn)在任何時(shí)候執(zhí)行寫指令時(shí),都會(huì)將寫指令記錄在repl_backlog_buffer中,repl_backlog_buffer是一個(gè)環(huán)形數(shù)組,所以當(dāng)數(shù)組滿時(shí),后續(xù)再添加的寫指令會(huì)覆蓋舊的寫指令,因此主節(jié)點(diǎn)還使用了一個(gè)叫做master_repl_offset的偏移量,來記錄主節(jié)點(diǎn)的存到repl_backlog_buffer中的最新寫指令的位置,master_repl_offset就是上面提到的offset,只不過在主節(jié)點(diǎn)中叫做master_repl_offset;
  • 從節(jié)點(diǎn)也有一個(gè)偏移量叫做slave_repl_offset,用來記錄從節(jié)點(diǎn)已經(jīng)從主節(jié)點(diǎn)的repl_backlog_buffer中同步到的最新寫指令的位置;
  • 主節(jié)點(diǎn)收到寫指令后,master_repl_offset增加,從節(jié)點(diǎn)從主節(jié)點(diǎn)的repl_backlog_buffer同步了寫指令后,slave_repl_offset增加;
  • 從節(jié)點(diǎn)斷開重連后,會(huì)向主節(jié)點(diǎn)發(fā)送psync {repID} {slave_repl_offset} 指令,此時(shí)slave_repl_offset通常會(huì)小于master_repl_offset,所以主節(jié)點(diǎn)僅需要將slave_repl_offsetmaster_repl_offset之間的寫指令同步給從節(jié)點(diǎn),這就是增量同步。

特別注意:如果repl_backlog_buffer中記錄的從節(jié)點(diǎn)斷開連接期間的寫指令已經(jīng)被后續(xù)的寫指令覆蓋,那么此時(shí)不能執(zhí)行增量同步,而是需要執(zhí)行全量同步,所以需要將repl_backlog_buffer的大小設(shè)置一個(gè)合理的值,來盡可能的保證不出現(xiàn)重連后需要全量同步的情況。

總結(jié)

以一張圖進(jìn)行總結(jié)。

以上就是一文詳解Redis的主從同步原理的詳細(xì)內(nèi)容,更多關(guān)于Redis主從同步的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解

    Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解

    本文主要介紹了Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解如何使用Redis實(shí)現(xiàn)分布式鎖

    詳解如何使用Redis實(shí)現(xiàn)分布式鎖

    Redis 作為一個(gè)獨(dú)立的三方系統(tǒng),其天生的優(yōu)勢(shì)就是可以作為一個(gè)分布式系統(tǒng)來使用,因此使用 Redis 實(shí)現(xiàn)的鎖都是分布式鎖,所以本文就給大家講講如何使用Redis實(shí)現(xiàn)分布式鎖,感興趣的小伙伴跟著小編來看看吧
    2023-08-08
  • Redis實(shí)現(xiàn)分布式事務(wù)的示例

    Redis實(shí)現(xiàn)分布式事務(wù)的示例

    Redis雖不支持傳統(tǒng)SQL數(shù)據(jù)庫(kù)ACID特性的事務(wù),但提供了事務(wù)特性,允許多命令捆綁執(zhí)行,通過命令MULTI、EXEC、DISCARD、WATCH實(shí)現(xiàn),感興趣的可以了解一下
    2024-10-10
  • Redis緩存-序列化對(duì)象存儲(chǔ)亂碼問題的解決

    Redis緩存-序列化對(duì)象存儲(chǔ)亂碼問題的解決

    這篇文章主要介紹了Redis緩存-序列化對(duì)象存儲(chǔ)亂碼問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Redisson分布式鎖之加解鎖詳解

    Redisson分布式鎖之加解鎖詳解

    這篇文章主要為大家介紹了Redisson分布式鎖加解鎖的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • redis key過期監(jiān)聽的實(shí)現(xiàn)示例

    redis key過期監(jiān)聽的實(shí)現(xiàn)示例

    在Redis中,我們可以為Key設(shè)置過期時(shí)間,當(dāng)Key的過期時(shí)間到達(dá)后,Redis會(huì)自動(dòng)將該Key標(biāo)記為已失效,本文就來介紹一下redis key過期監(jiān)聽的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-03-03
  • 控制Redis的hash的field中的過期時(shí)間

    控制Redis的hash的field中的過期時(shí)間

    這篇文章主要介紹了控制Redis的hash的field中的過期時(shí)間問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

    Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

    這篇文章主要介紹了Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值需要的朋友可以參考下
    2020-04-04
  • 詳解如何在Windows上配置和使用Redis持久化功能

    詳解如何在Windows上配置和使用Redis持久化功能

    Redis 是一個(gè)強(qiáng)大的內(nèi)存數(shù)據(jù)庫(kù),常用于緩存和實(shí)時(shí)數(shù)據(jù)處理,然而,由于其內(nèi)存特性,一旦服務(wù)器重啟或故障,存儲(chǔ)在 Redis 中的數(shù)據(jù)可能會(huì)丟失,為了確保數(shù)據(jù)的安全性和持久性,Redis 提供了多種持久化機(jī)制,本文將詳細(xì)介紹如何在 Windows 上配置和使用 Redis 的持久化功能
    2024-08-08
  • 將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫(kù)的使用方法

    將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫(kù)的使用方法

    這篇文章主要介紹了將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫(kù)的使用方法,原理其實(shí)只是將內(nèi)存虛擬作為磁盤,需要的朋友可以參考下
    2015-06-06

最新評(píng)論