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