server.repl_state儲存slave目前的複制狀态
* redis啟動時初始化為REDIS_REPL_NONE
* 當接受到slaveof指令後,該redis轉換為slave,同時狀态變為REDIS_REPL_CONNECT
周期性執行的replicationCron會檢查slave目前的狀态,來執行不同的操作
如果slave處于REDIS_REPL_CONNECT,調用connectWithMaster建立到master的連接配接,狀态轉換為REDIS_REPL_CONNECTING
連接配接建立後,向master發送PING,狀态轉換為REDIS_REPL_RECEIVE_PONG
接受到PONG後,如果master配置了需要認證,則slave發送AUTH消息,AUTH通過後;slave發送REPLCONF listening-port消息到master告知自身監聽的端口;最後向master發送SYNC指令來請求同步rdb檔案,同時狀态轉換為REDIS_REPL_TRANSFER。
當master向slave發送rdb後,slave就開始讀取rdb檔案(master發送rdb前會先告知rdb檔案的總長度),slave接受完rdb檔案後,會emptyDb清空資料庫,然後調用rdbLoad加載從master接受到的rdb檔案,加載完成後狀态變為REDIS_REPL_CONNECTED,接下來slave會繼續接受從master同步過來的新操作,以保證主備的一緻性。
server.slaves裡維護所有的slave清單,slave.replstate裡記錄着每個slave目前的同步狀态(從master的視角看)。
當master接受到slave發來的sync/psync指令時,将該slave的狀态轉換為REDIS_REPL_WAIT_BGSAVE_START
master為該slave背景啟動rdbSaveBackground,并将該slave的狀态轉換為REDIS_REPL_WAIT_BGSAVE_END (如果master己收到sync時,master正在為某個slave轉儲rdb檔案,則新的slave可以直接進入REDIS_REPL_WAIT_BGSAVE_END狀态)
當rdbSaveBackground完成後,slave的狀态轉換為REDIS_REPL_SEND_BULK,master開始将rdb檔案發送給slave,發送前會先發送rdb檔案的長度資訊。
當rdb檔案發送完成後,slave的狀态轉換為REDIS_REPL_ONLINE。
master在為slave啟動rdbSaveBackground後,master上的更新會累積到slave的連接配接緩沖區,等到slave接受完rdb檔案之後,将緩沖區裡累積的更新同步到slave上
管理者向server發送slaveof master-ip master-port,将該server變為master的slave
slave建立到master的網絡連接配接
slave向master發送PING檢測網絡狀态,master回複+PONG
slave向master發送AUTH進行認證(可選),master恢複+OK
slave向master發送REPLCONF listening-port,master恢複+OK
slave向master發送sync/psync,master開始背景轉儲rdb檔案
master轉儲rdb完成後,向slave發送rdb檔案,slave接受rdb檔案并清空資料庫,load從master接受到的rdb檔案
master将rdb轉儲及傳輸期間累積的更新操作同步到slave
master與slave資料到達一緻,接下來master接受到的所有更新操作都會同步到slave
master周期性的ping slave(預設10s),當ping不通slave超過60s(預設)後,就會認為slave挂掉了,便會斷開與該slave的連接配接;同理,slave如果超過一定時間沒有接受到master的PING,會認為master挂掉了,便會斷開與master的連接配接。
當master、slave連接配接斷開後,slave需要重新向master請求同步rdb檔案;2.8版本裡redis一定程度支援增量同步,master将同步資料同步給slave時,會同時存儲到一個環形緩沖區(預設1M大小),這個緩沖區永遠存儲最新的同步資料;另外master、slave都會記錄目前同步的offset。
當slave與master斷開後,slave會先嘗試進行PSYNC增量同步,如果連接配接斷開期間,master沒有重新開機過,并且slave的offset在master的環形緩沖區内,則可直接進行增量同步,比如:
假設環形緩沖區的長度為1000, master的同步offset為10000,此時緩沖區裡記錄的是9001-10000的同步資料,slave同步到9500時,與master斷開了連接配接;slave重建立立與master連接配接後,會帶上offset 9500,請求增量同步,master發現該slave的offset在9001-10000之間,可以進行增量同步,将9501-10000的同步資料發送給slave,以達到主備一緻的狀态。