如何更新 MySQL 主-主複製設置的一側?
我在兩個 MySQL 伺服器之間配置了主-主(循環)複製,分別稱為 West 和 East。還有一個與每個 DB 介面的 Web 應用程序,也在它自己的 West 和 East 伺服器上,這樣 West Web 應用程序與 West 數據庫對話,East Web 應用程序與 East 數據庫對話。這在正常操作期間一切正常,但是當需要進行季度部署時就會出現問題。
在這些部署中,幾乎總是存在數據庫內容更新,並且經常存在數據庫結構更改(例如,添加表、向表中添加列等)。Web 應用程序也會同時更新,以便與數據庫結構保持同步。
到目前為止,我們無法在不中斷複製的情況下成功執行部署,從而導致非常混亂的情況和潛在的數據失去。我們計劃進行部署的方式如下:
- 關閉西側 Web 應用程序並將所有流量引導至東側
- 阻止東邊的奴隸
- 部署 West Side Web 應用程序 + 數據庫更新
- 重新打開 West side web app,關閉 East web app,將所有流量引導到更新後的 West side
- 啟動東側奴隸
- 部署到 East Side Web 應用程序 + 數據庫更新
- 恢復名義
問題似乎與第 3 步有關。當使用者在東側使用 Web 應用程序(從而修改數據庫)並且在西側進行部署(修改該數據庫)時,這通常會阻止複制工作,需要手動干預,數據複製,更改指向主日誌的指針等。有沒有更好的方法來做到這一點,以允許每個主節點單獨更新,而不會冒複製不同步的風險?我擔心我們的設置不正確和/或不可持續。
重要注意事項:
- Web 應用程序不能有停機時間
- 當雙方重新聯機時,必須保留使用者在定向到一側時可能進行的更新
另外,請注意,我不是 DBA,所以如果我未能包含有關配置設置的任何重要細節,我深表歉意。如果需要,我將嘗試盡快更新問題。
在我的公司,我們使用循環複製執行 MySQL。在部署應用程序或架構更改期間,我們不會停止複制。
在升級或某些配置更改期間我們必須重新啟動 MySQL 伺服器,並且當伺服器停止時複製自然會停止,但我們會立即將其恢復。
我們使用pt-online-schema-change來執行模式更改,而不會使應用程序失去對數據庫的訪問權限。在執行架構更改時,應用程序仍然可以執行讀取或寫入查詢。它並不完美;它需要在任務的開始和結束時短暫鎖定,並且您的表上不能有觸發器。此外,它在重構表時給數據庫伺服器增加了大量的查詢負載,這可能足以減慢應用程序的速度(這取決於應用程序載入的敏感程度)。但大多數情況下,它允許應用程序繼續工作而無需任何停機時間。
對於應用部署,我們在每個數據中心使用多個應用伺服器。部署知道如何以“滾動”方式停止應用程序實例,因此在部署期間始終有最少數量的應用程序實例在執行。因此,無需將流量轉移到對面的數據中心。
因為應用程序部署和架構部署都是非同步的,並且很難完全一起執行,所以必須仔細設計程式碼和架構更改,以便新舊程式碼版本都能與新舊架構版本一起使用。例如:
- 沒有程式碼可以使用
SELECT * ...
,或者INSERT INTO mytable VALUES(...)
因為如果架構更改添加或刪除列,它會破壞程式碼。- 某些模式部署必須分階段完成,例如添加一個新列並完成該部署,然後任何程式碼都可以引用新列。
- 禁止重命名列或表,因為這會導致先有雞還是先有蛋的問題。
借助冗餘的應用伺服器、線上模式更改工具以及對程式碼風格的一些適度限制,幾乎所有部署都可以在不停機的情況下完成。