Redis主從複製能夠根據是不是全量分爲全量同步和增量同步。如下對其相應的同步過程及原理作下簡要說明。redis
Redis增量同步主要指Slave完成初始化後開始正常工做時,Master發生的寫操做同步到Slave的過程。一般狀況下,Master每執行一個寫命令就會向Slave發送相同的寫命令,而後Slave接收並執行。服務器
Redis的全量同步過程主要分三個階段:併發
具體的全量同步步驟以下: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