6:多源複製的實現
阿新 • • 發佈:2020-10-10
- MySQL多源複製允許複製slave同時從多個源接收事務。可以使用多源複製將多個伺服器備份到一個伺服器,合併表碎片,並將來自多個伺服器的資料合併到一個伺服器。多源複製在應用事務時不實現任何衝突檢測或解決,如果需要,這些任務留給應用程式完成。
- 下面我們就來配置一個多源複製,多源複製這種拓撲至少需要兩個masters和slaves。
- 伺服器環境:192.168.1.2 (master1) 192.168.1.3 (new master) 192.168.1.4 (slave)
- 可以將多源複製拓撲中的masters配置為使用基於全域性事務識別符號(GTID)的複製或基於二進位制日誌位置的複製,有關如何使用基於GTID的複製配置master,請看https://blog.51cto.com/itzhoujun/2351367。 有關如何使用基於檔案位置的複製配置master,請參見https://blog.51cto.com/itzhoujun/2352688和https://blog.51cto.com/itzhoujun/2352693
- 本次我們基於GTID來做多源複製
- 登入slave
- 多源複製拓撲中的slaves需要基於TABLE的儲存庫。多源複製與基於FILE的儲存庫不相容。mysqld使用的儲存庫型別可以在啟動時配置,也可以動態配置。分別有以下兩種形式
- 要在啟動時配置複製slave使用的儲存庫型別,請使用以下選項啟動mysqld:
- --master-info-repository=TABLE --relay-log-info-repository=TABLE
- 要修改使用FILE儲存庫以使用TABLE儲存庫的現有複製slave,請通過執行以下命令動態轉換現有複製儲存庫:
- STOP SLAVE;
- SET GLOBAL master_info_repository = 'TABLE';
- SET GLOBAL relay_log_info_repository = 'TABLE';
- 要在啟動時配置複製slave使用的儲存庫型別,請使用以下選項啟動mysqld:
- 我們使用使用動態修改
- mysql> STOP SLAVE;
- Query OK, 0 rows affected (0.00 sec)
- mysql> SET GLOBAL master_info_repository = 'TABLE';
- Query OK, 0 rows affected (0.00 sec)
- mysql> SET GLOBAL relay_log_info_repository = 'TABLE';
- Query OK, 0 rows affected (0.00 sec)
- mysql> show variables like 'master_info_repository';
- +------------------------+-------+
- | Variable_name | Value |
- +------------------------+-------+
- | master_info_repository | TABLE |
- +------------------------+-------+
- 1 row in set (0.01 sec)
- mysql> show variables like 'relay_log_info_repository';
- +---------------------------+-------+
- | Variable_name | Value |
- +---------------------------+-------+
- | relay_log_info_repository | TABLE |
- +---------------------------+-------+
- 1 row in set (0.00 sec)
- #說明設定成功了
- 多源複製拓撲中的slaves需要基於TABLE的儲存庫。多源複製與基於FILE的儲存庫不相容。mysqld使用的儲存庫型別可以在啟動時配置,也可以動態配置。分別有以下兩種形式
- 登入new master(如果有多個new master就重複此步驟)
- 要啟用基於GTID的複製,必須在啟用GTID模式的情況下啟動每個伺服器,所以我們先修改配置檔案,修改後配置檔案再重啟mysql
- 引數的具體含義,我已經在https://blog.51cto.com/itzhoujun/2351367和https://blog.51cto.com/itzhoujun/2352693詳細介紹過了
- mysql> show variables like '%gtid%';
- +----------------------------------+-------------------------------------------+
- | Variable_name | Value |
- +----------------------------------+-------------------------------------------+
- | binlog_gtid_simple_recovery | ON |
- | enforce_gtid_consistency | ON |
- | gtid_executed_compression_period | 1000 |
- | gtid_mode | ON |
- | gtid_next | AUTOMATIC |
- | gtid_owned | |
- | gtid_purged | b45f359b-1747-11e9-bee2-00163e0ea0d9:1-15 |
- | session_track_gtids | OFF |
- +----------------------------------+-------------------------------------------+
- 8 rows in set (0.00 sec)
- #可以看到這個結果,就說明設定成功了
- 新增複製使用者(如果已經有複製使用者了,則跳過這一步)
- mysql> CREATE USER 'xiaoming'@'%' IDENTIFIED BY '[email protected]';
- Query OK, 0 rows affected (0.01 sec)
- mysql> GRANT REPLICATION SLAVE ON . TO 'xiaoming'@'%';
- Query OK, 0 rows affected (0.01 sec)
- 要啟用基於GTID的複製,必須在啟用GTID模式的情況下啟動每個伺服器,所以我們先修改配置檔案,修改後配置檔案再重啟mysql
- 登入slave
- 使用CHANGE MASTER TO語句通過使用FOR CHANNEL channel 子句將新master新增到通道
- mysql> CHANGE MASTER TO MASTER_HOST=‘192.168.1.4', MASTER_USER='xiaoming', MASTER_PASSWORD='[email protected]', MASTER_AUTO_POSITION = 1 FOR CHANNEL 'newmaster-1';
- Query OK, 0 rows affected, 2 warnings (0.03 sec)
- #如果有多個new master 則需要重複此步驟,根據實際情況更改主機名,埠和通道名稱。
- 啟動多源複製slaves
- 添加了要用作複製master的所有通道後,使用START SLAVE thread_types語句啟動複製。在slave上啟用多個通道後,您可以選擇啟動所有通道,也可以選擇要啟動的特定通道
- 要啟動所有當前配置的複製通道:
- START SLAVE thread_types;
- 要僅啟動命名通道,請使用FOR CHANNEL channel子句:
- START SLAVE thread_types FOR CHANNEL channel;
- 我們這裡直接START SLAVE,啟動所有的渠道
- 然後我們檢視一下狀態資訊
- mysql> select * from performance_schema.replication_applier_status;
- +--------------+---------------+-----------------+----------------------------+
- | CHANNEL_NAME | SERVICE_STATE | REMAINING_DELAY | COUNT_TRANSACTIONS_RETRIES |
- +--------------+---------------+-----------------+----------------------------+
- | | ON | NULL | 0 |
- | newmaster-1 | ON | NULL | 0 |
- +--------------+---------------+-----------------+----------------------------+
- 2 rows in set (0.00 sec)
- #表示有兩個渠道,那麼分別看下兩個渠道的資訊
- mysql> show slave status for channel '' \G
- #Slave_IO_Running和Slave_SQL_Running都是YES,那說明沒問題
- mysql> show slave status for channel 'newmaster-1' \G
- #Slave_IO_Running和Slave_SQL_Running都是YES,那說明沒問題
- 接下來就是分別在master和new master針對資料庫操作一些測試資料,然後看下slave是否同步過來了,如果同步過來了,那就沒啥問題
- 使用CHANGE MASTER TO語句通過使用FOR CHANNEL channel 子句將新master新增到通道
- 登入slave
參考資料:https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html
PREV: 5:使用GTID進行復制 https://blog.51cto.com/itzhoujun/2352693
NEXT: 7:基於語句複製和行復制的優點和缺點 https://blog.51cto.com/itzhoujun/2354045
轉載於:https://blog.51cto.com/itzhoujun/2353940