Redis之主從複製原理

若轉載請表明來源,感謝!

本文結構:

  1. 闡明 Redis主從複製的幾個要點(要點以本人覺得的重要程度進行排序,即重要點在前面,以便快速切入重點,加快理解)
  2. 複製功能的作用 
  3. 主從複製階段
  4. 詳細說明Redis主從複製原理及處理過程
  5. 斷線重連後的數據發送
  6. SYNC命令執行過程
  7. 流程圖

說明:重點---以紅色標示,次重點---以藍色標示,命令---以紫色標示。

複製(REPLICATION)

        Redis 支持簡單易用的主從複製(master-slave replication)功能,該功能可以讓從服務器(slave server)成爲主服務器(master server)的精確複製。

關於Redis主從複製的幾點說明:

  •  Redis使用異步複製。從Redis2.8開始,從服務器會以每秒一次的頻率向主服務器報告複製流(replicationstream)的處理進度。       
  • 複製功能不會阻塞主服務器:即使一個或多個從服務器正在進行初次同步,主服務器也可以繼續處理請求命令。
  • 複製功能也不會阻塞從服務器:只要在redis.conf配置文件中進行了相關的配置,即使從服務器正在進行初次同步,服務器也可以使用舊版本的數據集來處理查詢命令。但是,在從服務器刪除舊版數據集並載入新版本數據集的那段時間內,連接請求會被阻塞。
  • 一個主服務器可以有多個從服務器。
  • 除了主服務器可以具有從服務器,從服務器也可以同時具有從服務器,整個服務器架構可以形成一個樹狀結構。

複製功能作用

  • 單純用於數據冗餘(data redundancy)
  • 讀寫分離架構:讓多個從服務器處理只讀命令請求,來提升擴展性(scalability)
  • 主服務器免於持久化操作提高主服務器性能:關閉主服務器的持久化功能,然後由從服務器進行持久化操作。

主從複製階段

Redis的複製功能分爲 同步(sync)和 命令傳播(command propagate)兩個操作:

  1. 同步操作:作用於將從服務器的數據庫狀態更新至主服務器當前所處的數據庫狀態。
  2. 命令傳播:作用於在主服務器的數據庫狀態被修改,導致主從服務器的數據庫狀態出現不一致時,讓主從服務器的數據庫重新回到一致狀態。

主從複製原理及過程

同步

  1. 建立連接並向主服務器發送SYNC數據同步命令:無論是初次連接還是重新連接,當建立一個從服務器時,從服務器都將向主服務器發送一個SYNC命令(即同步命令)。
  2. 主服務器執行BGSAVE命令:接收到從服務器發送過來的SYNC命令後,主服務器開始執行BGSAVE命令(即進行rdb持久化過程,詳細rdb過程可見後續持久化過程介紹的文章),在保存操作執行期間,將所有新執行的命令都保存到一個緩衝區中。
  3. 主服務器執行完畢BGSAVE命令後,主服務器將執行得到的.rdb文件發送給從服務器,從服務器接收到這個.rdb文件後,將文件中的數據載入到內存中。
  4. 之後主服務器會將以Redis命令協議的格式(類似aof追加命令的方式),將寫命令緩存區中積累的所有內容都發送給從服務器,以保證主從數據的一致性。

命令傳播

       同步操作執行完畢後,主從服務器兩者的數據庫狀態達到了一致狀態,但每當主服務器執行完客戶端發送的寫命令時,主從服務器的數據庫狀態將不一致。

       爲了讓主從服務器再一次回到一致狀態,主服務器需要對從服務器執行命令傳播操作:主服務器將自己執行的寫命令,發送給從服務器執行,使主從服務器保持一致狀態。

斷線重連後的數據發送

  • 從服務器可以在主從服務器之間的連接斷開時,進行自動重連。
  • 在Redis2.8 版本之前,在命令傳播階段斷線重連後的從服務器總要執行一次完整重同步操作(full resynchronization),但2.8版本後,從服務器可以根據主服務器的情況來選擇執行完整重同步還是部分重同步(partial resynchronization)。
  • Redis2.8版本後,使用使用PSYNC命令代替SYNC進行同步操作。
  • PSYNC:具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)兩種模式,將在後文進行說明。
  1. 完整重同步:用於處理初次複製情況,與SYNC命令的執行步驟一致,即下一節的SYNC命令執行過程。
  2. 部分重同步:用於處理斷線後重複製情況,當從服務器斷線重連主服務器後,主服務器可以將從服務器斷開期間執行的寫命令發送給從服務器,保持主從數據一致。

 

SYNC命令執行過程

    每次執行SYNC命令,主從服務器需要執行一下動作:

  1. 從服務器向主服務器發送SYNC命令:向主服務器發送數據同步請求。
  2. 主服務器執行BGSAVE命令生成RDB文件:生成RDB文件會耗費主服務器大量的CPU、內存和磁盤I/O資源。
  3. RDB文件發送:主服務器需要將自己生成的RDB文件發送給從服務器,這個過程會耗費主從服務器大量的網絡資源(帶寬和流量),並對主服務器響應命令請求的時間產生影響。
  4. 從服務器載入RDB文件數據:接收到RDB文件的從服務器需要載入主服務器發送過來的RDB文件,並且在載入期間,從服務器會因爲阻塞而沒有辦法處理命令請求

 

流程圖

 

下一篇:舊版本主從複製的缺陷及新版的改進

 

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