用戶可以通過SLAVEOF命令讓一個服務器去復制另一個服務器,下面命令中,127.0.0.1:12345是從服務器,127.0.0.1 6379是主服務器,

1. 舊版復制功能的實作
Redis的復制功能分為同步(sync)和命令傳播(command propagate)兩個操作:
- 同步操作用于將從服務器的資料庫狀態更新至主服務器當前所處狀態
- 命令傳播操作用于在主服務器的資料庫狀態被修改后,讓主從服務器的資料庫重新回到一致狀態
1.1 同步

1.2 命令傳播
當完成同步操作后,主服務器會將之后執行的寫命令發送給從服務器執行,以使主從服務器保持一致,
2 舊版復制功能的缺陷
從服務器對主服務器的復制一般分為兩種情況:
- 初次復制:從服務器以前沒有復制過任何主服務器,或者從服務器當前要復制的主服務器和上一次復制的主服務器不同
- 斷線后重復制:處于命令傳播階段的主從服務器因為網路問題而中斷了復制,但從服務器通過自動重連接連上了主服務器,并繼續復制主服務器
舊版復制功能斷線后重復制效率很低,如表15-2例子所示:

主從服務器在T0到T10086一直處于一致狀態,真正需要主服務器添加的K10087, K10088, K10089三個鍵的資料,但是,實際上主服務器生成并向從服務器發送包含鍵K1至K10089的RDB檔案,而SYNC命令是一個非常耗費資源的操作,
3 新版復制功能的實作
PSYNC命令包含完整重同步和部分重同步兩種模式:
- 完整重同步的執行步驟與SYNC命令基本一致
- 部分重同步只將主從服務器斷開期間執行的寫命令發送給從服務器

4. 部分重同步的實作
部分重同步由以下三部分構成:
- 主服務器的復制偏移量和從服務器的復制偏移量
- 主服務器的復制積壓緩沖區
- 服務器的運行ID
4.1 復制偏移量
主服務器每次向從服務器傳播N個位元組的資料時,就將自己的復制偏移量的值加上N,從服務器每次收到主服務器傳播來的N位元組資料時,就將自己的復制偏移量的值加N,

4.2 復制積壓緩沖區
復制積壓緩沖區是由主服務器維護的一個固定長度(fixed-size)先進先出(FIFO)佇列(后進入的資料會將最先進入佇列的資料踢出佇列),默認大小為1MB.

當從服務器重新連接主服務器時,從服務器會通過PSYNC命令將自己的復制偏移量offset發送給主服務器:
- 如果offset偏移量之后的資料,仍然存在于復制積壓緩沖區里,主服務器對從服務器執行部分重同步操作
- 如果offset偏移量之后的資料已經不存在于復制積壓緩沖區,那么主服務器將對從服務器執行完整重同步操作
4.3 服務器運行ID
當從服務器對主服務器進行初次復制時,主服務器會將自己的運行ID(40個隨機16進制字符組成)傳送給從服務器,在網路斷開后,從服務器重新連接上主服務器后,從服務器將向主服務器發送這個ID,主服務器確定是否是自己的ID,是則執行部分重同步,否則執行完整重同步,
5 PSYNC命令的實作
6. 心跳檢測
在命令傳播階段,從服務器默認會以每秒一次的頻率,向主服務器發送命令:
REPLCONF ACK <replication_offset>
其中replication_offset是從服務器當前的復制偏移量
發送REPLCONF ACK命令主要有三個作用:
- 檢測主從服務器的網路連接狀態
- 輔助實作min-slaves選項 Redis的min-slaves-to-write和min-slaves-max-lag兩個選項可以防止主服務器在不安全的情況下執行寫命令
- 檢測命令丟失 比較主服務器和從服務器的復制偏移量
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296145.html
標籤:其他
上一篇:第六章 客戶端與服務器
下一篇:第八章 Sentinel
