Amazon Aurora MySQL のマルチソースレプリケーションを設定する
マルチソースレプリケーションを使用すると、Amazon Aurora MySQL DB クラスターを、複数のソース MySQL データベースからバイナリログイベントを受け取るレプリカとして設定できます。各ソースは、RDS for MySQL DB インスタンス、別の Aurora MySQL DB クラスター、または Amazon RDS の外部で実行されている MySQL データベースとすることができます。
マルチソースレプリケーションは、次のエンジンバージョンを実行している Aurora MySQL DB クラスターでサポートされています。
-
Aurora MySQL 8.4.8 以降
MySQL マルチソースレプリケーションの詳細については、MySQL ドキュメントの「MySQL マルチソースレプリケーション
注記
Aurora MySQL のマルチソースレプリケーションは、Aurora DB クラスターのライター (プライマリ) インスタンスをレプリケーションターゲットとして使用します。すべてのレプリケーションストアドプロシージャは、クラスターのライターインスタンスに接続している間に呼び出す必要があります。
マルチソースレプリケーションのユースケース
以下の場合は、Aurora MySQL でマルチソースレプリケーションを使用することを検討してください。
-
シャード統合 – 個別の DB インスタンスでホストされている複数のシャードのデータを、1 つの Aurora MySQL DB クラスターにマージまたは結合する必要があるアプリケーション。
-
統合レポート – Aurora の読み取りスケーリング機能を活用して、複数のソースから統合されたデータからレポートを生成する必要があるアプリケーション。
-
長期バックアップ – 複数の MySQL 互換 DB インスタンスに分散されるデータの統合された長期バックアップを作成する必要がある。
-
クロスエンジン移行 – 移行中に複数の RDS for MySQL インスタンスまたは外部 MySQL サーバーから 1 つの Aurora MySQL クラスターにデータを統合する。
-
マルチテナント集約 – コストの最適化と管理の簡素化のために、複数のシングルテナントデータベースをマルチテナント Aurora クラスターに統合する。
マルチソースレプリケーションの前提条件
Aurora MySQL DB クラスターでマルチソースレプリケーションを設定する前に、「Aurora MySQL のバイナリログレプリケーションの設定」で説明されているバイナリログレプリケーションのための標準前提条件を満たしてください。これには、各ソースでのバイナリログ記録の有効化、バイナリログの保持、レプリケーションユーザーの作成、各ソースのコピーまたはダンプの作成が含まれます。マルチソースレプリケーションの場合は、ソース DB インスタンスごとにこれらのステップを繰り返します。
標準前提条件に加えて、マルチソースレプリケーションに固有の以下の要件を満たしてください。
-
Aurora MySQL ターゲットクラスターのバージョンと設定を確認する
-
Aurora MySQL DB クラスターは、サポートされているエンジンバージョン (Aurora MySQL 8.4.8 以降) を実行している必要があります。
-
Aurora MySQL ライターインスタンスで自動コミットを有効にします。DB クラスターパラメータグループの
autocommitパラメータを1に設定します。
-
-
各ソースのネットワーク接続を設定する
ソース DB インスタンスごとに、Aurora MySQL ライターインスタンスが指定されたポートのソースに接続できることを確認します。オプションには以下が含まれます。
-
ソースとターゲットの両方が同じ VPC にある場合は、ソース DB インスタンスのセキュリティグループを設定して、Aurora MySQL クラスターのセキュリティグループからのポート 3306 (またはカスタムポート) でのインバウンド接続を許可します。
-
異なる VPC にある場合は、VPC ピアリングを設定するか、トランジットゲートウェイを使用します。詳細については、「VPC 内の DB クラスターに別の VPC 内の EC2 インスタンスからアクセスする」を参照してください。
-
ソースが AWS の外部にある場合は、(VPN 接続などを経由して) ネットワークルートが使用可能であることを確認します。
-
注記
マルチソースレプリケーションには複数のソースが含まれるため、各ソースへの接続を個別に検証する必要があります。セキュリティグループとルーティングがすべてのソースエンドポイントに同時に対応していることを確認します。
Aurora MySQL DB クラスターでマルチソースレプリケーションチャネルを設定する
Aurora MySQL でのマルチソースレプリケーションチャネルの設定は、シングルソースレプリケーションの設定と同様です。マルチソースレプリケーションでは、まずソースインスタンスでバイナリログ記録を有効にし、ソースから Aurora MySQL クラスターにデータをインポートします。次に、バイナリログ座標または GTID 自動配置を使用して各ソースからのレプリケーションを開始します。
重要
すべてのマルチソースレプリケーションストアドプロシージャは、Aurora MySQL DB クラスターのライターインスタンスに接続されている間に呼び出す必要があります。フェイルオーバーが発生した場合は、新しいライターインスタンスに再接続する必要があります。
ステップ 1: ソース DB インスタンスから Aurora MySQL クラスターにデータをインポートする
各ソース DB インスタンスで以下のステップを実行します。
-
ソース DB インスタンスの現在のバイナリログファイルと位置を確認します。
MySQL 8.4 の場合:
SHOW BINARY LOG STATUS;MySQL 8.0 以前の場合:
SHOW MASTER STATUS;出力例:
+----------------------------+----------+ | File | Position | +----------------------------+----------+ | mysql-bin-changelog.000031 | 107 | +----------------------------+----------+FileとPositionの値を記録します。これは、後のステップで必要になります。 -
mysqldumpを使用して、ソース DB インスタンスから Aurora MySQL クラスターにデータベースをコピーします。mysqldump --databasesdatabase_name\ --single-transaction \ --compress \ --order-by-primary \ -uRDS_user_name\ -p'RDS_password' \ --host=source-endpoint.region.rds.amazonaws.com| mysql \ --host=aurora-cluster-endpoint.cluster-xxxxxx.region.rds.amazonaws.com\ --port=3306 \ -uaurora_user_name\ -p'aurora_password'ヒント
大規模なデータベースの場合は、データ転送時間を短縮するために、AWS DMS を使用するか、スナップショットを作成して復元することを検討してください。
-
データのインポートが完了したら、以前に読み取り専用に設定していた場合は、ソース DB インスタンスで書き込みを再度有効にできます。
ステップ 2: ソース DB インスタンスから Aurora MySQL クラスターへのレプリケーションを開始する
ソース DB インスタンスごとに、Aurora MySQL DB クラスターのライターインスタンスに接続し、ストアドプロシージャを実行してチャネルでレプリケーションを設定および開始します。
オプション A: バイナリログファイルの位置の使用
CALL mysql.rds_set_external_source_for_channel( 'source-endpoint.region.rds.amazonaws.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 0, 'channel_1' ); CALL mysql.rds_start_replication_for_channel('channel_1');
オプション B: GTID 自動配置の使用
ソース DB インスタンスが GTID ベースのレプリケーションを使用している場合は、バイナリログ座標を指定する代わりに自動配置を使用できます。
CALL mysql.rds_set_external_source_with_auto_position_for_channel( 'source-endpoint.region.rds.amazonaws.com', 3306, 'repl_user', 'password', 0, 0, 'channel_1' ); CALL mysql.rds_start_replication_for_channel('channel_1');
注記
GTID 自動配置を使用する場合は、gtid_mode および enforce_gtid_consistency パラメータがすべてのソースインスタンスと Aurora MySQL クラスターで一貫して設定されていることを確認します。
ソース DB インスタンスごとにこれらのステップを繰り返し、それぞれに一意のチャネル名を指定します (例: channel_1、channel_2、channel_3)。
マルチソースレプリケーションでフィルターを使用する
レプリケーションフィルターを使用して、Aurora MySQL マルチソースレプリカにレプリケートするデータベースとテーブルを指定できます。レプリケーションフィルターの詳細については、「Aurora MySQL でのレプリケーションフィルターの設定」を参照してください。以下に、マルチソースレプリケーションで使用できる追加のチャネルレベルのフィルター機能について説明します。
マルチソースレプリケーションでは、次の 2 つのレベルでレプリケーションフィルターを設定できます。
-
グローバルフィルター – すべてのチャネルに適用されます。Aurora MySQL DB クラスターパラメータグループ (
replicate-do-db、replicate-ignore-dbなど) を使用して設定します。 -
チャネルレベルのフィルター – 特定のチャネルにのみ適用し、そのチャネルのグローバルフィルターを上書きします。
主な動作
-
チャネルレベルのフィルターを変更した後、レプリケーションを再起動する必要があります。
-
チャネル固有のフィルターが設定されていない場合、Aurora MySQL はそのチャネルにグローバルフィルターを適用します。
-
フィルターがグローバルに適用されるとともに、チャネルレベルでも適用されている場合、そのチャネルにはチャネルレベルのフィルターのみが適用されます。
マルチソースレプリケーションチャネルをモニタリングする
次の方法を使用して、Aurora MySQL マルチソースレプリカの個々のチャネルをモニタリングできます。
SHOW REPLICA STATUS を使用する
Aurora MySQL DB クラスターのライターインスタンスに接続し、以下を実行します。
-- View status for all channels SHOW REPLICA STATUS\G -- View status for a specific channel SHOW REPLICA STATUS FOR CHANNEL 'channel_1'\G
モニタリングする主要フィールド:
| フィールド | 説明 |
|---|---|
Replica_IO_Running |
チャネルの I/O スレッドが実行されているかどうか |
Replica_SQL_Running |
チャネルの SQL スレッドが実行されているかどうか |
Seconds_Behind_Source |
チャネルのレプリケーションの遅延 (秒単位) |
Last_IO_Error |
チャネルで最後に発生した I/O エラー |
Last_SQL_Error |
チャネルで最後に発生した SQL エラー |
Source_Log_File |
ソースから読み取り中の現在のバイナリログファイル |
Exec_Source_Log_Pos |
SQL スレッドが適用したバイナリログ内の位置 |
CloudWatch メトリクスを使用する
各レプリケーションチャネルの ReplicationChannelLag CloudWatch メトリクスをモニタリングします。このメトリクスは、チャネルごとのレプリケーションの遅延データを 60 秒の期間で提供し、15 日間利用できます。レプリケーションチャネルの遅延を特定するには、Aurora DB クラスターインスタンス識別子とレプリケーションチャネル名をディメンションとして使用します。遅延が特定のしきい値を超えたときに通知を受信するように CloudWatch アラームを設定できます。詳細については、「Amazon Aurora クラスターでのメトリクスのモニタリング」を参照してください。
マルチソースレプリケーションのストアドプロシージャを管理する
ストアドプロシージャを使用してマルチソースレプリケーションチャネルを設定および管理する方法の詳細については、「マルチソースレプリケーションの管理」を参照してください。
考慮事項とベストプラクティス
バイナリログ形式、並列ワーカー、拡張バイナリログなど、レプリケーションの最適化に関する全般的な推奨事項については、「Aurora MySQL でのバイナリログのレプリケーションの最適化」を参照してください。以下の考慮事項は、マルチソースレプリケーションに固有のものです。
リソースの計画
複数のレプリケーションチャネルを実行する場合、レプリカに割り当てられるレプリケーションスレッドの合計数は、(replica_parallel_workers + 1 コーディネータスレッド) × チャネル数になります。例えば、replica_parallel_workers のデフォルト値が 4 で、チャネル数が 10 の場合、Aurora MySQL は 50 個のレプリケーションスレッドを割り当てます。ソースの合計スループットとチャネル数に基づいて、より大きな DB インスタンスクラス (db.r6g.2xlarge 以上など) を使用することを検討してください。各チャネルは、同じ数の並列ワーカーを受け取ります。MySQL は、チャネルごとに異なる並列ワーカー数の設定をサポートしていません。
競合の回避
MySQL マルチソースレプリケーションでは、競合の検出や解決は行われません。異なるソースからの変更が競合していないことを確認する必要があります。一般的な戦略は次のとおりです。
-
各ソースは、異なるデータベースまたはテーブルのセットに書き込みます。
-
レプリケーションフィルター (
replicate-do-db) を使用して、各チャネルが対応するデータベースのみをレプリケートするようにします。 -
必要に応じて、
replicate-rewrite-dbオプションを使用して、スキーマ名をソースからレプリカの別の名前に再マッピングします。
マルチソースレプリカに直接接続するアプリケーションからの書き込みの競合を防ぐには、次のように、Aurora MySQL クラスターで読み取り専用モードを有効にします: CALL mysql.rds_set_read_only(1);
運用のベストプラクティス
-
一度に 1 つのチャネル – 一度に 1 つのチャネルで管理オペレーション (設定の変更、エラーのスキップ、レプリケーションの開始/停止など) を実行します。異なる接続からの複数のチャネルへの同時変更を避けます。
-
チャネルごとの遅延のモニタリング –
ReplicationChannelLagCloudWatch メトリクスを使用して、各チャネルのレプリケーションの遅延をモニタリングします。 -
ソースフェイルオーバー処理 – ソース DB インスタンスがフェイルオーバーした場合 (Amazon RDS マルチ AZ のフェイルオーバーなど)、レプリケーションチャネルが I/O エラーで停止することがあります。ソースが再び利用可能になった後:
-
mysql.rds_start_replication_for_channelを呼び出してレプリケーションを再開します。 -
エラー 1236 (ログファイルが見つからない) が発生した場合、
mysql.rds_next_source_log_for_channelを呼び出して次のバイナリログファイルに進みます。
-
-
Aurora ライターフェイルオーバー – Aurora MySQL ライターインスタンスがリーダーにフェイルオーバーした場合、レプリケーションチャネル設定はクラスターの共有ストレージに保持されます。フェイルオーバーが完了すると、レプリケーションスレッドは新しいライターインスタンスで自動的に再起動されます。
制限事項
以下の制限は、Aurora MySQL マルチソースレプリケーションに固有のものです。一般的な MySQL マルチソースレプリケーションの制限 (チャネルあたりの並列ワーカー設定など) については、MySQL ドキュメントの「MySQL マルチソースレプリケーション
-
マルチソースレプリケーションは、Aurora MySQL バージョン 8.4.8 以降でのみサポートされています。
-
Aurora MySQL では、マルチソースレプリカに最大 15 個のチャネル を設定できます。
トラブルシューティング
一般的なレプリケーションのトラブルシューティングについては、「 Amazon Aurora MySQL レプリケーションの問題」を参照してください。マルチソースレプリケーション固有のトラブルシューティングメモを次に示します。
スナップショット復元後にチャネル設定が復元されない
DB クラスタースナップショットには、マルチソースチャネル設定は含まれません。スナップショットから復元した後:
-
mysql.rds_set_external_source_for_channelまたはmysql.rds_set_external_source_with_auto_position_for_channelを使用して各チャネルを再設定します。 -
GTID 自動配置を使用する場合、レプリカは中断した場所から自動的に再開できます。
-
バイナリログファイルの位置を使用する場合は、ソースのバイナリログと復元されたクラスターで最後に適用されたトランザクションを比較して、現在の位置を判断します。
1 つ以上のチャネルでレプリケーションの遅延が増える
-
ライターインスタンスの CPU および I/O メトリクスを確認します。リソース使用率が高い場合は、インスタンスクラスをスケールアップします。
-
SQL スレッドのスループットを向上させるために
replica_parallel_workersを増やすことを検討してください。 -
SQL スレッドをブロックしている可能性のある、長時間実行中のトランザクションや DDL オペレーションがチャネルにないことを確認します。
-
レプリケーションで、大量のイベントが処理された後で破棄される原因となる可能性のある、フィルター設定の競合を確認します。
例: 3 つのソースでマルチソース設定を完了する
次の例は、Aurora MySQL DB クラスターを 3 つの RDS for MySQL ソースインスタンスのマルチソースレプリカとして設定する方法を示しています。
ステップ 1: 各ソースのバイナリログ位置を記録する
各ソースに接続し、バイナリログ座標を記録します。
-- On source 1 (orders-db.xxxxx.us-east-1.rds.amazonaws.com) SHOW BINARY LOG STATUS; -- Result: mysql-bin-changelog.000045, Position: 3892 -- On source 2 (inventory-db.xxxxx.us-east-1.rds.amazonaws.com) SHOW BINARY LOG STATUS; -- Result: mysql-bin-changelog.000012, Position: 1567 -- On source 3 (analytics-db.xxxxx.us-east-1.rds.amazonaws.com) SHOW BINARY LOG STATUS; -- Result: mysql-bin-changelog.000078, Position: 9421
ステップ 2: 各ソースからデータをインポートする
# Import from source 1 mysqldump --databases orders_db --single-transaction --compress \ -u admin -p --host=orders-db.xxxxx.us-east-1.rds.amazonaws.com | \ mysql --host=my-aurora-cluster.cluster-xxxxx.us-east-1.rds.amazonaws.com -u admin -p # Import from source 2 mysqldump --databases inventory_db --single-transaction --compress \ -u admin -p --host=inventory-db.xxxxx.us-east-1.rds.amazonaws.com | \ mysql --host=my-aurora-cluster.cluster-xxxxx.us-east-1.rds.amazonaws.com -u admin -p # Import from source 3 mysqldump --databases analytics_db --single-transaction --compress \ -u admin -p --host=analytics-db.xxxxx.us-east-1.rds.amazonaws.com | \ mysql --host=my-aurora-cluster.cluster-xxxxx.us-east-1.rds.amazonaws.com -u admin -p
ステップ 3: レプリケーションチャネルを設定して開始する
Aurora MySQL ライターインスタンスに接続します。
-- Configure channel for source 1 (orders) CALL mysql.rds_set_external_source_for_channel( 'orders-db.xxxxx.us-east-1.rds.amazonaws.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000045', 3892, 0, 'orders_channel' ); -- Configure channel for source 2 (inventory) CALL mysql.rds_set_external_source_for_channel( 'inventory-db.xxxxx.us-east-1.rds.amazonaws.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000012', 1567, 0, 'inventory_channel' ); -- Configure channel for source 3 (analytics) CALL mysql.rds_set_external_source_for_channel( 'analytics-db.xxxxx.us-east-1.rds.amazonaws.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000078', 9421, 0, 'analytics_channel' ); -- Start all channels CALL mysql.rds_start_replication_for_channel('orders_channel'); CALL mysql.rds_start_replication_for_channel('inventory_channel'); CALL mysql.rds_start_replication_for_channel('analytics_channel');
ステップ 4: レプリケーションステータスを確認する
SHOW REPLICA STATUS\G
チャネルごとに以下を確認します。
-
Replica_IO_Running: Yes -
Replica_SQL_Running: Yes -
Seconds_Behind_Source: 0(または低い値)
関連リソース
-
MySQL マルチソースレプリケーション
– MySQL ドキュメント -
Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション) – Aurora ユーザーガイド
-
Aurora MySQL でのバイナリログのレプリケーションの最適化 – Aurora ユーザーガイド
-
Aurora MySQL でのレプリケーションフィルターの設定 – Aurora ユーザーガイド
-
GTID ベースレプリケーションを使用する – Aurora ユーザーガイド