文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0MB
PDF (A4) - 40.1MB
Man Pages (TGZ) - 258.2KB
Man Pages (Zip) - 365.3KB
Info (Gzip) - 4.0MB
Info (Zip) - 4.0MB


MySQL 9.0 參考手冊  /  ...  /  使用複製進行橫向擴展

19.4.5 使用複製進行橫向擴展

您可以將複製作為橫向擴展解決方案使用;也就是說,在某些合理的限制內,您想要將資料庫查詢的負載分散到多個資料庫伺服器上。

由於複製是從一個來源分配到一個或多個副本,因此在您擁有大量讀取和少量寫入/更新的環境中,使用複製進行橫向擴展效果最好。大多數網站都屬於此類,使用者會瀏覽網站、閱讀文章、貼文或查看產品。只有在會話管理期間,或在購買或向論壇新增評論/訊息時才會發生更新。

在這種情況下,複製可讓您將讀取分散到副本上,同時仍讓您的 Web 伺服器在需要寫入時與來源進行通訊。您可以在 圖 19.1,「使用複製來改善橫向擴展期間的效能」 中看到此情境的範例複製版面配置。

圖 19.1 使用複製來改善橫向擴展期間的效能

Incoming requests from clients are directed to a load balancer, which distributes client data among a number of web clients. Writes made by web clients are directed to a single MySQL source server, and reads made by web clients are directed to one of three MySQL replica servers. Replication takes place from the MySQL source server to the three MySQL replica servers.

如果您的程式碼中負責資料庫存取的部分已適當地抽象化/模組化,那麼將其轉換為在複寫環境中執行應該會非常順利且容易。變更您的資料庫存取實作,將所有寫入傳送到來源,並將讀取傳送到來源或複本。如果您的程式碼沒有這種程度的抽象化,那麼設定複寫系統會給您機會和動機來清理它。首先,建立一個包裝函式庫或模組,實作下列函式:

  • safe_writer_connect()

  • safe_reader_connect()

  • safe_reader_statement()

  • safe_writer_statement()

每個函式名稱中的 safe_ 表示該函式會處理所有錯誤狀況。您可以使用不同的函式名稱。重要的是要有統一的介面來進行讀取連線、寫入連線、執行讀取和執行寫入。

然後轉換您的用戶端程式碼以使用該包裝函式庫。起初這可能是一個痛苦且令人害怕的過程,但從長遠來看是有回報的。所有使用剛才描述的方法的應用程式都能夠利用來源/複本配置,甚至涉及多個複本的配置。程式碼更容易維護,而且新增疑難排解選項非常簡單。您只需要修改一或兩個函式(例如,記錄每個陳述句所花費的時間,或在發出的陳述句中哪個給您錯誤)。

如果您已經撰寫了很多程式碼,您可能會想透過撰寫轉換腳本來自動化轉換任務。理想情況下,您的程式碼會使用一致的程式設計樣式慣例。如果沒有,那麼您最好還是重寫它,或者至少瀏覽並手動使其正規化,以使用一致的樣式。