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