文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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_ 表示該函式會處理所有錯誤狀況。您可以使用不同的函式名稱。重要的是要有一個統一的介面,用於讀取連線、寫入連線、執行讀取和執行寫入。

接著,將您的客戶端程式碼轉換為使用封裝程式庫。起初這可能是一個痛苦且令人畏懼的過程,但從長遠來看,它會帶來回報。所有使用剛才描述的方法的應用程式都能夠利用來源/複本配置,即使是涉及多個複本的配置也是如此。程式碼更容易維護,並且新增疑難排解選項也很容易。您只需要修改一兩個函式(例如,記錄每個語句花費的時間,或是哪些語句出現錯誤)。

如果您已經撰寫了大量程式碼,您可能會想透過編寫轉換腳本來自動化轉換任務。理想情況下,您的程式碼會使用一致的程式設計風格慣例。如果不是,那麼您最好還是重寫程式碼,或至少手動整理程式碼使其使用一致的風格。