Mysql

MySQL - 實時生產中的主到主複製,無需停機

  • February 22, 2019

我想設置 2 節點主主複製。我知道此複製中的失敗點。它是一個大約 1.5TB 的龐大數據庫。重型 OLTP 正在進行。但它必須立即實施。

我有 2 台伺服器。

1. Master1 
2. Master2

最初我所做的是,

大師1:

  • 更改 my.cnf 以進行複制。
  • 使用 –master-data=2 獲取 mysqldump (用於獲取準確的 binlog 位置)

大師2:

  • 將轉儲恢復到 Master2。
  • 在 my.cnf 上進行更改。
  • 將複製設置為 Master1(更改 master=‘Master1’)。
  • 啟動奴隸。

現在 Master1 正在復製到 Master2。

然後我需要複製*Master2 to Master1*. 只需在 Master1 上獲取 binlog 位置並設置複製即可,但問題是 binog 文件和位置經常更改。因此,在 Master1 上執行更改主命令之前,binog 已更改。

我怎樣才能在不停機的情況下做到這一點。

我很高興你能夠 mysqldump 1.5TB 數據庫。你肯定有耐心。

現在進行現實檢查。您將需要一些停機時間來重新啟動和暫停。

不再需要mysqldump了。

步驟 01

你把這條線/etc/my.cnf放在 Master1 和 Master2 上嗎?

log-slave-updates

如果您不確定,請在 Master1 和 Master 上執行它

select @@global.log_slave_updates;

如果你在 Master1 和 Master2 上都得到這個

mysql> select @@global.log_slave_updates;
+----------------------------+
| @@global.log_slave_updates |
+----------------------------+
|                          1 |
+----------------------------+
1 row in set (0.00 sec)

然後轉到STEP 02

這需要在/etc/my.cnfMaster1 和 Master2 上。

如果沒有,請添加它並在 Master1 和 Master2 上重新啟動 mysqld。

步驟 02

您是否在 Master2 上啟用了二進制日誌記錄?

你應該在 Master1 中有這樣/etc/my.cnf一行

log-bin = ....

請確保 Master2 有它。

如果不確定是否有,請在 Master2 上登錄 MySQL 並執行

mysql> show binary logs;

如果它迴響

mysql> show binary logs;
ERROR 1381 (HY000): You are not using binary logging

然後,將該log-bin行添加到/etc/my.cnfMaster2 中並在 Master2 中重新啟動 mysql。

在Master1和 Master2 上啟用log-slave-updateslog-bin後,您就可以在另一個方向上設置複製了

步驟 03

在 Master2 上

STOP SLAVE;
FLUSH TABLES;
FLUSH LOGS;
SHOW BINARY LOGS;

步驟 04

在 Master1 上

CHANGE MASTER TO
   MASTER_HOST='IP or Hostname of Master2',
   MASTER_PORT=3306,
   MASTER_USER='...',
   MASTER_PASSWORD='...',
   MASTER_LOG_FILE='First Binary Log On Master2',
   MASTER_LOG_POS=4
;
SHOW SLAVE STATUS\G

步驟 05

測試從 Master1 到 Master2 的連接性

在 Master1 上

START SLAVE IO_THREAD;
DO SLEEP(10);
SHOW SLAVE STATUS\G

尋找Slave_IO_Running。它應該是“是”。

SHOW SLAVE STATUS\G3-5次。Relay_Log_Space應該增加。

步驟 06

從中繼日誌開始處理 SQL

在 Master1 上執行它

START SLAVE SQL_THREAD;
DO SLEEP(10);
SHOW SLAVE STATUS\G

尋找Slave_SQL_Running。它應該是“是”。

尋找Seconds_Behind_Master。它應該是 0。如果它大於 0,則繼續執行SHOW SLAVE STATUS\G直到Seconds_Behind_Master為 0。

引用自:https://dba.stackexchange.com/questions/169357