從面試的角度來解釋 Redis 主從復制原理,按照“總-分-總”的結構,清晰地闡述其核心概念、工作流程和關鍵要點,這能體現出你不僅知道是什么,還理解為什么以及如何應對相關問題。
總覽:一句話定義
面試官您好,Redis 的主從復制是指:由一個 Redis 服務器(主節點 Master)將其數據自動同步到一個或多個 Redis 服務器(從節點 Slave)的過程。它的核心目的是實現數據的冗余備份、實現讀寫分離以提升讀性能、并構成高可用和故障恢復的基礎。
分步詳解:核心工作原理(重點闡述)
主從復制的過程主要可以分為三個階段:建立連接、數據同步、命令傳播。其中數據同步階段是重中之重。
第一階段:建立連接 (Handshake)
- 配置與連接:從節點通過執行
replicaof <masterip> <masterport>
命令(舊版本為slaveof
)或修改配置文件,保存主節點的地址和端口。 - 建立 Socket 連接:從節點會創建一個專門的 Socket 連接,用于與主節點進行通信。如果連接成功,從節點會為這個 Socket 關聯一個專門的文件事件處理器,負責處理后續的復制工作。
- 發送 PING 命令:連接建立后,從節點首先發送一個
PING
命令。目的是:- 檢查 Socket 連接是否可用。
- 檢查主節點是否能正常處理請求(如果主節點返回錯誤或超時無響應,從節點會斷開并重連)。
- 身份驗證:如果主節點配置了
requirepass
,從節點需要發送AUTH
命令并提供密碼進行驗證。 - 發送端口信息:身份驗證通過后,從節點會向主節點發送自己監聽的端口號(
REPLCONF listening-port <port>
),主節點會保存這個信息。
至此,通信鏈路已準備好,復制流程進入最關鍵的數據同步階段。
第二階段:數據同步 (Synchronization)
這是復制過程的核心,目的是讓從節點的數據集狀態與主節點達成一致。根據從節點是否是第一次同步,會分為全量復制和部分復制(增量復制)。
1. 全量復制 (Full Resynchronization) - 用于首次同步或偏移量不匹配時
- PSYNC 命令:從節點使用
PSYNC
命令向主節點發起同步請求。如果是第一次連接,從節點會發送PSYNC ? -1
。 - 主節點執行 BGSAVE:主節點收到全量同步請求后,會在后臺啟動一個
bgsave
子進程來生成當前數據的 RDB 快照文件。 - 復制緩沖區:在
bgsave
期間,主節點依然會處理新的寫命令。這些寫命令會被緩存在內存中的一個叫做復制緩沖區 (Replication Buffer) 的區域里。 - 發送 RDB 文件:
bgsave
完成后,主節點將 RDB 文件通過之前建立的連接發送給從節點。 - 從節點加載 RDB:從節點接收到 RDB 文件后,會清空自身舊數據,然后將其加載到內存中,使自身數據狀態達到主節點執行
bgsave
時的狀態。 - 發送緩沖區的寫命令:主節點將復制緩沖區中記錄的、在
bgsave
期間產生的所有寫命令發送給從節點。 - 從節點執行寫命令:從節點執行這些寫命令,最終使其數據庫狀態與主節點完全同步。
面試點睛:這里常問 “主節點在生成 RDB 期間的新寫命令是如何處理的?” 一定要答出復制緩沖區的概念。
2. 部分復制 (Partial Resynchronization) - 用于斷線重連后的增量同步
- 復制偏移量 (Replication Offset):主從節點都會維護一個復制偏移量。主節點每次向從節點傳播 N 個字節的數據,自己的偏移量就增加 N。從節點每次收到 N 個字節,偏移量也增加 N。
- 復制積壓緩沖區 (Replication Backlog):主節點內部維護了一個固定長度的、FIFO 的隊列(默認 1MB)。主節點在傳播命令時,不僅發給從節點,還會寫一份到復制積壓緩沖區。
- 斷線重連:當從節點重新連上主節點時,會通過
PSYNC
命令將自己的偏移量offset
發送給主節點。 - 偏移量比對:主節點檢查
offset
:- 如果
offset+1
之后的數據仍然存在于復制積壓緩沖區中,則主節點回復+CONTINUE
,表示可以進行部分復制。 - 隨后主節點將復制積壓緩沖區中從
offset+1
開始的所有數據發送給從節點。 - 從節點執行這些命令,即可將數據同步至主節點的最新狀態。
- 如果
面試點睛:這部分是高頻考點。一定要解釋清楚 PSYNC
、offset
和 backlog
這三個核心概念是如何協同工作來實現高效的部分復制的。
第三階段:命令傳播 (Command Propagation)
當同步完成后,主從節點的數據達到一致狀態。之后,主節點進入命令傳播階段。
- 每當主節點接收到新的寫命令時,除了自己執行,還會異步地將這個命令發送給所有從節點。
- 從節點執行相同的命令,從而最終保持數據的一致性。
總結與升華
在回答的最后,可以進行總結并引申出相關話題,展示知識的廣度:
- 最終一致性:Redis 主從復制是異步的,這意味著主從數據存在短暫延遲,是最終一致性模型。延遲取決于網絡、負載等因素。
- 核心面試點:
- 全量復制 vs 部分復制:理解它們的觸發條件和過程,尤其是
PSYNC
機制。 - 核心組件:復制偏移量 (offset)、復制積壓緩沖區 (backlog)、復制緩沖區 (buffer) 的作用和區別。
- 異步復制:理解其優勢和可能的數據丟失風險(主節點宕機且未同步到從節點的數據會丟失)。
- 全量復制 vs 部分復制:理解它們的觸發條件和過程,尤其是
- 引申話題:
- 讀寫分離:基于主從復制,可以將寫操作交給主節點,讀操作分散到從節點,提升系統吞吐量。
- 高可用基石:主從復制是 Redis Sentinel(哨兵)和 Redis Cluster(集群)實現故障自動轉移(Failover)的基礎。哨兵系統正是通過監控主從節點,并在主節點故障時自動將一個從節點提升為主節點來實現高可用。