Redis的復制功能分為同步(sync)和命令傳播(command propagate)兩個操作,
同步
同步操作用于將從服務器的資料庫狀態更新至主服務器當前所處的資料庫狀態,
1. 舊版本的執行步驟
- 從服務器向主服務器發送SYNC命令
- 主服務器執行BGSAVE命令,生成RDB檔案,并使用一個緩沖區記錄從現在開始執行的所有寫命令
- 當主服務器執行完BGSAVE命令后,主服務器將RDB檔案發送給從服務器,從服務器載入RDB檔案
- 主服務器將記錄在緩沖區里的寫命令發送給從服務器,從服務器執行后更新至主服務器資料庫當前的狀態
2. 舊版本存在的問題
斷線后重復制效率低,有大量重復的資料不需要同步
3. 新版本的復制功能
同步操作從SYNC命令切換成PSYNC命令,PSYNC命令支持完全重同步(full resynchronization)和部分重同步(partial resynchronization)兩種模式,
- 完全重同步:用來處理初次復制的情況
- 部分重同步:用來處理斷線后重復制的情況,由3部分構成:
- 主服務的復制偏移量(replication offset)和從服務器的復制偏移量
- 主服務器的復制積壓緩沖區(replication backlog),維護一個固定長度的FIFO佇列
- 服務器的運行ID(run ID)
在進行主從同步時,以下情況進行完全重同步,其余情況采用部分重同步,
- 從服務器從來沒有同步過主服務器的任何資料
- 從服務器持用的run ID與主服務器不一致(主服務器換了)
- 從服務器的offset不在復制積壓緩沖區中
命令傳播
命令傳播操作用于在主服務器的資料庫狀態修改,導致主從服務器的資料庫狀態出現不一致時,讓主從服務器的資料庫狀態重新回到一致狀態,
在命令傳播階段,從服務器會默認以每秒一次的頻率,向主服務器發送命令,發送的REPLCONF ACK命令對主從服務器有三個作用:
- 檢測主服務器的網路連接狀態
- 輔助實作min-slaves選項,Redis的
min-slaves-to-write和min-slaves-max-log兩個選項可以防止主服務器在不安全的情況下執行寫命令 - 檢測命令丟失,通過檢測主從服務器的
offset來確定主從服務器之間資料是否一致,如果不一致會從復制積壓緩沖區中將資料補發給從服務器,如果復制積壓緩沖區中沒有對應的offset,需要進行完全重同步
復制方案的實作
通過向主服務器發送SLAVEOF命令,我們可以讓一個從服務器去復制一個主服務器的資料,具體實作步驟如下:
- 設定主服務器的地址和埠
- 主從服務器建立套接字連接
- 發送PING命令檢測主從服務器之間通訊是否正常
- 身份驗證
- 發送從服務器的監聽埠
- 執行同步
- 命令傳播
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145070.html
標籤:Java
上一篇:Redis的事件機制
