有一次,我去參加一個大廠社招面試。

下午三點,會議室冷氣開得像北極,我穿着優衣庫薄外套,手裏捏着簡歷,感覺像剛被從 Redis 緩存裏淘汰出來的過期 key。

面試官很穩重,敲了兩下桌子,開口問了第一句:

“來,説説 Redis 集羣的主從複製模型,你在項目裏怎麼用的?”

那一瞬間,我的腦子像 Redis 重啓,先冷、再熱、最後進入高性能模式。

今天,就把我當時腦內風暴 + 實戰經驗 + 面試教訓,原封不動講給你聽。

先講故事:為什麼 Redis 要搞主從複製?

你想象一下。

你現在在做一個電商系統,首頁商品列表、購物車、秒殺庫存、用户會話,全壓在 Redis 上。白天沒事,晚上雙十一,流量像喪屍一樣往你服務器衝過來。

如果你只有一個 Redis:

  • 它一掛,全站卡成 PPT。
  • 它一慢,用户直接走人。
  • 它一被打爆,你老闆直接打爆你。

所以,Redis 的第一個目標:高可用 + 高併發 + 可擴展

這時候,主從複製模型就登場了。

Redis 主從複製模型,本質是什麼?

用人話講就是一句話:

一個 Redis 主節點(Master),多個 Redis 從節點(Slave),主負責寫,從負責讀,主把數據同步給從。

你可以把它想成一個“班主任 + 答題小組”模型。

  • 班主任:負責批改、發題(寫操作)
  • 小組成員:負責幫忙答題(讀操作)

所有作業先交給班主任,再由班主任分發給每個小組成員備份。這樣:

  • 一個節點掛了,還有別的節點頂上
  • 讀壓力被分攤
  • 系統整體性能上去

Redis 主從複製的核心目標

這個模型,主要解決三件事:

  • 讀寫分離:寫在 Master,讀在 Slave,降低單節點壓力
  • 數據備份:Slave 是一份實時備份,Master 宕機也能救命
  • 高可用基礎:為後續哨兵模式和 Redis Cluster 做鋪墊

主從複製是怎麼“複製”的?

面試官特別愛問:“你説主從複製沒問題,那 Redis 是怎麼同步數據的?”

這個時候,你要拆成三個階段講,面試官會瘋狂點頭。

第一階段:建立連接 & 發送同步請求

當你啓動一個 Slave,

  • 並配置:replicaof 192.168.1.10 6379
  • 或者舊版本是:slaveof 192.168.1.10 6379

它會主動去連 Master:

  1. 建立 TCP 連接
  2. 發送 PSYNC 命令,表示:我要同步你的數據

第二階段:全量複製(Full Sync)

如果是第一次連,或者斷線時間太久:

Master 會:

  1. fork 一個子進程
  2. 把當前數據庫數據生成 RDB 快照
  3. 把這個 RDB 文件發送給 Slave
  4. Slave 清空自己舊數據,然後加載這個新 RDB

這個過程叫:全量複製

這個過程時間比較長,但是是絕對完整的。你可以理解為:

班主任把一整本作業冊子,重新複印發給你。

第三階段:增量複製(Incremental Sync)

關鍵來了。

在生成 RDB 過程中,Master 並不會停,它還在處理新的寫請求。

這時怎麼辦?Redis 設計了一個東西:複製積壓緩衝區(Replication Backlog Buffer)

Master 會把新增的寫命令記錄下來,RDB 發送完後,再把這部分增量數據發送給 Slave。之後,進入實時狀態:Master 每寫一條命令,就立刻同步給所有 Slave。

這階段就叫:增量複製

斷線重連:部分複製機制

面試官還有一個很陰險的問題:

“如果 Slave 網絡抖動,斷了一會再連,Redis 會重新全量同步嗎?”

標準答案:

不一定,會優先嚐試部分重同步(Partial Resync)

Redis 會維護一個:

  • replication offset(複製偏移量)
  • backlog buffer

Slave 重連後,會告訴 Master 自己同步到哪裏了。如果 backlog 裏還保留着這部分數據:

  • 那就增量補上
  • 如果被覆蓋沒了,只能全量同步

所以在大流量場景中,backlog buffer 的大小很關鍵!

從讀寫分離角度看主從模型

你的項目中,最常見用法一定是:

  • 寫:走 Master
  • 讀:走 Slave

你可以這樣跟面試官説一句非常加分的話:

“我們線上通過中間件實現讀寫分離,寫流量走 Master,查詢流量走從節點,通過負載均衡分攤讀壓力,提升吞吐能力。”

特別加分。但你也要説風險:數據延遲問題

因為複製是異步的:

  • Master 寫成功了
  • Slave 可能還沒同步到
  • 這時候讀從節點,可能讀到舊數據

所以,對強一致性場景(比如金額、庫存):我們會強制走 Master

一個典型的主從複製架構

給你一個你可以在面試現場用嘴畫出來的場景:

3 分鐘講透 Redis 主從複製,社招面試穩了_Redis

你在面試現場配合手勢,這圖基本能在面試官腦中浮現。

主從複製的優點

總結給你幾個面試用點:

  1. 支持讀寫分離,提升吞吐量
  2. 提供數據備份能力
  3. 支撐高可用架構(哨兵/集羣基礎)
  4. 多從節點可橫向擴展讀能力

主從複製的侷限和問題

真正有經驗的人,不能只説優點,還要敢説問題。你可以説幾點缺陷:

1. 主節點單點問題

  • 如果只有主從複製,沒有哨兵:Master 掛了,系統就廢了。
  • 所以生產環境一般都會搭配:Redis Sentinel(哨兵模式),實現自動故障轉移。

2. 數據一致性問題

因為是異步複製:

  • 可能丟失少量數據
  • 強一致性無法保證

所以:

  • 金融類、強一致要求場景要謹慎
  • 有時要走雙寫或強制主節點

3. 網絡和性能壓力

主節點要給多個從節點同步數據:

  • 從節點越多
  • 主節點壓力越大

高併發場景下,有可能反而拖慢主節點。

面試實戰高分回答模板(你可以直接背)

給你一版我當年整理的“標準面試答案”,你可以直接口述出來:

Redis 的主從複製模型是通過一個 Master 節點和多個 Slave 節點來實現數據同步。寫請求統一走 Master 節點,由 Master 異步將數據複製到所有 Slave,從節點主要承擔讀請求,實現讀寫分離,提高系統的併發能力和可用性。

主從複製分為全量複製和增量複製,第一次連接為全量同步,後續通過 replication backlog 實現增量同步,並支持斷線後的部分重同步。同時,這種模型也存在數據延遲和主節點單點問題,因此在生產中通常會結合 Redis 哨兵或 Redis Cluster 架構一起使用。

這段話,我面過 5 家,一説出來,對方基本點頭。

真實經驗

最後跟你説個真實場景。

我之前在一個教育行業做直播課項目,晚上上萬人搶課,Redis QPS 直接飆爆。剛開始只有單機,後來直接:

  • 加主從
  • 做讀寫分離
  • 導入哨兵
  • 最後升級 Cluster

那天晚上系統沒炸,我站在公司天台吹風,覺得自己像救過一次服務器的命。那種爽,不是發工資能比的。

END

我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!