0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Redis部分同步的實(shí)現(xiàn)

麥辣雞腿堡 ? 來(lái)源:七哥聊編程 ? 作者:七哥聊編程 ? 2023-10-09 15:15 ? 次閱讀
部分同步的實(shí)現(xiàn)

部分重同步功能由以下三個(gè)部分構(gòu)成:

  • 主服務(wù)器的 復(fù)制偏移量 (replication offset)和從服務(wù)器的復(fù)制偏移量;
  • 主服務(wù)器的復(fù)制積壓緩沖區(qū) (replication backlog);
  • 服務(wù)器的運(yùn)行ID (run ID)。
復(fù)制偏移量

執(zhí)行復(fù)制的雙方——主服務(wù)器和從服務(wù)器會(huì)分別維護(hù)一個(gè)復(fù)制偏移量:

  • 主服務(wù)器每次向從服務(wù)器傳播N個(gè)字節(jié)的數(shù)據(jù)時(shí),就將自己的復(fù)制偏移量的值加上N;
  • 從服務(wù)器每次收到主服務(wù)器傳播來(lái)的N個(gè)字節(jié)的數(shù)據(jù)時(shí),就將自己的復(fù)制偏移量的值加上N;

通過(guò)對(duì)比主從服務(wù)器的復(fù)制偏移量,程序可以很容易地知道主從服務(wù)器是否處于一致?tīng)顟B(tài):

  • 如果主從服務(wù)器處于一致?tīng)顟B(tài),那么主從服務(wù)器兩者的偏移量總是相同的;
  • 相反,如果主從服務(wù)器兩者的偏移量并不相同,那么說(shuō)明主從服務(wù)器并未處于一致?tīng)顟B(tài)。

如下面的情況:

圖片

假設(shè)從服務(wù)器A在斷線之后就立即重新連接主服務(wù)器,并且成功,那么接下來(lái), 從服務(wù)器將向主服務(wù)器發(fā)送PSYNC命令,報(bào)告從服務(wù)器A當(dāng)前的復(fù)制偏移量為10107 ,那么這時(shí),主服務(wù)器應(yīng)該對(duì)從服務(wù)器執(zhí)行完整重同步還是部分重同步呢?如果執(zhí)行部分重同步的話(huà),主服務(wù)器又如何補(bǔ)償從服務(wù)器A在斷線期間丟失的那部分?jǐn)?shù)據(jù)呢?以上問(wèn)題的答案都和復(fù)制積壓緩沖區(qū)有關(guān)。

復(fù)制積壓緩沖區(qū)

復(fù)制積壓緩沖區(qū)是由主服務(wù)器維護(hù)的一個(gè)固定長(zhǎng)度(fixed-size)先進(jìn)先出(FIFO)隊(duì)列,默認(rèn)大小為1MB。

和普通先進(jìn)先出隊(duì)列隨著元素的增加和減少而動(dòng)態(tài)調(diào)整長(zhǎng)度不同,固定長(zhǎng)度先進(jìn)先出隊(duì)列的長(zhǎng)度是固定的,當(dāng)入隊(duì)元素的數(shù)量大于隊(duì)列長(zhǎng)度時(shí),最先入隊(duì)的元素會(huì)被彈出,而新元素會(huì)被放入隊(duì)列。

當(dāng)主服務(wù)器進(jìn)行命令傳播時(shí),它不僅會(huì)將寫(xiě)命令發(fā)送給所有從服務(wù)器,還會(huì)將寫(xiě)命令入隊(duì)到復(fù)制積壓緩沖區(qū)里面,如圖所示。

圖片

因此,主服務(wù)器的復(fù)制積壓緩沖區(qū)里面會(huì)保存著一部分最近傳播的寫(xiě)命令,并且復(fù)制積壓緩沖區(qū)會(huì)為隊(duì)列中的每個(gè)字節(jié)記錄相應(yīng)的復(fù)制偏移量,就像下表所示的那樣:

圖片

