文章目錄
CAP原理
C - Consistent , 一致性
A - Availability , 可用性
P - Partition tolerance , 分區容忍性
Redis的最終一致性
複製概念
在Redis中,用戶可以通過執行SLAVEOF命令或者設置slaveof選項,讓一個服務器去複製(replication)另一個服務器。
快照同步
------>完整同步
增量同步
----->部分重同步
舊版複製功能實現
Redis的複製功能分爲
同步
和命令傳播
兩個操作:
同步
操作用於將從服務器的數據庫狀態更新值主服務器當前所處的數據庫狀態;命令傳播
操作則用於在主服務器的數據庫狀態被修改,導致主從服務器的數據庫狀態出現不一致的時,讓主從服務器的數據庫狀態重新回到一致狀態。
同步(也叫快照複製)
當客戶端向服務器發送
SLAVEOF
命令,要求服務器複製主從服務器時,從服務器首先需要執行同步操作,也就是,將從服務器的數據庫狀態更新之主服務器當前所處的數據庫狀態。
從服務器對主服務器的同步操作需要通過向主服務器發送SYNC
命令來完成,以下是SYNC
命令的執行步驟:
命令傳播(同步完成之後的更新保持一致)
爲了讓主從服務器再次回到一致的狀態,主服務器需要對從服務器執行
命令傳播
操作:主服務器會將自己執行的寫命令,也就是造成主從服務器不一致的那條命令,發送給從服務器執行,當從服務器執行了相同的謝明令之後,主從服務器將再次回到一致的狀態。
舊版複製功能的缺陷
新版複製功能的實現
爲了解決舊版複製功能在處理斷線重複制情況時的低效問題,Redis從2.8版本開始,使用
PSYNC
命令代替SYNC
命令來執行復制時的同步操作。
PSYNC
命令具有完整重同步(快照)
和部分重同步(增量)
兩種模式:
- 其中
完整重同步
用於處理初次複製情況:完整重同步的執行步驟和SYNC
命令執行步驟基本一致,它們都是通過主服務器創建併發送RDB文件,以及向從服務器發送保存在緩衝區裏面的寫命令執行同步部分重同步
則用於處理斷線後重複復制的情況,當從服務器在斷線後重新連接柱服務器時,如果條件允許,主服務器可以將主從服務器連接斷開期間執行的寫命令
發送給從服務器,從服務器只要接受並執行這些寫命令,就可以將數據庫更新之主服務器當前所處的狀態。
PSYNC命令的部分重同步模式解決了舊版複製功能在處理斷線後重復度複製時出現的低效情況
部分重同步的實現(增量同步)
部分重同步功能由以下三個部分構成:
- 主服務器的複製偏移量(replication offset)和從服務器的複製偏移量
- 主服務器的複製積壓緩衝區
- 服務器運行的ID
複製偏移量
主服務器每次向從服務器傳播N個字節的數據時,就將自己的複製偏移量的值加上N;從服務器每次收到主服務器傳播來的N個字節數據時,就將自己的複製偏移量的值加上N;
如果主從服務器處於一致狀態,那麼主從服務器兩者偏移量相同
複製積壓緩衝區
複製積壓緩衝區是由主服務器維護的一個
固定長度先進先出隊列,默認大小爲1MB
當主服務器進行命令傳播時,它不僅會將寫命令發送給所有從服務器,還會將寫命令入隊到複製積壓緩衝區裏面。
調整複製積壓緩衝區:根據
主服務器寫命令是否頻繁
服務器運行ID
除了複製偏移量和複製積壓緩衝區之外,實現部分重同步還需要用到服務器ID
PSYNC的實現
複製的實現(詳細版本)
通過
SLAVEOF
命令可以實現複製,下面介紹具體如何實現:
設置主服務器的地址和端口
slave of 127.0.0.1 6379
從服務器首先要做的是將客戶端給定的主服務器IP地址127.0.0.1以及端口號637保存
建立套接字
從服務器將根據命令所設置的IP地址和端口,創建連向主服務器的套接字連接