標籤:redis 同步
同步
Redis為什麼要實現主從同步?
主從同步,有以下好處:
- 實現資料的備份,減少單點故障帶來的損失;
- 有利於實現負載平衡。本來一台伺服器負責所有資料的讀寫,而通過主從同步,可以讓多個從伺服器負責資料的讀,而主伺服器主要負責資料的寫,減輕了單點壓力。
部分重同步
Redis從2.8開始,引入了PSYNC,支援部分重同步:主伺服器和從伺服器中斷連線這段時間,主伺服器的資料可能只是發生了少量的變化,那麼當從伺服器重新連上主伺服器時,就沒有必要把主伺服器裡面的資料全部發給從伺服器進行資料覆蓋,只需要把不一致的資料發給從伺服器,這樣避免了主伺服器進行資料備份、資料的網路傳輸。
同步的過程
下面使用兩台機器,A(10.15.62.11 :6379)作為從伺服器,B(10.15.62.12 :6380)作為主伺服器,介紹一下A和B進行初次完全同步和部分重同步的過程。
- 通過用戶端向A發送slaveof 10.15.62.12 6380的命令, A收到命令之後,會向用戶端返回+OK;
- A和B之間建立通訊端;
- A向B發送PING命令,有兩個目的:1)驗證AB之間的通訊端有沒有問題;2)B伺服器能夠處理命令,對外服務。
- B向A返回PONG;
- 如果A設定了masterauth,表示需要身分識別驗證。那麼A會向B發送AUTH命令,命令參數是masterauth的值。
- 如果A發送的值和B的requirepass值相同,則通過驗證。
- A向B發送REPLCONF listening-port 6379,B會把A的連接埠儲存起來,唯一的用途是:使用者使用用戶端向B發送INFO replication命令時,顯示從伺服器的連接埠。
- A向B發送PSYNC ? -1;
- B接受PSYNC命令後,把自己的run-id和自己的複製位移量發給A,A會把B的運行id儲存起來,並且把B的複製位移量作為自己的複製位移量;B然後執行BGSAVE操作,通過子進程產生一份RDB資料,同時把執行BGSAVE命令期間接收到的寫命令儲存起來。
- B把RDB資料發給A,A把自己的資料庫清空,把B的RDB資料載入到記憶體裡面;B把複製的寫命令發給A。
- 同步完成;
- 然後向B寫資料時,B會向A傳遞命令。
- A和B突然斷開;
- A和B重新串連;
- A向B發送PSYNC <run-id> <offset>……run-id是自己儲存的主伺服器的運行id,offset是自己的複製位移量。
- B接收到PSYNC及其參數,發現運行id和自己的運行id相同;發現offset之後的資料在自己的複製積壓緩衝區裡面,只需要部分重同步,向A返回+CONTINUE。
- B把積壓緩衝區裡面的資料發給A。
- 再次同步。
代碼實現:
未完待續。
參考資料:
《Redis設計與實現》第15章
Redis主從同步源碼淺析-Slave端
Redis之主從同步