最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

正文

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

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

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

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

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

  • 從節(jié)點與主節(jié)點建立連接時進行全量同步;
  • 主節(jié)點與從節(jié)點正常運行時的同步;
  • 主節(jié)點與從節(jié)點連接斷開后又重連時會進行增量同步或全量同步。

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

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

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

對于上圖所示步驟,說明如下。

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

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

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

三. 主節(jié)點與從節(jié)點正常運行時的同步

參見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.

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

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

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

repID

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

offset

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

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

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

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

總結(jié)

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

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

相關(guān)文章

  • redis?消息隊列完成秒殺過期訂單處理方法(一)

    redis?消息隊列完成秒殺過期訂單處理方法(一)

    這篇文章主要介紹了redis?消息隊列完成秒殺過期訂單處理方法,包括redis?消息通知處理代金券過期問題–失效問題的分析,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • RedisTemplate序列化設(shè)置的流程和具體步驟

    RedisTemplate序列化設(shè)置的流程和具體步驟

    在使用 Redis 作為緩存數(shù)據(jù)庫時,我們通常會使用 RedisTemplate 來簡化與 Redis 進行交互的操作,而其中一個重要的配置項就是序列化設(shè)置,它決定了數(shù)據(jù)在存儲到 Redis 中時的格式,本文將介紹如何進行 RedisTemplate 的序列化設(shè)置,以及一些常見的序列化方案
    2024-11-11
  • Redis內(nèi)存回收用法及說明

    Redis內(nèi)存回收用法及說明

    Redis通過配置文件設(shè)置最大內(nèi)存空間,當(dāng)達到上限時,會使用過期策略和淘汰策略來管理內(nèi)存,過期策略包括惰性刪除和周期刪除,而淘汰策略則根據(jù)內(nèi)存使用情況主動刪除部分key以釋放空間
    2025-12-12
  • Redis中BigKey與MoreKey優(yōu)化詳解

    Redis中BigKey與MoreKey優(yōu)化詳解

    這篇文章主要介紹了Redis中BigKey與MoreKey優(yōu)化,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Redis數(shù)據(jù)結(jié)構(gòu)ZipList,QuickList,SkipList使用及說明

    Redis數(shù)據(jù)結(jié)構(gòu)ZipList,QuickList,SkipList使用及說明

    文章介紹了ZipList數(shù)據(jù)結(jié)構(gòu)及其在Redis中的應(yīng)用,詳細解釋了其緊湊的內(nèi)存存儲方式和特點和應(yīng)用場景,同時探討了QuickList及其在Redis中的作用,以及不同數(shù)據(jù)類型的編碼方式和應(yīng)用場景
    2026-04-04
  • Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié)

    Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié)

    這篇文章主要介紹了Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié),本文分別對String 類型的一些方法和Hash 類型做了詳細介紹,需要的朋友可以參考下
    2015-06-06
  • ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式)

    ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式)

    這篇文章主要介紹了ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式),需要的朋友可以參考下
    2018-03-03
  • Redis分布式鎖與Redlock算法實現(xiàn)

    Redis分布式鎖與Redlock算法實現(xiàn)

    在Redis中,可以使用多種方式實現(xiàn)分布式鎖,如使用SETNX命令或RedLock算法,本文就來介紹一下Redis分布式鎖與Redlock算法實現(xiàn),感興趣的可以了解一下
    2023-12-12
  • redis?lua腳本解決高并發(fā)下秒殺場景

    redis?lua腳本解決高并發(fā)下秒殺場景

    這篇文章主要為大家介紹了redis?lua腳本解決高并發(fā)下秒殺場景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Redis基于Bitmap實現(xiàn)用戶簽到功能

    Redis基于Bitmap實現(xiàn)用戶簽到功能

    很多應(yīng)用上都有用戶簽到的功能,尤其是配合積分系統(tǒng)一起使用。本文主要介紹了Redis基于Bitmap實現(xiàn)用戶簽到功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論

木兰县| 宁夏| 游戏| 象州县| 兴仁县| 宁国市| 乐平市| 灵丘县| 郁南县| 荆门市| 莱州市| 区。| 翁源县| 固原市| 东乌珠穆沁旗| 道真| 河曲县| 黑龙江省| 若尔盖县| 太白县| 旌德县| 曲沃县| 诸暨市| 同江市| 大同县| 宁夏| 龙游县| 达拉特旗| 营山县| 平江县| 宁海县| 赤峰市| 高雄市| 长武县| 双牌县| 建昌县| 信阳市| 诸城市| 马关县| 黄浦区| 罗城|