系統長大有兩條路:把單機加大(scale up),或把機器變多(scale out)。前者簡單但有天花板,後者才是大規模的正解——代價是要處理分散式的複雜度。
🧠 Core Ideas
TIP
垂直擴展問「這台機器還能再壯一點嗎?」;水平擴展問「我能不能多擺幾台一起扛?」。單機再壯都有上限、且是單點故障;多台才同時買到擴展性與備援。
- 垂直擴展 (scale up):加 CPU / RAM / Disk。優點只有一個——簡單。
- 水平擴展 (scale out):加更多伺服器。大規模應用的理想解,因為它能同時提供備援與幾乎無上限的擴展。
⚖️ Tradeoffs
垂直擴展的兩個硬傷
- 有硬性上限:一台機器無法無限加 CPU 與記憶體。
- 沒有故障轉移與備援:那台機器一掛,整個服務跟著掛(單點故障)。
流量小時垂直擴展很划算;但當使用者數變大,這兩個限制就會逼你轉向水平擴展。
資料層的水平擴展 = 分片 (Sharding)
- 無狀態的 Web 層很容易水平擴展;難的是資料層。
- 資料庫的水平擴展就是 sharding:把大資料庫切成多個共享 schema、但各存一部分資料的 shard。
- 最關鍵的決定是 sharding key:要選一個能讓資料分佈平均的 key(如
user_id)。
即使強如 stackoverflow.com,在 2013 年每月上千萬不重複訪客時仍只靠一台主資料庫——垂直擴展能撐很久,但終究要走向分片。
分片帶來的三個新問題
- Resharding:資料成長或分佈不均使某個 shard 爆滿時,得更新分片函式並搬資料——這正是一致性雜湊要解的問題。
- 名人問題 (hotspot key):熱門資料全落在同一 shard,把它打爆;可能要為熱點單獨切 shard。
- 跨 shard join 變難:常用反正規化讓查詢能在單表內完成。
🔑 Takeaways
- 垂直擴展簡單但有天花板、且是單點故障;大規模靠水平擴展。
- 水平擴展的原則:Web 層保持無狀態、每一層都做備援、資料層靠分片。
- 分片不是免費的——resharding、hotspot、跨 shard join 都是要付的稅,選對 sharding key 是第一要務。
No notes yet — jot your takeaways or Q&A here.