什么是主從復制
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/32642.html
標籤:NoSQL
