PSYNC命令的調用方法有兩種:
如果從服務器以前沒有復制過任何主服務器,或者之前執行過 SLAVEOF no one 命令,那么從服務器在開始一次新的復制時將向主服務器發送PSYNC ? -1 命令,主動請求主服務器進行完整重同步(因為這時不可能執行部分重同步);
相反地,如果從服務器已經復制過某個主服務器,那么從服務器在開始一次新的復制時將向主服務器發送 PSYNC 《runid》 《offset》 命令:其中runid 是上一次復制的主服務器的運行ID,而 offset則是從服務器當前的復制偏移量,接收到這個命令的主服務器會通過這兩個參數來判斷應該對從服務器執行哪種同步操作。
根據情況,接收到PSYNC命令的主服務器會向從服務器返回以下三種回復的其中一種:
如果主服務器返回 +FULLRESYNC 《runid》 《offset》回復,那么表示主服務器將與從服務器執行完整重同步操作:其中runid是這個主服務器的運行ID,從服務器會將這個ID保存起來,在下一次發送PSYNC命令時使用;而offset則是主服務器當前的復制偏移量,從服務器會將這個值作為自己的初始化偏移量;
如果主服務器返回 +CONTINUE回復,那么表示主服務器將與從服務器執行部分重同步操作,從服務器只要等著主服務器將自己缺少的那部分數據發送過來就可以了;
如果主服務器返回 -ERR 回復,那么表示主服務器的版本低于 Redis
2.8,它識別不了PSYNC命令,從服務器將向主服務器發送SYNC命令,并與主服務器執行完整同步操作。
這張圖看了理解起來保準沒啥難度了!
上面我們詳細說明了redis主從同步時,底層是如何決定使用全量同步或者部分同步的策略。下面看下整個增量同步和部分同步的過程:
Redis 的全量同步過程主要分三個階段:
同步快照階段: Master 創建并發送快照給 Slave , Slave 載入并解析快照。Master
同時將此階段所產生的新的寫命令存儲到緩沖區。
同步寫緩沖階段:Master 向 Slave 同步存儲在緩沖區的寫操作命令。
同步增量階段:Master 向 Slave 同步寫操作命令。
增量同步
Redis 增量同步主要指 Slave 完成初始化后開始正常工作時, Master 發生的寫操作同步到 Slave 的過程。
通常情況下, Master 每執行一個寫命令就會向 Slave 發送相同的寫命令,然后 Slave 接收并執行。
-
服務器
+關注
關注
12文章
9277瀏覽量
85826 -
數據庫
+關注
關注
7文章
3842瀏覽量
64574 -
同步
+關注
關注
0文章
89瀏覽量
19207 -
Redis
+關注
關注
0文章
377瀏覽量
10905
發布評論請先 登錄
相關推薦
評論