當(dāng)從服務(wù)器重新連上主服務(wù)器時(shí),從服務(wù)器會(huì)通過(guò)PSYNC命令將自己的復(fù)制偏移量offset發(fā)送給主服務(wù)器,主服務(wù)器會(huì)根據(jù)這個(gè)復(fù)制偏移量來(lái)決定對(duì)從服務(wù)器執(zhí)行何種同步操作:

  • 如果offset偏移量之后的數(shù)據(jù)(也即是偏移量offset+1開(kāi)始的數(shù)據(jù))仍然存在于復(fù)制積壓緩沖區(qū)里面,那么主服務(wù)器將對(duì)從服務(wù)器執(zhí)行部分重同步操作;
  • 相反,如果offset偏移量之后的數(shù)據(jù)已經(jīng)不存在于復(fù)制積壓緩沖區(qū),那么主服務(wù)器將對(duì)從服務(wù)器執(zhí)行完整重同步操作。
根據(jù)需要調(diào)整復(fù)制積壓緩沖區(qū)的大小

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

復(fù)制積壓緩沖區(qū)的最小大小可以根據(jù)公式 second * write_size_per_second來(lái)估算:

  • 其中second為從服務(wù)器斷線后重新連接上主服務(wù)器所需的平均時(shí)間(以秒計(jì)算);
  • 而write_size_per_second則是主服務(wù)器平均每秒產(chǎn)生的寫(xiě)命令數(shù)據(jù)量(協(xié)議格式(RESP協(xié)議)的寫(xiě)命令的長(zhǎng)度總和);

例如,如果主服務(wù)器平均每秒產(chǎn)生 1MB 的寫(xiě)數(shù)據(jù),而從服務(wù)器斷線之后平均要5秒才能重新連接上主服務(wù)器,那么復(fù)制積壓緩沖區(qū)的大小就不能低于5MB。

為了安全起見(jiàn),可以將 復(fù)制積壓緩沖區(qū)的大小 = 2 * second * write_size_per_second,這樣可以保證絕大部分?jǐn)嗑€情況都能用部分同步來(lái)處理。

至于復(fù)制積壓緩沖區(qū)大小的修改方法,可以參考配置文件中關(guān)于 repl-backlog-size 選項(xiàng)的說(shuō)明。

服務(wù)器運(yùn)行ID

除了復(fù)制偏移量和復(fù)制積壓緩沖區(qū)之外,實(shí)現(xiàn)部分重同步還需要用到服務(wù)器運(yùn)行ID(run ID):

  • 每個(gè)Redis服務(wù)器,不論主服務(wù)器還是從服務(wù),都會(huì)有自己的運(yùn)行ID;
  • 運(yùn)行ID在服務(wù)器啟動(dòng)時(shí)自動(dòng)生成,由40個(gè)隨機(jī)的十六進(jìn)制字符組成,例如 53b9b28df8042fdc9ab5e3fcbbbabff1d5dce2b3;

當(dāng)從服務(wù)器對(duì)主服務(wù)器進(jìn)行初次復(fù)制時(shí),主服務(wù)器會(huì)將自己的運(yùn)行ID傳送給從服務(wù)器,而從服務(wù)器則會(huì)將這個(gè)運(yùn)行ID保存起來(lái)(注意哦,是從服務(wù)器保存了主服務(wù)器的ID)。

