故障分析 | Redis 主從複製風暴

作者:賁紹華

愛可生研發中心工程師,負責項目的需求與維護工作。其他身份:柯基鏟屎官。

本文來源:原創投稿

*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。


一、主從複製簡介

Redis 主從架構下,使用默認的異步複製模式來同步數據,其特點是低延遲和高性能。當 Redis master 下有多個 slave 節點,且 slave 節點無法進行部分重同步時, slave 會請求進行全量數據同步,此時 master 需要創建 RDB 快照快照發送給 slave ,從節點收到 RDB 快照開始解析與加載。

二、主從複製風暴

在複製重建的過程中,slave 節點加載 RDB 還未完成,卻因爲一些原因導致失敗了,slave 節點此時又會再次發起全量同步 RDB 的請求,循環往復。當多個 slave 節點同時循環請求時,導致了複製風暴的出現。

三、問題現象

3.1 CPU:

master 節點會異步生成 RDB 快照,數據量非常大時 fork 子進程非常耗時,同時 CPU 會飆升,且會影響業務正常響應。

3.2 磁盤:

從 Redis 2.8.18 版本開始,支持無磁盤複製,異步生成的RDB快照將在子進程中直接發送 RDB 快照至 slave 節點,多個 slave 節點共享同一份快照。所以磁盤 IO 並不會出現異常。

3.3 內存與網絡:

由於 RDB 是在內存中創建與發送,當複製風暴發起時,master 節點創建RDB快照後會向多個 slave 節點進行發送,可能使 master 節點內存與網絡帶寬消耗嚴重,造成主節點的延遲變大,極端情況會發生主從節點之間連接斷開,導致複製失敗。slave 節點在失敗重連後再次發起新一輪的全量複製請求,陷入惡性循環。

四、出現的場景

  • 單 
    master 節點(主機上只
    有一臺redis實例)當機器發生故障導致網絡中斷或重啓恢復時。
  • 多 m
    aster 節點在同一臺機
    器上,當機器發生故障導致網絡中斷或重啓恢復時。
  • 大量 slave 節點同時重啓恢復。
  • 複製緩衝區過小,緩衝區的上限是由 client-output-buffer-limit 配置項決定的,當 slave 還在恢復 RDB 快照時,master 節點持續產生數據,緩衝區如果被寫滿了,會導致 slave 節點連接斷開,再次發起重建複製請求。發起全量複製->複製緩衝區溢出->連接中斷->重連->發起全量複製->複製緩衝區溢出->連接中斷->重連...
  • 網絡長時間中斷導致的連接異常:跨機房、跨雲、DNS 解析異常等導致的主從節點之間連接丟失。主從節點判斷超時(觸發了repl-timeout),且丟失的數據過多,超過了複製積壓緩衝區所能存儲的範圍。
  • 數據量過大,生成 RDB 快照的 fork 子進程操作耗時過長,導致 slave 節點長時間收不到數據而觸發超時,此時 slave 節點會重連 master 節點,再次請求進行全量複製,再次超時,再次重連。

五、解決方案

5.1 降低存儲上限

單個Redis 實例的存儲數據的上限不要過大,過高的情況下會影響 RDB 落盤速度、向 slave 節點發送速度、slave 節點恢復速度。

5.2 複製緩衝區調整

master 節點 client-output-buffer-limit 配置項閾值增大(或調整爲不限制),repl_timeout 配置項閾值增大。使 slave 節點有足夠的時候恢復RDB快照並且不會被動斷開連接。

5.3 部署方式調整

單個主機節點內儘量不再部署多個 master 節點,防止主機因爲意外情況導致所有 slave 節點的全量同步請求發送至同一主機內。

5.4 架構調整

減少 slave 節點個數。或調整 slave 架構層級,在 Redis 4.0 版本之後,sub-slave 訂閱 slave 時將會收到與 master 一樣的複製數據流。


本文關鍵字:#Redis主從複製# #Redis複製風暴#


文章推薦:

OceanBase Proxy 無法連接 OBserver 集羣

技術分享 | TiUP工具 - TiDB集羣滾動升級核心流程解析

技術分享 | Xtrabackup 不備份 binlog 怎麼保證一致性?


關於SQLE

愛可生開源社區的 SQLE 是一款面向數據庫使用者和管理者,支持多場景審覈,支持標準化上線流程,原生支持 MySQL 審覈且數據庫類型可擴展的 SQL 審覈工具。

SQLE 獲取

類型 地址
版本庫 https://github.com/actiontech/sqle
文檔 https://actiontech.github.io/sqle-docs-cn/
發佈信息 https://github.com/actiontech/sqle/releases
數據審覈插件開發文檔 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html
更多關於 SQLE 的信息和交流,請加入官方QQ交流羣:637150065...

本文分享自微信公衆號 - 愛可生開源社區(ActiontechOSS)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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