什麼是主從複製 Redis的主從複製機制是指可以讓從伺服器(slave)能精確複製主伺服器(master)的數據,如下圖所示: 或者 主從複製的方式和工作原理 工作方式: Redis主從複製主要有兩種模式:完整重同步(full resynchronization)和部分重同步(partial res ...
什麼是主從複製
Redis的主從複製機制是指可以讓從伺服器(slave)能精確複製主伺服器(master)的數據,如下圖所示:
或者
主從複製的方式和工作原理
工作方式:
Redis主從複製主要有兩種模式:完整重同步(full resynchronization)和部分重同步(partial resynchronization)
- 其中完整重同步用於處理初次複製情況:完整重同步的執行步驟和SYNC命令的執行步驟基本一樣,它們都是通過讓主伺服器創建併發送RDB文件,以及向從伺服器發送保存在緩衝區裡面的寫命令來進行同步;
- 而部分重同步則用於處理斷線後重覆制情況:當從伺服器在斷線後重新連接主伺服器時,如果條件允許,主伺服器可以將主從伺服器連接斷開期間執行的寫命令發送給從伺服器,從伺服器只要接收並執行這些寫命令,就可以將資料庫更新至主伺服器當前所處的狀態。
完整同步機制,我們非常好理解。比如從機首次連接到主機後,那麼就是完整同步了。此時主機把RDB文件打包發送給從機,從機同步即可。
如果在此期間,主機源源不斷的有新的命令,那麼全部放入到緩衝區中,然後進行部分同步,將緩衝區裡面的數據發送給從機即可。
部分同步還有一種使用情況就是,網路不穩定,斷了之後,從機和主機的同步。也是用到了部分同步機制。
原理:
部分重同步功能由以下三個部分構成:
- 主伺服器的複製偏移量(replication offset)和從伺服器的複製偏移量;
- 主伺服器的複製積壓緩衝區(replication backlog);
- 伺服器的運行ID(run ID)。
複製偏移量
執行複製的雙方——主伺服器和從伺服器會分別維護一個複製偏移量:
- 主伺服器每次向從伺服器傳播N個位元組的數據時,就將自己的複製偏移量的值加上N;
- 從伺服器每次收到主伺服器傳播來的N個位元組的數據時,就將自己的複製偏移量的值加上N;
通過對比主從伺服器的複製偏移量,程式可以很容易地知道主從伺服器是否處於一致狀態:
- 如果主從伺服器處於一致狀態,那麼主從伺服器兩者的偏移量總是相同的;
- 相反,如果主從伺服器兩者的偏移量並不相同,那麼說明主從伺服器並未處於一致狀態。
如下麵的情況:
複製積壓緩衝區
如果發現偏移量不一樣,那麼就會需要用到緩衝區了。
複製積壓緩衝區是由主伺服器維護的一個固定長度(fixed-size)先進先出(FIFO)隊列,預設大小為1MB。
當主伺服器進行命令傳播時,它不僅會將寫命令發送給所有從伺服器,還會將寫命令入隊到複製積壓緩衝區裡面,如圖所示。
當從伺服器重新連上主伺服器時,從伺服器會通過PSYNC命令將自己的複製偏移量offset發送給主伺服器,主伺服器會根據這個複製偏移量來決定對從伺服器執行何種同步操作:
- 如果offset偏移量之後的數據(也即是偏移量offset+1開始的數據)仍然存在於複製積壓緩衝區裡面,那麼主伺服器將對從伺服器執行部分重同步操作;
- 相反,如果offset偏移量之後的數據已經不存在於複製積壓緩衝區,那麼主伺服器將對從伺服器執行完整重同步操作。
伺服器運行ID
除了複製偏移量和複製積壓緩衝區之外,實現部分重同步還需要用到伺服器運行ID(run ID):
- 每個Redis伺服器,不論主伺服器還是從服務,都會有自己的運行ID;
- 運行ID在伺服器啟動時自動生成,由40個隨機的十六進位字元組成,例如53b9b28df8042fdc9ab5e3fcbbbabff1d5dce2b3;