資料庫讀寫分離:網站變慢的救星

Published August 6, 2025 by 徐培鈞
架構

你的網站越來越受歡迎了!用戶從一開始的幾十人,現在已經破萬了。但是問題來了 – 網站開始變得很慢,用戶開始抱怨,你也開始緊張了。

別擔心,這是每個成功網站都會遇到的「成長的煩惱」。

今天我們來聊聊一個很實用的解決方案:「資料庫讀寫分離」。

聽起來很技術,但其實概念很簡單,就像把擁擠的單車道改成雙向道一樣!

為什麼資料庫會變成瓶頸?

用戶多了,資料庫就累了

想像一下你開了一家很受歡迎的餐廳:

  • 一開始只有幾桌客人,一個服務生就夠了
  • 生意越來越好,客人排隊到門外
  • 那個可憐的服務生忙到團團轉,客人等餐等到不耐煩

資料庫就像這個服務生,當用戶越來越多時:

  • 每秒要處理的請求變多
  • 回應時間越來越慢
  • 最後可能直接「罷工」(當機)

觀察一個重要現象

仔細分析用戶行為後,我們發現了一個有趣的現象:

大部分時候用戶都在「看」資料(讀取)

  • 瀏覽臉書動態
  • 查看商品資訊
  • 閱讀新聞文章
  • 搜尋資料

只有少部分時候在「改」資料(寫入)

  • 發新貼文
  • 下訂單
  • 留言評論
  • 更新個人資料

就像在圖書館裡,大部分人都在看書,只有少數人在辦借還書手續。

讀寫分離的聰明解決方案

核心概念:分工合作

既然讀取比寫入多很多,那就「術業有專攻」:

就像餐廳請了專門的服務生

  • 一個專門負責點餐和結帳(寫入)
  • 幾個專門負責送餐和收盤子(讀取)

資料庫也可以這樣分工

主資料庫(Master Database)

角色:老大哥

  • 專門工作:處理所有寫入操作
  • 新增資料(INSERT)
  • 修改資料(UPDATE)
  • 刪除資料(DELETE)
  • 特色:只有一台,確保資料的一致性
  • 比喻:就像銀行的總行,所有重要決策都在這裡做

為什麼只能有一台?

  • 如果有多台都能寫入,就像有多個老闆同時下指令
  • 容易造成資料不一致的問題
  • 比如:A說價格改成100元,B說改成200元,到底聽誰的?

從資料庫(Read Replica)

小知識:Replica 在英文中就是「複製品」的意思,就像影印店的影印本一樣!

角色:得力助手

  • 專門工作:處理所有讀取操作
  • 查詢資料(SELECT)
  • 顯示內容給用戶看
  • 特色:可以有很多台,分散讀取壓力
  • 資料來源:從主資料庫複製過來

為什麼可以有很多台?

  • 讀取不會改變資料,所以安全
  • 就像影印很多份報紙,每個人拿一份看
  • 看報紙的人越多,就多印幾份

生活化比喻:圖書館的運作方式

傳統方式:一個櫃台處理所有事情

想像一個圖書館只有一個服務櫃台:

  • 借書要排隊
  • 還書要排隊
  • 詢問書籍位置也要排隊
  • 辦理借書證還是要排隊

結果就是大排長龍,效率很差。

讀寫分離方式:專業分工

聰明的圖書館館長決定這樣安排:

借還書櫃台(主資料庫)

  • 只有一個,專門處理借還書
  • 負責更新借閱記錄
  • 確保每本書的狀態正確

資訊查詢台(從資料庫)

  • 可以有很多個
  • 專門回答「這本書在哪裡?」
  • 查詢書籍資訊、開放時間等
  • 每個查詢台都有完整的書籍目錄

這樣一來:

  • 想借書的人去借書櫃台
  • 想查資料的人去查詢台
  • 兩邊都不用排很久的隊

讀寫分離的具體運作流程

寫入操作流程

  1. 用戶發起寫入請求
  • 例如:發布新貼文
  1. 系統導向主資料庫
  • 應用程式識別這是寫入操作
  • 將請求發送給主資料庫
  1. 主資料庫處理並回應
  • 主資料庫執行寫入
  • 回傳成功或失敗的結果
  1. 資料同步到從資料庫
  • 主資料庫將變更複製到所有從資料庫
  • 這個過程可能需要幾秒鐘

讀取操作流程

  1. 用戶發起讀取請求
  • 例如:瀏覽貼文列表
  1. 系統導向從資料庫
  • 應用程式識別這是讀取操作
  • 將請求分散到其中一台從資料庫
  1. 從資料庫回應結果
  • 快速回傳查詢結果

讀寫分離的好處

效能大幅提升

  • 讀取速度變快:多台機器分攤讀取壓力
  • 寫入不受影響:主資料庫專心處理寫入
  • 整體回應時間縮短

系統更穩定

  • 單點故障風險降低:從資料庫壞了還有其他台
  • 負載分散:不會所有壓力都集中在一台機器

擴展性更好

  • 讀取壓力大?加幾台從資料庫
  • 彈性調整:根據實際使用情況增減機器

成本效益高

  • 硬體需求不同:讀取用普通機器就夠,寫入才需要高級機器
  • 資源利用率提升

需要注意的問題

資料同步延遲

問題:從資料庫的資料可能不是最新的

情境舉例

  • 你剛發了一篇貼文
  • 馬上重新整理頁面
  • 卻發現你的貼文還沒出現

解決方式

  • 重要的即時性操作改讀主資料庫
  • 設定合理的使用者期待
  • 優化同步速度

系統複雜度增加

挑戰

  • 需要判斷哪些操作讀主庫,哪些讀從庫
  • 監控多台資料庫的狀態
  • 處理同步失敗的情況

建議

  • 使用現成的中間件工具
  • 建立完善的監控機制
  • 制定應急處理流程

什麼時候需要讀寫分離?

適合的情況

  1. 讀取比寫入多很多
  • 新聞網站、部落格、社群媒體
  • 電商網站的商品瀏覽
  • 內容管理系統
  1. 用戶量大且持續成長
  • 單台資料庫開始感到吃力
  • 回應時間明顯變慢
  1. 對可用性要求高
  • 不能接受因資料庫問題導致服務中斷
  • 需要更好的災難恢復能力

暫時不需要的情況

  1. 寫入操作很頻繁
  • 即時交易系統
  • 高頻更新的應用
  1. 用戶量還不大
  • 單台資料庫就能輕鬆應付
  • 過早優化可能得不償失

總結

讀寫分離就像是給忙碌的餐廳請了專業的服務團隊:

  • 主資料庫是經驗豐富的主廚,專心處理重要的「料理」(寫入)
  • 從資料庫是親切的服務生們,專門負責「送餐」(讀取)

這個架構讓你的網站可以:

  • 處理更多用戶
  • 回應更快
  • 更加穩定

記住,技術方案沒有銀彈,讀寫分離也不例外。重要的是根據自己的實際情況,選擇合適的時機和方式來實施。

當你的網站開始因為用戶增加而變慢時,別慌張 – 這代表你成功了!而讀寫分離,就是幫你繼續成功下去的好夥伴。