創建主從關係時避免伺服器停機的方法?

創建主從關係時避免伺服器停機的方法?

我正在準備建立MySQL主從或主主關係。現在我有一個 MySQL 生產伺服器,當然我不希望在連接從屬伺服器時出現大量停機時間。

有沒有辦法讓我連接一個空的從站並讓它「緩慢」同步來自主站的數據,直到它們相同?

我注意到我可以在主伺服器上使用 mysqldump 進行事務轉儲,然後將其導入從伺服器,但是當從伺服器匯入轉儲時,將寫入大量新行,從伺服器將如何取得這些行?

我希望我在這裡遺漏了一些明顯的東西,但是廣泛的谷歌搜尋給出了這樣的建議,例如「因為這將導致未來的停機時間減少,所以現在的一些停機時間也許並不是一件壞事」。但我真的很想避免這種情況。

有關的MyISAM 的問題,但我使用InnoDB。

答案1

如果你使用 100% InnoDB 那麼你很幸運。您可以使用超備份對主資料庫進行完整備份,無需任何停機或任何表鎖定。這將是一致的快照式備份,與執行FLUSH TABLES WITH READ LOCK或選項時獲得的類型相同--master-data

XtraBackup 工具也會在備份目錄中放置一個額外的文件,其中包含在從屬裝置上啟動複製所需的 MASTER_LOG_POS 和 MASTER_LOG_FILE 資訊。

完成備份後,您需要--prepare在備份上執行 XtraBackup 選項,將其載入到從屬伺服器中,啟動從屬 MySQL 進程備份並告訴它所需的新 MASTER_LOG_POS 和 MASTER_LOG_FILE 值。

skip-slave-start在啟動從站之前,您將需要在 my.cnf 中。

另請記住,mysql預設情況下架構是 MyISAM(如果記憶體正常運行,則只能是 MyISAM),因此您仍然需要小心,不要在運行備份時對任何這些表進行任何更改。只要你遵守這個規則,主訊息仍然是正確的。

這通常是個好主意忽略mysqlmy.cnf 中的架構在從站上並且只建立具有 SELECT 權限的使用者。即使使用 Percona(以及先前的 Maatkit)為此提供的工具,不一致和不同步的從站也很難檢測到並且處理起來很痛苦。

編輯:

儘管您說您正在使用 InnoDB,但為了完整起見,如果您使用 MyISAM 表,還有另一種方法。如果您有具有快照功能的磁碟區管理器(例如ZFS或者左心室容量),您可以運行 a ,FLUSH TABLES WITH READ LOCK然後運行 a SHOW MASTER STATUS,創建快照並運行UNLOCK TABLES。停機時間應該相當短。作為比較,昨晚執行此操作來備份我們的一個資料庫的 cron 作業花了 6 秒來創建資料庫「關閉」的快照,並花了 27 分鐘將檔案從快照複製到備份伺服器。

答案2

不可能「從頭開始」啟動 mysql 複製。

--master-data=2相反,您可以在轉儲資料庫時使用帶有參數的 mysqldump - 即如下所示:

mysqldump --master-data=2 --all-databases --opt -p > myinitialdump.sql

此命令將在轉儲期間鎖定受影響資料庫中的所有表,並以註解掉的方式將複製座標寫入轉儲的標頭,如下所示:

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000018', MASTER_LOG_POS=106;

匯入完成後,您可以手動執行“change master to”命令,並新增主伺服器的主機名稱和身份驗證資料 - 複製將在轉儲點開始。

請記住,由於鎖定爭用,mysqldump 進程本身會導致「停機」 - 在整個轉儲期間,它會在所有表上放置讀鎖(類似於 FLUSH TABLES WITH READ LOCK 命令的操作)。因此,除非轉儲完成,否則寫入任何表的請求都不會回傳。此外,寫入請求可能還會阻止任何後續的讀取請求,除非您已指定低優先權更新在您的 MySQL 設定中或在轉儲之前發出 SET GLOBAL LOW_PRIORITY_UPDATES=1 。

相關內容