第十五章 複製
在Redis中,用戶可以通過執行SLAVEOF命令或者設置一個slaveof
選項讓一個服務器去複製另一個服務器,我們稱呼被複制的服務器爲主服務器,爲主從。
15.1 舊版複製功能的實現
Redis的複製功能分爲sync同步
和command propagate
命令傳播兩個操作。
同步:同步操作用於將從服務器的數據庫狀態更新至主服務器當前所處的數據庫狀態。
命令傳播操作:用於在主服務器的數據庫狀態被修改,導致主從服務器的數據庫狀態出現不一致時,讓主從服務器的數據庫重新回到一致狀態。
15.1.1 同步
1、發送sync
2、接受sync並開啓bgsvae命令,緩衝區記錄所有寫命令
3、bgsave完成後發送rdb文件,接受rdb後倒入並執行緩衝區命令。
15.1.2 命令傳播
15.2 舊版複製功能的缺陷
在Redis中,從服務器對主服務器的複製可以分爲以下幾種情況:
1、初次複製
2、斷線後複製(效率極低)
15.3 新版複製功能的實現
PSYNC命令代替SYNC命令,新命令有完整同步和部分重同步。
也就是在斷線重同步的時候用了部分重同步而不是全部重同步。
15.4 部分重同步的實現
主要由三個部分構成:
1、主服務器的複製偏移量和從服務器的複製偏移量(replication offset)
2、主服務器的複製積壓緩衝區
3、服務器的運行
15.4.1 複製偏移量
執行復制的雙方會維護一個膚質偏移量,主發送N個字節的數據,就加上N,從接受就接受N。
如果主從偏移量總是相同的,那麼久一樣,想法不同就是不一致。
此時就執行部分重同步。
主服務器又如何補償從服務器A在斷線期間丟失的那部分數據呢?
15.4.2 複製積壓緩衝區
複製積壓緩衝區是由主服務器維護的一個古典長度的先進先出隊列大小默認1MB。
會根據從服務器發送的idx也就是偏移量來決定是否執行部分衝同步,如果offset在就部分衝同步 否則就完全衝同步。
15.4.3 服務器運行ID
每個服務器都有自己的運行ID 由50個隨機十六進制字符組成。
15.5 PSYNC 命令的實現
完整過程設計runid、offset、積壓id
15.6 複製的實現
15.6.1 步驟1:設置主服務器地址和端口
在redisserver
裏面有masterhost
和masterport
屬性。
15.6.2 簡歷套接字連接
15.6.3 步驟3:發送PING命令
15.6.4 步驟4:身份驗證
如果服務器設置了masterauth
就進行身份驗證。
15.6.5 步驟5:發送端口信息
15.6.6 步驟6:同步
15.6.7 命令傳播
也就是將自己的命令發送到從服務器。
15.7 心跳檢測
命令傳播階段會以一定頻率檢測心跳,向主服務器發送命令。
15.7.1 檢測主服務器的網絡連接狀態
INFO replication 、 REPLICONF ACK
檢測主從網絡連接狀態、檢測命令丟失。
15.7.2 輔助實現min-slaves配置選項
15.7.3 檢測命令丟失
也就是檢測偏移量是否一樣,是否一致。
15.8 重點回顧
- redis的複製
- 完全複製和部分複製重同步
- 偏移量、runid、複製積壓緩衝區
- sync連接步驟
- 檢測主從之間的狀態
可以說redis的實現相當簡單易懂了,相比zk集羣的各種什麼算法和配置以及心跳檢測的各種情況。