一、簡述
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命令,可根據策略選擇部分同步或增量同步。
實現方式如下:
- 複製偏移量:各服務器記錄了當前數據的偏移位置,若master\slave不同說明數據不一致。
- 複製積壓緩衝區:master在執行過程中將寫命令塞進複製積壓緩衝區;當slave請求PSYNC時會帶上slave當前數據的偏移量offset,若在master緩衝區中offset位置的數據還在,就offset到緩衝區末端的數據同步給slave,此即增量同步;
- 記錄了服務器的運行ID:每個服務器都有一個runID,master在PSYNC的返回值中將自己的runID拋給slalve記錄下來;在下一次PSYNC命令傳送給master時用於對比,若runID變了,說明slave先前同步的master並非自己,因此將選擇全量同步,否則考慮增量同步。
四、其它
- master-slave會相互成爲對方的客戶端,以發送命令;
- slave定期向master發送心跳檢查;