免費試讀課程單元 · 系統設計面試(System Design Interview)

把伺服器和資料庫拆開

當你的新創公司大獲成功,那台包辦一切的伺服器卻撐不住了,會發生什麼事?

Wondering 課程《系統設計面試(System Design Interview)》的第 1 個課程單元

一台機器包辦一切

想像你的新創剛上線,所有東西都放在同一台伺服器上。

網頁應用程式、資料庫、快取,全部擠在這台機器裡。設定簡單,管理也方便。

單一伺服器裡的三個元件

注意三個元件全都裝在同一台機器的外框內,它們共用這台機器的全部資源。

這就是單一伺服器架構,幾乎每個產品都從這裡起步。

但當使用者暴增,這台機器還撐得住嗎?

這台機器做哪些事

在單一伺服器架構下,這台機器要處理整個流程。

一個請求的旅程
  • DNS 解析: 把網址轉成伺服器的位址。
  • HTTP 請求: 瀏覽器把請求送到伺服器。
  • 資料操作: 應用程式在同一台機器上讀寫資料庫。
  • 回傳結果: 伺服器把處理好的結果送回使用者。

使用者輸入網址後,先經過 DNS 解析,找到伺服器的位址。

接著瀏覽器送出 HTTP 請求,伺服器上的網頁應用程式接手處理。

需要資料時,應用程式在同一台機器上讀寫資料庫,再把結果回傳。

簡單,但有天花板

全部放在一起,好處很明顯:簡單。只有一台機器要部署、要照顧。

問題是,這台機器的能力有上限。運算和儲存都只能用它自己的資源。

網頁應用程式和資料庫搶同一份資源。流量一大,兩邊一起變慢。

這就是單機容量的極限。

成功為什麼反而變成危機?

第一步:資料庫獨立

第一個重大的擴展步驟,是把資料庫搬到自己的伺服器上。

原本的機器只跑網頁應用程式,負責處理請求。新的機器專門負責資料。

網頁伺服器需要資料時,就去向資料庫伺服器要。

職責拆開後,系統分成兩層:網頁層與資料層。

拆分前後
  • 單一伺服器
  • 資料庫分離

兩層各自擴展

拆開的最大好處是:兩層可以獨立擴展。

網頁層負責運算,處理大量請求。請求變多,就替網頁層加資源。

資料層負責儲存,管理資料。資料變多,就替資料層加資源。

網頁層與資料層
  • 網頁層
  • 資料層

不必為了其中一邊的需求,讓兩邊綁在一起升級。

何時該拆開?

回到開頭:新創大獲成功,伺服器撐不住了,該怎麼辦?

先確認:單機容量是不是已經不夠用?

第一個擴展決策
  • 使用者暴增
  • 單機容量夠用嗎?
  • 維持單一伺服器: 簡單好管理,暫時不必拆。
  • 分離資料庫: 把資料庫搬到自己的伺服器。
  • 兩層獨立擴展: 網頁層加運算,資料層加儲存。
  • 是
  • 否

如果是,把資料庫分離通常就是第一步。之後網頁層和資料層,就能依各自需求成長。

跟同事解釋時,一句話就夠:讓運算和儲存各住各的。

自我檢測

在單一伺服器架構中,網頁應用程式、資料庫和快取_____。

  • 全部跑在同一台機器上
  • 分別跑在不同的機器上

答案: 全部跑在同一台機器上

單一伺服器架構的特點就是所有元件(網頁應用程式、資料庫、快取)都跑在同一台機器上,因此設定簡單。

資料庫分離後,_____負責處理運算,_____負責儲存資料。

答案: 資料庫分離後,網頁層負責處理運算,資料層負責儲存資料。

分離後系統分成兩層:網頁層處理請求與運算,資料層負責儲存與管理資料。兩者分屬不同伺服器。

為什麼系統剛起步時,常把所有東西都放在同一台伺服器上?

  • 架構簡單,容易建置與管理
  • 能承受無限增長的流量
  • 資料庫和網頁程式必須共用硬體才能運作
  • 可以讓運算和儲存各自獨立擴展

答案: 架構簡單,容易建置與管理

初期流量小,單一伺服器最簡單:只要建置和管理一台機器。它並不是效能最好或最能承受大流量的做法。

繼續學習

這是《系統設計面試(System Design Interview)》共 35 個課程單元中的第 1 個。接下來:

  1. 負載平衡器與無狀態設計
  2. 快取與 CDN
  3. 2 的次方
  4. 延遲與儲存空間
  5. 釐清需求

免費開始這門課程

Wondering 把任何主題變成可以閱讀、觀看或收聽的短課程單元,並附有練習題和 AI 家教。