回到部落格
2026年3月13日3 分鐘閱讀

系統設計02:資料庫擴展(Scaling Database)的兩大武器

當流量進入海量級別,如何用 Replication 與 Sharding 拯救資料庫瓶頸,並避開擴展過程中的關鍵陷阱。

《從 Web 到 AI-Native:一個新鮮人的系統設計五維度推演筆記》 系列學習筆記系統設計

前言

延續上一篇的基礎架構,當網站從 100 人成長到一億日活躍用戶時,單台資料庫幾乎一定會先撐不住。

這篇同樣透過五維度分析法,評估在海量讀寫請求下,如何用兩個關鍵策略拯救系統:

  • 複製(Replication)
  • 分片(Sharding)

這篇你可以帶走什麼

  • 何時該先做讀寫分離,何時才該進入分片
  • Sharding Key 選錯時,系統為何會被 Hotspot 打穿
  • 為什麼擴展資料庫後,反而可能把應用層拖垮

維度一、可直接觀察的事實:海量流量下資料庫先壞在哪

在流量暴增時,資料庫瓶頸可以先用封底估算抓出大方向。

以一億日活躍用戶為例,每人每天刷 10 次手機,約會產生:

  • 平均讀取流量:10K QPS
  • 尖峰讀取流量:50K QPS
  • 尖峰寫入流量:約 10K QPS

這已遠超單台傳統關聯式資料庫(極限約 5K QPS)的承載能力。

  • Replication 解決讀取瓶頸:透過 Master-Slave(主從)架構,讓 Master 專職寫入,資料非同步複製到多台 Slave,讀取請求由 Slave 分攤,達成讀寫分離。
  • Sharding 解決寫入瓶頸:依 Sharding Key 把資料拆到多台獨立資料庫,分攤單點寫入與儲存空間壓力。

重點:Replication 主要解決讀取瓶頸,Sharding 主要解決寫入與容量瓶頸。

維度二、條件檢查:什麼時候該 Replication,什麼時候才 Sharding?

一般情況下的最佳解

在系統擴展初期,建議策略是:

  • 讀取緩慢:優先增加 Slave 節點(Replication)
  • 寫入緩慢或空間不足:再導入 Sharding

分片鍵上,常見建議是先用 Item_ID(如貼文 ID)讓流量更平均。

邊界條件(Hotspot 效應)

若 Sharding Key 選錯(例如選 User_ID),遇到極端帳號(如超級名人)發文時,海量讀寫會瞬間集中到同一分片節點,形成 Hotspot。

結果通常是該節點先倒,原本的負載分攤設計直接失效。

重點:Sharding 不是切了就好,分片鍵的分佈品質才是生死點。

維度三、反證檢查:解了資料庫瓶頸,卻拖垮應用層

跳脫直覺,這套看起來很合理的擴展方式,仍有兩個高風險盲點:

  • Scatter and Gather 成本:當以 Item_ID 分片後,要查某個用戶的歷史貼文,後端必須向所有分片送查詢(Scatter),再把結果收回排序(Gather),應用層 CPU、記憶體與網路成本都會升高。
  • Rebalancing 風險:當分片節點從 4 台擴到 5 台,原本 Hash/取模規則會被打亂,可能引發大規模資料搬遷,正式環境風險極高。

維度四、不確定性與假設分析

影片中的封底估算,隱含前提是:流量大致均勻分佈。

真實世界通常不均勻。重大新聞、地震、名人事件等都可能瞬間帶來超過預估 10 倍以上的流量 Spike。

只靠資料庫層擴展,往往來不及對這種瞬間暴增做出反應。

維度五、最終結論與行動建議

破關路線圖(信心度 90%)

  • 初期擴展:先做 Replication(讀寫分離),用最低系統改動成本解決大部分讀取壓力
  • 非必要不 Sharding:分片是最後手段,先確認你已做完 SQL 優化、Index 與快取策略
  • 快取先行:在進入高成本分片前,務必先導入 Redis 等 Cache 機制

本分析涵蓋業界常見的資料庫擴展思維,但在超大型系統中,仍會進一步牽涉跨資料中心一致性設計。

脆弱點提示

如果系統對強一致性(Strong Consistency)有極端要求(例如銀行轉帳、金融交易),依賴非同步複製(Asynchronous Replication)的主從架構就可能出現短暫舊資料讀取,進而引發嚴重商業邏輯風險。


一句話總結

先用 Replication 解決讀取壓力,再把 Sharding 當作最後手段;在動刀分片之前,先把查詢、索引與快取做到位。