Redis 主從同步原理

主從同步原理:

參考:https://www.cnblogs.com/lukexwang/p/4711977.html

舊版複製

步驟一 同步

  1. 從服務器向主服務器發送SYNC命令;
    收到SYNC命令的主服務器執行BGSAVE命令,在後臺生成一個RDB文件,並使用一個緩衝區記錄從現在開始執行的所有寫命令;
  2. 當主服務器的BGSAVE命令執行完畢時,主服務器會將BGSAVE命令生成的RDB文件發送給從服務器,從服務器接收並載入這個RDB文件,將自己的數據庫狀態更新至主服務器執行BGSAVE命令時的數據庫狀態。
  3. 主服務器將記錄在緩衝區裏面的所有寫命令發送給從服務器,從服務器執行這些寫命令,將自己的數據庫狀態更新至主服務器數據庫當前所處的狀態。

步驟二 命令傳播
主服務器會將自己執行的寫命令,也即是造成主從服務器不一致的那條寫命令,發送給從服務器執行,當從服務器執行了相同的寫命令之後,主從服務器將再次回到一致狀態。

缺點
對於初次複製和斷線後重複製均需要發送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偏移量之後的數據已經不存在於複製積壓緩衝區,那麼主服務器將對從服務器執行完整重同步操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章