天天看點

Redis之主從複制原理本文結構:複制(REPLICATION)

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

本文結構:

  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檔案,并且在載入期間,從伺服器會因為阻塞而沒有辦法處理指令請求。

流程圖

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

繼續閱讀