redis系列之------主從複製

什麼是主從複製

Redis的主從複製機制是指可讓從服務器(slave)能精確複製主服務器(master)的數據,以下圖所示:數據庫

 

         

或者   服務器

       

 

主從複製的方式和工做原理

工做方式:

Redis主從複製主要有兩種模式:完整重同步(full resynchronization)和部分重同步(partial resynchronization)網絡

  • 其中完整重同步用於處理初次複製狀況:完整重同步的執行步驟和SYNC命令的執行步驟基本同樣,它們都是經過讓主服務器建立併發送RDB文件,以及向從服務器發送保存在緩衝區裏面的寫命令來進行同步;
  • 而部分重同步則用於處理斷線後重複製狀況:當從服務器在斷線後從新鏈接主服務器時,若是條件容許,主服務器能夠將主從服務器鏈接斷開期間執行的寫命令發送給從服務器,從服務器只要接收並執行這些寫命令,就能夠將數據庫更新至主服務器當前所處的狀態。

完整同步機制,咱們很是好理解。好比從機首次鏈接到主機後,那麼就是完整同步了。此時主機把RDB文件打包發送給從機,從機同步便可。併發

若是在此期間,主機源源不斷的有新的命令,那麼所有放入到緩衝區中,而後進行部分同步,將緩衝區裏面的數據發送給從機便可。blog

部分同步還有一種使用狀況就是,網絡不穩定,斷了以後,從機和主機的同步。也是用到了部分同步機制。隊列

 

原理:

部分重同步功能由如下三個部分構成:同步

  • 主服務器的複製偏移量(replication offset)和從服務器的複製偏移量;
  • 主服務器的複製積壓緩衝區(replication backlog);
  • 服務器的運行ID(run ID)。

 

複製偏移量

執行復制的雙方——主服務器和從服務器會分別維護一個複製偏移量:io

  • 主服務器每次向從服務器傳播N個字節的數據時,就將本身的複製偏移量的值加上N;
  • 從服務器每次收到主服務器傳播來的N個字節的數據時,就將本身的複製偏移量的值加上N;

經過對比主從服務器的複製偏移量,程序能夠很容易地知道主從服務器是否處於一致狀態:ast

  • 若是主從服務器處於一致狀態,那麼主從服務器二者的偏移量老是相同的;
  • 相反,若是主從服務器二者的偏移量並不相同,那麼說明主從服務器並未處於一致狀態。

以下面的狀況:class

 

複製積壓緩衝區

若是發現偏移量不同,那麼就會須要用到緩衝區了。

複製積壓緩衝區是由主服務器維護的一個固定長度(fixed-size)先進先出(FIFO)隊列,默認大小爲1MB。

當主服務器進行命令傳播時,它不只會將寫命令發送給全部從服務器,還會將寫命令入隊到複製積壓緩衝區裏面,如圖所示。

 

當從服務器從新連上主服務器時,從服務器會經過PSYNC命令將本身的複製偏移量offset發送給主服務器,主服務器會根據這個複製偏移量來決定對從服務器執行何種同步操做:

  • 若是offset偏移量以後的數據(也便是偏移量offset+1開始的數據)仍然存在於複製積壓緩衝區裏面,那麼主服務器將對從服務器執行部分重同步操做;
  • 相反,若是offset偏移量以後的數據已經不存在於複製積壓緩衝區,那麼主服務器將對從服務器執行完整重同步操做。

 

服務器運行ID

除了複製偏移量和複製積壓緩衝區以外,實現部分重同步還須要用到服務器運行ID(run ID):

  • 每一個Redis服務器,不論主服務器仍是從服務,都會有本身的運行ID
  • 運行ID在服務器啓動時自動生成,由40個隨機的十六進制字符組成,例如53b9b28df8042fdc9ab5e3fcbbbabff1d5dce2b3;
相關文章
相關標籤/搜索