主從同步原理:
參考:https://www.cnblogs.com/lukexwang/p/4711977.html
舊版複制
步驟一 同步:
-
從伺服器向主伺服器發送SYNC指令;
收到SYNC指令的主伺服器執行BGSAVE指令,在背景生成一個RDB檔案,并使用一個緩沖區記錄從現在開始執行的所有寫指令;
- 當主伺服器的BGSAVE指令執行完畢時,主伺服器會将BGSAVE指令生成的RDB檔案發送給從伺服器,從伺服器接收并載入這個RDB檔案,将自己的資料庫狀态更新至主伺服器執行BGSAVE指令時的資料庫狀态。
- 主伺服器将記錄在緩沖區裡面的所有寫指令發送給從伺服器,從伺服器執行這些寫指令,将自己的資料庫狀态更新至主伺服器資料庫目前所處的狀态。
步驟二 指令傳播
主伺服器會将自己執行的寫指令,也即是造成主從伺服器不一緻的那條寫指令,發送給從伺服器執行,當從伺服器執行了相同的寫指令之後,主從伺服器将再次回到一緻狀态。
缺點
對于初次複制和斷線後重複制均需要發送SYNC指令,讓主伺服器進行一次同步操作。
SYNC指令是一個非常耗費資源的操作:
- 主伺服器需要執行BGSAVE指令來生成RDB檔案,這個生成操作會耗費主伺服器大量的CPU、記憶體和磁盤I/O資源;
- 主伺服器需要将自己生成的RDB檔案發送給從伺服器,這個發送操作會耗費主從伺服器大量的網絡資源(帶寬和流量),并對主伺服器響應指令請求的時間産生影響;
- 接收到RDB檔案的從伺服器需要載入主伺服器發來的RDB檔案,并且在載入期間,從伺服器會因為阻塞而沒辦法處理指令請求。
新版複制
采用PSYNC指令代替SYNC。
PSYNC指令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)兩種模式:
- 其中完整重同步用于處理初次複制情況:完整重同步的執行步驟和SYNC指令的執行步驟基本一樣,它們都是通過讓主伺服器建立并發送RDB檔案,以及向從伺服器發送儲存在緩沖區裡面的寫指令來進行同步;
- 而部分重同步則用于處理斷線後重複制情況:當從伺服器在斷線後重新連接配接主伺服器時,如果條件允許,主伺服器可以将主從伺服器連接配接斷開期間執行的寫指令發送給從伺服器,從伺服器隻要接收并執行這些寫指令,就可以将資料庫更新至主伺服器目前所處的狀态。
采用政策
①通過偏移狀态容易得知是否主從一緻,如圖。

②通過複制積壓緩存區
以隊列結構存儲主伺服器的寫指令。
③伺服器運作ID
從伺服器記錄主伺服器ID,重連後判斷是否是之前那一台來決定是進行完整重同步或者部分重同步。
伺服器重新連上主伺服器時,從伺服器會通過PSYNC指令将自己的複制偏移量offset發送給主伺服器,主伺服器會根據這個複制偏移量來決定對從伺服器執行何種同步操作:
- 如果offset偏移量之後的資料(也即是偏移量offset+1開始的資料)仍然存在于複制積壓緩沖區裡面,那麼主伺服器将對從伺服器執行部分重同步操作;
- 相反,如果offset偏移量之後的資料已經不存在于複制積壓緩沖區,那麼主伺服器将對從伺服器執行完整重同步操作。