標籤:沒有 logs com 讀書筆記 需要 全域 主從 接收 時間
複製即主伺服器向從伺服器的資料同步,REDIS的實現具有參考意義,尤其對於有主從同步需求,資料量不是特別大,可以用記憶體儲存,其中巧妙之處在於 offset和緩衝區的配對使用,讓主伺服器能夠很快的知道應該同步哪些資料,即使面對多個從伺服器可以做到處理流程一樣。
書中分析了老版本和新版本在複製過程中,斷鏈發生時的不同處理,來描述複製的過程。
老版本複製主要2個方式:
1. 從伺服器主動發送SYNC給主伺服器,主伺服器啟動BGSAVE,產生一個DB檔案,傳給從伺服器,從伺服器載入DB檔案,然後主伺服器將這個過程中接收到的寫命令也同步給從伺服器,從伺服器也執行這些寫命令,同步結束。
SYNC的過程是非常耗費資源的,CPU,記憶體,頻寬都會在不同時期被佔用
2. 主從伺服器DB相同,主伺服器執行了寫命令,主動同步給從伺服器,稱之為命令傳播
老版本的bug:上面第2點,假如主伺服器和從伺服器斷鏈,主伺服器無法感知,依然進行命令傳播,將主伺服器上的寫命令傳送給從伺服器,而從伺服器接收不到,最後建連後資料就不一致了。
當然,建鏈後可以直接來一次SYNC,不過這樣過於耗費資源。
新版本:
有了PSYNC命令,斷鏈後,等到建鏈,從伺服器發送PSYNC給主伺服器,主伺服器會將斷鏈時間段的所有寫命令同步給從伺服器。
中+CONTINUE回複標識開始部分同步。
二 部分複製的實現細節:
1. 首先,主從伺服器都會記下同步的位元組數,所謂複製位移量,主伺服器上記錄 同步多少位元組給從伺服器,從伺服器記錄接收到主伺服器同步多少個位元組,15-7中同步了10086位元組的資料
如果斷鏈後恢複,從伺服器發送PSYNC給主伺服器,帶上本地的複製位移量,主伺服器比較後發現和本地的不一樣,就意味著主從資料不一致,需要進行資料同步。
2. 主服務發現本地的offset和從伺服器的offset不一致,意味著要進行資料同步,怎麼同步呢?
主伺服器中會有一個固定長度(1MB)的FIFO的複製積壓緩衝區,每個複製到從伺服器的位元組,都會儲存在這個緩衝區中,每個位元組都對應到一個offset.
當從伺服器發送PSYNC,帶來自己的offset,主伺服器會在複製積壓緩衝區中尋找,如果offset+1依然在緩衝區中,沒有被擠壓出隊列(固定長度FIFO,儲存最新的命令,如果隊列滿,最老的命令會被擠壓出隊列),就可以執行部分複製。否則就要進行全部複製,即SYNC
2.伺服器運行ID,從伺服器會儲存主伺服器的運行ID,此ID是全域唯一的。如果斷鏈再建聯,主伺服器發現從伺服器發來的主伺服器運行ID(伴隨PSYNC命令)和自己的不一樣,那麼就要進行完整的複製,如果ID一致,可以選擇進行部分複製。
[redis讀書筆記] 第三部分 多機資料庫的實現 複製