當(dāng)從服務(wù)器斷線并重新連上一個(gè)主服務(wù)器時(shí),從服務(wù)器將向當(dāng)前連接的主服務(wù)器發(fā)送之前保存的運(yùn)行ID:

  • 如果從服務(wù)器保存的運(yùn)行ID和當(dāng)前連接的主服務(wù)器的運(yùn)行ID相同,那么說(shuō)明從服務(wù)器斷線之前復(fù)制的就是當(dāng)前連接的這個(gè)主服務(wù)器,主服務(wù)器可以繼續(xù)嘗試執(zhí)行部分重同步操作;
  • 相反地,如果從服務(wù)器保存的運(yùn)行ID和當(dāng)前連接的主服務(wù)器的運(yùn)行ID并不相同,那么說(shuō)明從服務(wù)器斷線之前復(fù)制的主服務(wù)器并不是當(dāng)前連接的這個(gè)主服務(wù)器,主服務(wù)器將對(duì)從服務(wù)器執(zhí)行完整重同步操作。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7104

    瀏覽量

    89297
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9256

    瀏覽量

    85763
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3841

    瀏覽量

    64545
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    376

    瀏覽量

    10898
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Redis Stream應(yīng)用案例

    Contributor,設(shè)計(jì)并實(shí)現(xiàn)了阿里云Redis開(kāi)源項(xiàng)目ApsaraCache的部分核心feature,如時(shí)間點(diǎn)恢復(fù),binlog同步等。原文鏈接
    發(fā)表于 06-26 17:15

    Redis Cluster的基本原理及實(shí)現(xiàn)細(xì)節(jié)

    Redis Cluster的基本原理和架構(gòu) Redis Cluster是分布式Redis實(shí)現(xiàn)。隨著Redis版本的更替,以及各種已知bug
    發(fā)表于 09-28 19:09 ?0次下載
    <b class='flag-5'>Redis</b> Cluster的基本原理及<b class='flag-5'>實(shí)現(xiàn)</b>細(xì)節(jié)

    Redis基本類(lèi)型和底層實(shí)現(xiàn)

    簡(jiǎn)單介紹了Redis的五種對(duì)象類(lèi)型和它們的底層實(shí)現(xiàn)。事實(shí)上,Redis的高效性和靈活性正是得益于對(duì)于同一個(gè)對(duì)象類(lèi)型采取不同的底層結(jié)構(gòu),并在必要的時(shí)候?qū)Χ哌M(jìn)行轉(zhuǎn)換;以及各種底層結(jié)構(gòu)對(duì)內(nèi)存的合理利用。
    發(fā)表于 11-25 15:11 ?4490次閱讀
    <b class='flag-5'>Redis</b>基本類(lèi)型和底層<b class='flag-5'>實(shí)現(xiàn)</b>

    Redis為什么這么快!深入了解Redis的內(nèi)存模型!

    Redis是目前最火爆的內(nèi)存數(shù)據(jù)庫(kù)之一,通過(guò)在內(nèi)存中讀寫(xiě)數(shù)據(jù),大大提高了讀寫(xiě)速度,可以說(shuō)Redis實(shí)現(xiàn)網(wǎng)站高并發(fā)不可或缺的一部分。
    的頭像 發(fā)表于 05-02 16:57 ?4418次閱讀
    <b class='flag-5'>Redis</b>為什么這么快!深入了解<b class='flag-5'>Redis</b>的內(nèi)存模型!

    Springboot+redis操作多種實(shí)現(xiàn)

    一、Jedis,Redisson,Lettuce三者的區(qū)別共同點(diǎn):都提供了基于Redis操作的Java API,只是封裝程度,具體實(shí)現(xiàn)稍有不同。 不同點(diǎn): 1.1、Jedis 是Redis的Java
    的頭像 發(fā)表于 09-22 10:48 ?1849次閱讀
    Springboot+<b class='flag-5'>redis</b>操作多種<b class='flag-5'>實(shí)現(xiàn)</b>

    redis設(shè)計(jì)與實(shí)現(xiàn)

    redis
    發(fā)表于 06-20 14:44 ?0次下載

    談?wù)?b class='flag-5'>Redis怎樣配置實(shí)現(xiàn)主從復(fù)制?

    之前總結(jié)過(guò)redis的持久化機(jī)制:深度剖析Redis持久化機(jī)制,持久化機(jī)制主要解決redis數(shù)據(jù)單機(jī)備份問(wèn)題;redis的高可用需要考慮數(shù)據(jù)的多機(jī)備份,多機(jī)備份通過(guò)主從復(fù)制來(lái)
    發(fā)表于 01-31 11:31 ?671次閱讀

    Redis實(shí)現(xiàn)限流的三種方式分享

    當(dāng)然,限流有許多種實(shí)現(xiàn)的方式,Redis具有很強(qiáng)大的功能,我用Redis實(shí)踐了三種的實(shí)現(xiàn)方式,可以較為簡(jiǎn)單的實(shí)現(xiàn)其方式。
    的頭像 發(fā)表于 02-22 09:52 ?1105次閱讀

    Redis數(shù)據(jù)同步解決方案—NineData

    NineData(https://www.ninedata.cloud/)在Redis同步上,提供了穩(wěn)定和高效的解決方案,并且性能上也領(lǐng)先其他同步工具,特別是在同步的動(dòng)態(tài)限流、數(shù)據(jù)對(duì)
    的頭像 發(fā)表于 06-05 15:31 ?846次閱讀
    <b class='flag-5'>Redis</b>數(shù)據(jù)<b class='flag-5'>同步</b>解決方案—NineData

    redis分布式鎖如何實(shí)現(xiàn)

    Redis分布式鎖是一種基于Redis實(shí)現(xiàn)的機(jī)制,可以用于多個(gè)進(jìn)程或多臺(tái)服務(wù)器之間對(duì)共享資源的并發(fā)訪問(wèn)控制。在分布式系統(tǒng)中,由于多個(gè)進(jìn)程或多臺(tái)服務(wù)器同時(shí)訪問(wèn)共享資源,可能會(huì)發(fā)生數(shù)據(jù)競(jìng)爭(zhēng)和資源沖突
    的頭像 發(fā)表于 11-16 11:29 ?554次閱讀

    Redis工具集的實(shí)現(xiàn)和使用

    Redis 基本上是互聯(lián)網(wǎng)公司必備的工具了,Redis的應(yīng)用場(chǎng)景實(shí)在太多了,但是有很多相似的功能如果每個(gè)項(xiàng)目都要實(shí)現(xiàn)一遍就顯得太麻煩了,所以為了方便,我打算開(kāi)發(fā)一個(gè)基于 Redis
    的頭像 發(fā)表于 12-03 17:32 ?1268次閱讀
    <b class='flag-5'>Redis</b>工具集的<b class='flag-5'>實(shí)現(xiàn)</b>和使用

    Java redis鎖怎么實(shí)現(xiàn)

    在Java中實(shí)現(xiàn)Redis鎖涉及到以下幾個(gè)方面:Redis的安裝配置、Redis連接池的使用、Redis數(shù)據(jù)結(jié)構(gòu)的選擇、
    的頭像 發(fā)表于 12-04 10:47 ?1184次閱讀

    redis hash底層實(shí)現(xiàn)原理

    數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的呢?本文將詳細(xì)介紹Redis哈希底層的實(shí)現(xiàn)原理。 在Redis中,每個(gè)哈希都是由一個(gè)類(lèi)似于字典(Dictionary)的結(jié)構(gòu)實(shí)現(xiàn)
    的頭像 發(fā)表于 12-04 16:27 ?603次閱讀

    redis數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)

    Redis是一種內(nèi)存鍵值數(shù)據(jù)庫(kù),常用于緩存、消息隊(duì)列、實(shí)時(shí)數(shù)據(jù)分析等場(chǎng)景。它的高性能得益于其精心設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和底層實(shí)現(xiàn)。本文將詳細(xì)介紹Redis常用的數(shù)據(jù)結(jié)構(gòu)和它們的底層實(shí)現(xiàn)。
    的頭像 發(fā)表于 12-05 10:14 ?642次閱讀

    Redis實(shí)現(xiàn)分布式多規(guī)則限流的方式介紹

    市面上很多介紹 Redis 如何實(shí)現(xiàn)限流的,但是大部分都有一個(gè)缺點(diǎn),就是只能實(shí)現(xiàn)單一的限流,比如 1 分鐘訪問(wèn) 1 次或者 60 分鐘訪問(wèn) 10 次這種,但是如果想一個(gè)接口兩種規(guī)則都需
    的頭像 發(fā)表于 02-26 10:07 ?529次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>實(shí)現(xiàn)</b>分布式多規(guī)則限流的方式介紹