redis怎么實現數據同步

redis怎么實現數據同步

redis的主從同步機制可以確保redis的master和slave之間的數據同步。

同步方式包括:全量復制和增量復制? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(推薦學習:Redis視頻教程

全量拷貝

redis怎么實現數據同步

slave第一次啟動時,連接Master,發送PSYNC命令,格式為psync {runId} {offset}

{runId}?為master的運行id;{offset}為slave自己的復制偏移量。 slave第一次連接master時,slave并不知道master的runId,也不知道自己偏移量,這時候slave會傳一個問號和-1,告訴master節點是第一次同步。格式為psync???-1

當master接收到psync ? -1時,知道slave是要全量復制,就會將自己的runId和offset告知slave,回復命令fullresync {runId} {offset}。同時,master會執行bgsave命令來生成rdb文件,期間的所有寫命令將被寫入緩沖區。

slave接受到master的回復命令后,會保存master的runId和offset,slave此時處于同步狀態。 slave處于同步狀態,如果此時收到請求,當配置參數slave-server-stale-data?yes時,會響應當前請求;slave-server-stale-data?no,返回錯誤。

master bgsave執行完畢,向slave發送rdb文件。rdb文件發送完畢后,開始向slave發送緩沖區中的寫命令。

slave收到rdb文件,丟棄所有舊數據,開始載入rdb文件。

rdb文件同步結束之后,slave執行從master緩沖區發送過來的所以寫命令。

此后 master 每執行一個寫命令,就向slave發送相同的寫命令。

增量拷貝

如果出現網絡閃斷或者命令丟失等異常情況時,當主從連接恢復后,由于從節點之前保存了自身已復制的偏移量和主節點的運行ID。因此會把它們當作psync參數發送給主節點,要求進行部分復制操作,格式為psync {runId} {offset}。

主節點接到psync命令后首先核對參數runId是否與自身一致,如果一致,說明之前復制的是當前主節點;之后根據參數offset在自身復制積壓緩沖區查找,如果偏移量之后的數據存在緩沖區中,則對從節點發送+continue響應,表示可以進行部分復制;否則進行全量復制。

主節點根據偏移量把復制積壓緩沖區里的數據發送給從節點,保證主從復制進入正常狀態。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享