一。新版複製PSYNC命令實現:複製實現總流程
(1)通過客戶端向從伺服器傳送 slaveof <master_ip> <master_port>;此為非同步執行,從伺服器設定好屬性後向客戶端返回OK時才真正執行復制
(2)建立套接字連線;(可認為從伺服器變成了主伺服器的客戶端)
(3)從伺服器傳送PING命令,主伺服器返回PONG命令;返回則繼續執行,否則斷開重連
(4)從伺服器是否設定了masterauth;設定了則需進行身份驗證,未設定則跳過
(5)從伺服器向主伺服器傳送從伺服器監聽的埠號
(6)PSYNC命令資料同步(完整重同步或部分重同步)
(7)命令傳播(保持主從伺服器資料一致,收/發命令時,從/主伺服器的複製偏移量增加;同時,將命令傳播至複製積壓緩衝區)
(8)心跳檢測(預設每秒一次)
二。新版複製PSYNC命令實現:同步與命令傳播
伺服器中的三個重要引數:複製偏移量、複製積壓緩衝區、伺服器執行ID
1.主/從伺服器的複製偏移量:記錄收/發位元組數(主傳送多少則偏移量增加多少,從接收多少則偏移量增加多少);用於判斷主從伺服器資料是否一致(通過偏移量是否相同)。
2.主伺服器的複製積壓緩衝區:固定長度FIFO佇列,預設1M,儲存最近的一部分命令;用於部分重同步。
(首先,命令傳播時不僅將命令傳送給從伺服器還會將命令傳送到複製積壓緩衝區;其次,斷線後重複製時先判斷是否能夠進行部分重同步即判斷複製偏移量offset之後的資料是否還在複製積壓緩衝區中;最後,如果存在則返回+CONTINUE回覆,將複製積壓緩衝區在偏移量之後的資料傳送給從伺服器,完成部分重同步;不存在,則返回+FULLRESYNC <runid> <offset>並執行完整重同步)
3.伺服器執行ID:記錄主從伺服器執行ID;用於部分重同步。
(首先,初次複製時主伺服器將自己的執行ID傳送給從伺服器,從伺服器儲存該ID;其次,斷線重連後從伺服器通過執行ID判斷重連的是否為上次的主伺服器(是否傳送PSYNC <runid> <offset>,傳送則為初次複製);最後,如果不相同則直接執行完整重同步,相同則嘗試通過複製偏移量和複製積壓緩衝區的比對來執行部分重同步)