天天看點

第七章 複制

  使用者可以通過SLAVEOF指令讓一個伺服器去複制另一個伺服器,下面指令中,127.0.0.1:12345是從伺服器,127.0.0.1 6379是主伺服器。

第七章 複制
第七章 複制

  Redis的複制功能分為同步(sync)和指令傳播(command propagate)兩個操作:

同步操作用于将從伺服器的資料庫狀态更新至主伺服器目前所處狀态

指令傳播操作用于在主伺服器的資料庫狀态被修改後,讓主從伺服器的資料庫重新回到一緻狀态

  1.1 同步

  

第七章 複制

  1.2 指令傳播

  當完成同步操作後,主伺服器會将之後執行的寫指令發送給從伺服器執行,以使主從伺服器保持一緻。

  從伺服器對主伺服器的複制一般分為兩種情況:

初次複制:從伺服器以前沒有複制過任何主伺服器,或者從伺服器目前要複制的主伺服器和上一次複制的主伺服器不同

斷線後重複制:處于指令傳播階段的主從伺服器因為網絡問題而中斷了複制,但從伺服器通過自動重連接配接連上了主伺服器,并繼續複制主伺服器

  舊版複制功能斷線後重複制效率很低,如表15-2例子所示:

第七章 複制

  主從伺服器在T0到T10086一直處于一緻狀态,真正需要主伺服器添加的K10087, K10088, K10089三個鍵的資料。但是,實際上主伺服器生成并向從伺服器發送包含鍵K1至K10089的RDB檔案。而SYNC指令是一個非常耗費資源的操作。

  PSYNC指令包含完整重同步和部分重同步兩種模式:

完整重同步的執行步驟與SYNC指令基本一緻

部分重同步隻将主從伺服器斷開期間執行的寫指令發送給從伺服器

第七章 複制

   部分重同步由以下三部分構成:

主伺服器的複制偏移量和從伺服器的複制偏移量

主伺服器的複制積壓緩沖區

伺服器的運作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兩個選項可以防止主伺服器在不安全的情況下執行寫指令

檢測指令丢失 比較主伺服器和從伺服器的複制偏移量

繼續閱讀