MySQLはバージョン5.
今回はそんなマルチソースレプリケーションについて紹介します。
マルチソースレプリケーションの準備
統合するスレーブ側でマルチソースレプリケーションを有効にするためには、
スレーブ側が持つリレーログの情報は、mysql.に挿入されます。バージョン8.
続いて、
最後に、FOR CHANNEL チャネル名をつけて実施します。このCHANNELは各マスターとの通信するchannel名で、
mysql> CHANGE MASTER TO master_host='127.0.0.1',
-> master_port= 3306,
-> master_user='repl',
-> master_password='repl',
-> master_log_file='mysql-bin.000022',
-> master_log_pos=195
-> FOR CHANNEL 'mydatabase1';
Query OK, 0 rows affected, 2 warnings (0.28 sec)
mysql> CHANGE MASTER TO master_host='127.0.0.1',
-> master_port= 3308,
-> master_user='repl',
-> master_password='repl',
-> master_log_file='mysql-bin.000003',
-> master_log_pos=195
-> FOR CHANNEL 'mydatabase2';
Query OK, 0 rows affected, 2 warnings (0.28 sec)
mysql> CHANGE MASTER TO master_host='127.0.0.1',
-> master_port= 3310,
-> master_user='repl',
-> master_password='repl',
-> master_log_file='mysql-bin.000010',
-> master_log_pos=195
-> FOR CHANNEL 'mydatabase3';
Query OK, 0 rows affected, 2 warnings (0.28 sec)
マルチソースレプリケーションの運用
今、
では実際にmydatabase1にd1スキーマ、
slave> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.09 sec) mydatabase1> CREATE DATABASE d1; Query OK, 1 row affected (0.14 sec) mydatabase2> CREATE DATABASE d2; Query OK, 1 row affected (0.22 sec) slave> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | d1 | | d2 | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.13 sec)
マルチソースレプリケーションを介してslave側にはd1,d2スキーマが作成されました。もちろんmydatabase1にはd2スキーマはありませんし、
各チャネルのレプリケーションステータスを確認するには、SHOW SLAVE STATUS FOR CHANNEL channel名を実施します。
SLAVE> SHOW SLAVE STATUS FOR CHANNEL 'mydatabase1'\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000023
Read_Master_Log_Pos: 368
Relay_Log_File: mysql-relay-mydatabase1.000003
Relay_Log_Pos: 495
Relay_Master_Log_File: mysql-bin.000023
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(中略)
Channel_Name: mydatabase1
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
1 row in set (0.00 sec)
channel名を指定せず、SHOW SLAVE STATUSを実施すると、
各テーブルの項目に関してはMySQL公式ドキュメントのPerformance Schema Replication Tablesをご確認ください。
SLAVE> SHOW TABLES LIKE 'replication%'; +---------------------------------------------+ | Tables_in_performance_schema (replication%) | +---------------------------------------------+ | replication_applier_configuration | | replication_applier_filters | | replication_applier_global_filters | | replication_applier_status | | replication_applier_status_by_coordinator | | replication_applier_status_by_worker | | replication_connection_configuration | | replication_connection_status | | replication_group_member_stats | | replication_group_members | +---------------------------------------------+ 10 rows in set (0.00 sec) SLAVE> SELECT rcc.CHANNEL_NAME, HOST, PORT, USER, LAST_ERROR_NUMBER, LAST_ERROR_MESSAGE FROM replication_connection_configuration as rcc INNER JOIN replication_connection_status as rsc ON rcc.CHANNEL_NAME = rsc.CHANNEL_NAME; +--------------+-----------+------+------+-------------------+--------------------+ | CHANNEL_NAME | HOST | PORT | USER | LAST_ERROR_NUMBER | LAST_ERROR_MESSAGE | +--------------+-----------+------+------+-------------------+--------------------+ | mydatabase1 | 127.0.0.1 | 3306 | repl | 0 | | | mydatabase2 | 127.0.0.1 | 3308 | repl | 0 | | | mydatabase3 | 127.0.0.1 | 3310 | repl | 0 | | +--------------+-----------+------+------+-------------------+--------------------+ 3 rows in set (0.02 sec)
マルチソースレプリケーションを利用する際の注意点
マルチソースレプリケーションを利用する際には、
同じスキーマ、
たとえば、WHERE c1 >= 10という条件で更新したあとに同じスキーマのテーブルをmydatabase2でWHERE c1 >= 20というような条件で更新してしまうと、c1 >= 20のデータに差異が生まれてしまいます。
もし、
とはいえ、SQL_にしてバイナリログに吐かないようにして各マスター、CREATE USER IF NOT EXISTSを利用して重複エラーにならないようにしましょう。
まとめ
今回はマルチソースレプリケーションについて説明しました。データベースの再統合をする際などには非常に便利な機能ですが、