Redis設計 - 主從與複製功能

一、簡述

Redis提供了slaveof命令,使當前結點A定期接受另一結點B的數據。我們稱B爲主服務器(以下稱爲master),A爲B結點的從服務器(以下稱爲slave)。
在2.8版本開始,主從功能開始完善,通過初始的全量同步,及後續不斷的增量同步,來實現主從的一致。

二、Redis 2.8以前的老版本

redis slave初次連上master時,發送SYNC命令完成初次的全量數據同步,後續master執行的寫命令,都會同步一份發送到slave執行,使得增量數據一致。但在斷線重連後,爲了使數據重新一致,會再次使用SYNC命令來同步全量的數據。
每次執行SYNC命令,master都執行一次全量數據保存(存在RDB文件),並將全量數據通過RDB文件傳輸給slave,並這使得斷線重連的過程相當耗時。

三、Redis 2.8開始的新版本

Redis在2.8版本開始實現了PSYNC命令,可根據策略選擇部分同步或增量同步。
實現方式如下:

  1. 複製偏移量:各服務器記錄了當前數據的偏移位置,若master\slave不同說明數據不一致。
  2. 複製積壓緩衝區:master在執行過程中將寫命令塞進複製積壓緩衝區;當slave請求PSYNC時會帶上slave當前數據的偏移量offset,若在master緩衝區中offset位置的數據還在,就offset到緩衝區末端的數據同步給slave,此即增量同步
  3. 記錄了服務器的運行ID:每個服務器都有一個runID,master在PSYNC的返回值中將自己的runID拋給slalve記錄下來;在下一次PSYNC命令傳送給master時用於對比,若runID變了,說明slave先前同步的master並非自己,因此將選擇全量同步,否則考慮增量同步。

四、其它

  • master-slave會相互成爲對方的客戶端,以發送命令;
  • slave定期向master發送心跳檢查;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章