Redis複製(主從複製)

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地址和端口,創建連向主服務器的套接字連接

發送PING命令:測試連通性

身份驗證

發送端口信息

同步

在這裏插入圖片描述

命令傳播

在這裏插入圖片描述

心跳檢測

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章