您可以將複製用作橫向擴展解決方案;也就是說,您希望將資料庫查詢的負載分散到多個資料庫伺服器上,但有一些合理的限制。
由於複製是從一個來源分發到一個或多個副本,因此在讀取次數多且寫入/更新次數少的環境中,使用複製進行橫向擴展效果最佳。大多數網站都屬於此類別,使用者在瀏覽網站、閱讀文章、貼文或查看產品。更新僅在工作階段管理期間,或在購買或新增評論/訊息到論壇時發生。
在這種情況下,複製可讓您將讀取分散到副本上,同時仍讓您的 Web 伺服器在需要寫入時與來源進行通訊。您可以在圖 19.1「使用複製在橫向擴展期間改善效能」中看到此情境的範例複製配置。
如果您的程式碼中負責資料庫存取的部分已適當地抽象化/模組化,那麼將其轉換為在複寫設定下執行應該會非常順利且容易。請變更資料庫存取的實作方式,將所有寫入操作傳送到來源資料庫,並將讀取操作傳送到來源資料庫或複本資料庫。如果您的程式碼沒有這種程度的抽象化,設定複寫系統將提供您整理程式碼的機會和動機。首先,建立一個封裝程式庫或模組,實作以下函式:
safe_writer_connect()
safe_reader_connect()
safe_reader_statement()
safe_writer_statement()
每個函式名稱中的 safe_
表示該函式會處理所有錯誤狀況。您可以使用不同的函式名稱。重要的是要有一個統一的介面,用於讀取連線、寫入連線、執行讀取和執行寫入。
接著,將您的客戶端程式碼轉換為使用封裝程式庫。起初這可能是一個痛苦且令人畏懼的過程,但從長遠來看,它會帶來回報。所有使用剛才描述的方法的應用程式都能夠利用來源/複本配置,即使是涉及多個複本的配置也是如此。程式碼更容易維護,並且新增疑難排解選項也很容易。您只需要修改一兩個函式(例如,記錄每個語句花費的時間,或是哪些語句出現錯誤)。
如果您已經撰寫了大量程式碼,您可能會想透過編寫轉換腳本來自動化轉換任務。理想情況下,您的程式碼會使用一致的程式設計風格慣例。如果不是,那麼您最好還是重寫程式碼,或至少手動整理程式碼使其使用一致的風格。