水平擴展 vs 垂直擴展 (Horizontal vs Vertical Scaling)

★★★★★Draft

FromSystem Design InterviewDDIA

📚 From the Books

水平擴展 vs 垂直擴展 (Horizontal vs Vertical Scaling)ConceptScaling

系統長大有兩條路:把單機加大(scale up),或把機器變多(scale out)。前者簡單但有天花板,後者才是大規模的正解——代價是要處理分散式的複雜度。

🧠 Core Ideas

TIP

垂直擴展問「這台機器還能再壯一點嗎?」;水平擴展問「我能不能多擺幾台一起扛?」。單機再壯都有上限、且是單點故障;多台才同時買到擴展性與備援。

⚖️ Tradeoffs

垂直擴展的兩個硬傷
  • 有硬性上限:一台機器無法無限加 CPU 與記憶體。
  • 沒有故障轉移與備援:那台機器一掛,整個服務跟著掛(單點故障)。

流量小時垂直擴展很划算;但當使用者數變大,這兩個限制就會逼你轉向水平擴展。

資料層的水平擴展 = 分片 (Sharding)
  • 無狀態的 Web 層很容易水平擴展;難的是資料層
  • 資料庫的水平擴展就是 sharding:把大資料庫切成多個共享 schema、但各存一部分資料的 shard。
  • 最關鍵的決定是 sharding key:要選一個能讓資料分佈平均的 key(如 user_id)。

即使強如 stackoverflow.com,在 2013 年每月上千萬不重複訪客時仍只靠一台主資料庫——垂直擴展能撐很久,但終究要走向分片。

分片帶來的三個新問題
  • Resharding:資料成長或分佈不均使某個 shard 爆滿時,得更新分片函式並搬資料——這正是一致性雜湊要解的問題。
  • 名人問題 (hotspot key):熱門資料全落在同一 shard,把它打爆;可能要為熱點單獨切 shard。
  • 跨 shard join 變難:常用反正規化讓查詢能在單表內完成。

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading

🔗 Dive Deeper