redis主從同步原理概述

Redis主從複製能夠根據是不是全量分爲全量同步和增量同步。如下對其相應的同步過程及原理作下簡要說明。redis

增量同步

Redis增量同步主要指Slave完成初始化後開始正常工做時,Master發生的寫操做同步到Slave的過程。一般狀況下,Master每執行一個寫命令就會向Slave發送相同的寫命令,而後Slave接收並執行。服務器

全量同步

Redis的全量同步過程主要分三個階段:併發

  • 同步快照階段:Master建立併發送快照給Slave,Slave載入並解析快照。Master同時將此階段所產生的新的寫命令存儲到緩衝區。
  • 同步寫緩衝階段:Master向Slave同步存儲在緩衝區的寫操做命令。
  • 同步增量階段:Master向Slave同步寫操做命令。

具體的全量同步步驟以下:spa

步驟 主服務器 從服務器
1 (等待命令進入) 鏈接(重連)Master,發送SYNC命令
2 執行BGSAVE,並使用緩衝區記錄此後的全部寫命令 根據配置的設定,選擇繼續使用現有數據處理客戶端請求,或者直接向客戶端報錯。
3 BGSAVE執行完畢,向Slave發送快照文件,同時繼續緩衝此期間的寫命令。 丟棄全部舊數據,開始載入快照文件。
4 快照文件發送完畢、開始向Slave發送存儲在緩衝區的寫命令。 完成對快照文件的解釋操做;開始正常接收命令請求。
5 緩衝區所存儲的寫命令發送完畢;此後每執行一個寫命令,就向Slave發送相同的寫命令。 執行Master發來的全部的存儲在緩衝區裏的寫命令;此後,接收並執行Master傳來的每一個寫命令。

對應的流程圖以下:進程

圖片描述

值得注意的是,當多個Slave嘗試鏈接同一個Master進行全量同步的時候,Redis爲儘量地減小複製所需的工做,設定了兩種處理情形:圖片

當有新的Slave鏈接Master時 Master的處理策略
步驟3還沒有執行 全部Slave都會接收到相同的快照文件
步驟3正在執行或已執行 待當前的同步流程執行完畢後,對新的Slave從新執行一遍同步流程。

因爲Redis在複製進行期間,還會盡量地處理接收的命令請求。爲保障Master有足夠的內存來建立子進程和建立用於存儲寫操做命令的緩衝區等操做,同時又不影響Redis處理命令請求的效率,在實際的操做過程當中,最好使得主服務器預留30%~45%的內存用於執行上述操做。內存

主從鏈

Redis的Master和Slave並無特別不一樣的地方,Slave也能夠擁有本身的Slave,並由此造成主從鏈。
Slave對Slave進行復制在操做上和Slave對Master進行復制的惟一區別在於,若是Slave-X擁有Slave-X1,那麼當Slave-X在執行步驟4時(即:完成對快照文件的解釋操做;開始正常接收命令請求)時,它將斷開與Slave-X1的鏈接,致使Slave-X1須要從新鏈接並從新同步。get

圖片描述

相關參考

相關文章
相關標籤/搜索