天天看點

圖解Redis-主從複制架構

作者:搬長你好

Redis多機資料庫的實作離不開複制功能,在複制功能的基礎之上,結合《Redis常見部署架構》,實作高可用的多機資料庫解決方案。

主從複制

在Redis中,可以通過執行REPLICAOF指令或者設定replicaof選項(SLAVEOF指令在cluster模式下禁用),讓一個伺服器去複制另一個伺服器,我們稱該模式為主從複制模式。Redis主從複制模式主要由SYNC/PSYNC指令實作,主從複制模式是實作Redis可靠性架構的方式之一。SYNC/PSYNC指令主要差別在于PSYNC可以實作slave斷線重連後的增量複制,而SYNC是每次全量複制效率非常低,在Redis高版本中該指令已經棄用。

圖解Redis-主從複制架構

首次複制

圖解Redis-主從複制架構

斷線重連增量複制

部分重同步實作

部分重同步功能由一下三個部分構成:

  • 主伺服器複制偏移量和從伺服器複制偏移量
  • 主伺服器複制積壓緩沖區
  • 伺服器運作ID
圖解Redis-主從複制架構

複制涉及的資料結構

複制偏移量

主伺服器和從服務給自維護一個複制偏移量

圖解Redis-主從複制架構

複制偏移量

複制積壓緩沖區

複制積壓緩沖區是一個固定長度的FIFO隊列,當master開始複制時會進行雙寫,即同時寫入複制積壓緩沖區和slave

圖解Redis-主從複制架構

複制積壓緩沖區

複制流程

圖解Redis-主從複制架構

Master複制流程

  • 在slave通過REPLICAOF指令設定master的ip位址及端口位址。
  • slave通過設定的ip端口開始與master開始建立套接字連接配接。
  • slave成為master的用戶端之後,首先做的事情就是向master發送PING指令(為了保證master的可用性)。
  • slave收到master回複的PONG後需要進行身份認證,slave通過AUTH密碼到master認證(此步驟在認證關閉的情況下不需要做)。
  • 認證完成後slave通過REPLICAOF指令向master發送複制監聽端口号。
  • 上述準備工作完成之後,slave将向master發送PSYNC指令,開始執行同步操作,master執行流程見上圖。
  • 完成同步操作後,master将會進入指令傳播階段,slave将一直接受master發來的寫指令。

主從複制一緻性機制

主從複制時過期時間一緻性

1)master在執行寫指令傳播時對設計過期時間的指令做轉換操作:

    • 會将EXPIREP/EXPIRE/EXPIREAT 轉換為 PEXPIREAT 。
    • 會将SETEX/PSETEX 轉換為 SET 和 PEXPIREAT 兩個指令。
    • 會将SET [EX seconds][PX milliseconds] 轉換為 SET 和 PEXPIREAT 兩個指令。

2)官網在《Replication》一節介紹到關于slave複制過期key的政策,具體如下:

    • slave 不會讓 key 過期,而是等待 master 讓 key 過期。當一個 master 讓一個 key 到期(或由于 LRU 算法将之驅逐)時,它會合成一個 DEL 指令并傳輸到所有的 slave。
    • 但是,由于這是 master 驅動的 key 過期行為,master 無法及時提供 DEL 指令,是以有時候 slave 的記憶體中仍然可能存在在邏輯上已經過期的 key 。為了處理這個問題,slave 使用它的邏輯時鐘以報告隻有在不違反資料集的一緻性的讀取操作(從主機的新指令到達)中才存在 key。用這種方法,slave 避免報告邏輯過期的 key 仍然存在。在實際應用中,使用 slave 程式進行縮放的 HTML 碎片緩存,将避免傳回已經比期望的時間更早的資料項。
    • 在Lua腳本執行期間,不執行任何 key 過期操作。當一個Lua腳本運作時,從概念上講,master 中的時間是被當機的,這樣腳本運作的時候,一個給定的鍵要麼存在要麼不存在。這可以防止 key 在腳本中間過期,保證将相同的腳本發送到 slave ,進而在二者的資料集中産生相同的效果。

心跳檢測

  • slave預設會每秒一次的頻率向master發送REPLICAOF ACK <slave複制偏移量> 用于檢測與master網絡連接配接情況及指令是否存在丢失;
  • master則通過min-slaves配置可以判斷當指定延遲内的slave數量少于指定數量時,master将拒絕執行寫指令傳播。
  • 每次心跳master接收到slave發送的複制偏移量後,将會與自己的複制偏移量做對比,如果小于自身偏移量,則master将會在複制緩沖區中找到缺失的部分發送給slave(與部分重同步類似,兩者差別在于:部分重同步是發生在slave斷連後重連恢複複制時)

以上就是Redis對象系統介紹,如果各位還想了解更多,歡迎評論+關注[送心],Redis圖解系列專欄持續更新中。

繼續閱讀