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