1. 程式人生 > 實用技巧 >10、主從服務

10、主從服務

複製過程
  1、從伺服器傳送psync命令給主伺服器,如果是第一次進行主從複製,那麼傳送psync ? -1命令,否則會發送psync 命令
  2、主服務收到psync命令後,根據傳送來的命令判斷是完整同步還是部分同步,如果是完整同步,執行bgsave命令,後臺會生成一個RDB檔案,同時返回+FULLRESYNC 給從伺服器,並且用一個緩衝區記錄從現在開始所有的寫命令。如果是部分同步,返回+CONTINUE給客戶端標識進行部分同步操作。
  3、從伺服器將主服務傳送的RDB檔案或者複製擠壓緩衝區的謝寫命令載入到伺服器裡

psync
  psync分為完整同步和部分同步
  部分同步由主從伺服器的複製偏移量、複製擠壓緩衝區和執行id組成。

  複製積壓緩衝區
    複製積壓緩衝區是由伺服器維護的固定的先進先出的固定佇列,預設大小1M,通過repl-backlog-size設定。如果入隊元素大於佇列長度時,則會彈出最先入隊的元素,新元素會被放入佇列。
    當主伺服器進行命令傳播的時候,它不僅會將寫命令傳送給所有從伺服器,還會將命令傳送給複製積壓緩衝區中。
在這裡插入圖片描述
    主伺服器的積壓緩衝器不僅會儲存最近一部分的寫命令,並且還會為每個佇列中的位元組記錄對應的偏移量。
    當從伺服器重新連上主伺服器時,會將自己的複製偏移量傳送給主伺服器,如果偏移量在複製積壓緩衝區內,那麼主伺服器向從伺服器傳送+CONTINUE回覆,表示資料同步將以部分同步方式來進行,否則進行完整同步。
  伺服器執行id
    redis服務在啟用的時候會生成一個id,由40個隨機的16進位制字元組成,當主從伺服器第一次複製的時候,主伺服器會將執行id傳送給從伺服器,從伺服器儲存主伺服器的執行id,當從伺服器斷開重新連線的時候,會帶上這個執行id,主伺服器判斷從伺服器傳送的執行id和當前的id是否相同,如果相同,則可以進行部分同步操作,否則進行完成同步操作。
  實現原理
    1、如果從伺服器沒有複製過任何伺服器,那麼傳送psync ? -1命令,請求伺服器進行完整重同步
    2、如果之前複製過某個主伺服器,那麼再一次複製的時候傳送psync 命令
    3、如果主伺服器返回+FULLRESYNC ,那麼表示主從伺服器進行完整重同步操作,如果返回+CONTINUE,那麼表示主從伺服器進行部分重同步操作,如果返回-ERR,表示主服務的版本低於2.8,無法識別psync命令,那麼從伺服器將會向主服務傳送sync命令

複製檢測丟失
  從伺服器每隔一秒傳送replconf ack 命令,該命令可用於檢測主從資料庫資料是否一致,比如主伺服器的offset為10086, 從伺服器的offset為1000,那麼主伺服器在接收到replconf的offset之後發現兩邊offset不一致,那麼主伺服器就會將丟失的資料重新發送給從伺服器,從而保證資料一致性

從節點寫命令配置
   min-slaves-to-write 3,從節點小於3,主伺服器拒絕執行寫命令
  min-slaves-max-lag 10,所有從伺服器的延遲(根據replconf ask命令判斷從節點超時時間)都大於10秒時,主伺服器拒絕執行寫命令

心跳檢測
  從伺服器是每10秒傳送一次ping命令給主伺服器,通過repl-ping-slave-period設定,預設10