天天看點

redis主從_終于明白了Redis的主從複制

點選上方☝Java程式設計技術樂園,輕松關注!及時擷取有趣有料的技術文章

做一個積極的人

編碼、改bug、提升自己

我有一個樂園,面向程式設計,春暖花開!

redis主從_終于明白了Redis的主從複制

1. 引言

Redis單節點存在單點故障,為解決單點問題,需要對Redis節點配置從節點。使用哨兵來監聽主節點存活狀态,若主節點挂掉,從節點能繼續提供緩存功能。從節點怎樣和主節點間完成資料傳遞?就是Redis的主從複制。

2. 主從配置及作用

臨時配置:redis-cli進入redis從節點後,使用 --slaveof [masterIP] [masterPort]

永久配置:進入從節點的配置檔案redis.conf,增加slaveof [masterIP] [masterPort]

作用:1)主從配置結合哨兵模式能解決單點故障問題,提高redis可用性

2)從節點僅提高讀的操作,主節點提供寫操作。對于讀多寫少的狀況,可給主節點配置多個從節點,進而提供響應效率

補充:主從複制并不是redis的橫向拓展,叢集模式才是

3. 複制過程

1)從節點執行slaveof [masterIP] [masterPort],儲存主節點資訊

2)從節點中的定時任務發現主節點資訊,建立和主節點的socket連接配接

3)從節點發送Ping信号,主節點傳回Pong,兩邊能互相通信

4)連接配接建立後,主節點将所有資料發送給從節點(資料同步)

5)主節點把目前的資料同步給從節點後,便完成了複制的建立流程。接下來,主節點就會持續的把寫指令發送給從節點,保證主從資料一緻性

4. 資料同步

redis 2.8 之前使用sync [runId] [offset]同步指令,redis2.8之後使用psync [runId] [offset]指令。兩者不同在于,sync指令僅支援全量複制過程,psync支援全量和部分複制;介紹同步之前先介紹幾個概念:

runId:每個redis節點啟動都會生成唯一的runId,每次redis重新開機後,runId也會發生變化

offset:主節點和從節點都各自維護自己的主從複制偏移量offset,當主節點有寫入指令時,offset=offset+指令的位元組長度。從節點在收到主節點發送的指令後,也會增加自己的offset,并把自己的offset發送給主節點。這樣,主節點同時儲存自己的offset,從節點的offset,通過對比offset來判斷主從節點資料是否一緻

repl_backlog_size:儲存在主節點上的一個固定長度的先進先出隊列,預設大小為1MB

1)主節點發送資料給從節點過程中,主節點還會進行一些寫操作,這時候的資料存儲在複制緩沖區。從節點同步主節點資料完成後,主節點将緩沖區的資料繼續發送給從節點,用于部分複制;

2)主節點(master)響應寫指令時,不但會把命名發送給從節點,還會寫入複制積壓緩沖區,用于複制指令丢失的資料補救;

psync執行流程

redis主從_終于明白了Redis的主從複制

從節點發送psync [runId] [offset]指令,主節點有如下響應

FULLRESYNC:第一次連接配接,進行全量複制

CONTINUE:進行部分複制

ERR:不支援psync指令,進行全量複制

全量複制流程

redis主從_終于明白了Redis的主從複制

1)從節點發送psync ? -1指令,因為第一次發送,不知道主節點的runId,是以為?,因為是第一次複制,是以offset = -1。

2)主節點發現從節點是第一次複制,變傳回FULLRESYNC {runId} {offset},runId是主節點的runId,offset是主節點目前的offset。

3)從節點接收主節點資訊後,儲存到info中。

4)主節點在發送FULLRESYNC後,啟動bgsave指令,生成RDB檔案(資料持久化)。

5)6)主節點發送RDB檔案給從節點。到從節點加載資料完成這段期間主節點的寫指令放入緩沖區。

7)從節點清理自己的資料庫資料。

8)從節點加載RDB檔案,将資料儲存的自己的資料庫中。

9)如果從節點開啟了AOF(另一種持久化方案),從節點會異步重寫aof檔案。

部分複制流程

redis主從_終于明白了Redis的主從複制

1)部分複制主要是Redis針對全量複制的過高開銷做出的一種優化措施,使用psync {runId}{offset}指令實作。當從節點(slave)正在複制主節點(master)時,如果出現網絡閃斷或者指令丢失等異常情況時,從節點會向主節點要求補發丢失的指令資料,如果主節點的複制積壓緩沖區記憶體将這部分資料則直接發送給從節點,這樣就可以保持主從節點複制的一緻性。補發的這部分資料一般遠遠小于全量資料。

2)主從連接配接中斷期間主節點依然響應指令,但因複制連接配接中斷指令無法發送給從節點,不過主節點内部存在的複制積壓緩沖區,依然可以儲存最近一段時間的寫指令資料,預設最大緩存1MB。當從節點網絡恢複後,從節點會再次連上主節點。

3)當主從連接配接恢複後,由于從節點之前儲存了自身已複制的偏移量和主節點的運作ID。是以會把它們當做psync參數發送個主節點,要求進行部分複制操作。

4)主節點接到psync指令後首先核對參數runId是否與自身一緻,如果一緻,說明之前複制的是目前主節點;之後根據參數offset在自身複制積壓緩沖區查找,如果偏移量之後的資料存在緩沖區中,則對從節點發送+COUTINUE響應,表示可以進行部分複制。因為緩沖區大小固定,若發生緩存溢出,則要進行全量複制。

5)主節點根據偏移量把複制積壓緩沖區裡的資料發送給從節點,保證主從複制進入正常狀态。

redis主從_終于明白了Redis的主從複制

5. 補充

Redis故障處理

若主節點挂掉後,再次重新開機,runid的值會變。此時從節點的發送psync指令,會提示找不到原runid,則會再進行一次全量複制。為避免這種狀況,使用Redis故障轉移機制,主節點挂掉後,從節點更新為主節點。如哨兵模式。

作者:超人小冰

位址:https://www.cnblogs.com/xiaobingblog/p/11611371.html

繼續閱讀