別の AWS アカウントで Amazon RDS MySQL クロスリージョンレプリカを作成するにはどうすればよいですか?

最終更新日: 2022 年 5 月 24 日

ソース DB インスタンスとは別の AWS リージョンとアカウントで Amazon Relational Database Service (Amazon RDS) for MySQL レプリカを作成したいと考えています。これを行うにはどうすればよいですか?

簡単な説明

次のユースケースのために、Amazon RDS for MySQL レプリカを別の AWS リージョンに作成し、ソース DB インスタンスからアカウントを作成できます。

  • ディザスタリカバリの改善
  • グローバルなスケールアウト
  • AWS リージョンとアカウントの間での移行

注: Amazon RDS コンソールまたは AWS Command Line Interface (AWS CLI) を使用して、別の AWS アカウントでクロスリージョンレプリカを直接作成する方法はありません。この記事で概説するステップでは、異なる AWS アカウントまたはリージョンにある 2 つの RDS for MySQL インスタンス間で外部バイナリログベースのレプリケーションを設定します。

解決方法

別の AWS アカウントで Amazon RDS for MySQL クロスリージョンレプリカを作成するには、次のステップに従います。

注: アカウント A には、ソースリージョンのプライマリ RDS for MySQL インスタンスが含まれています。アカウント B には、ターゲットリージョンのレプリカ RDS for MySQL が含まれています。

1.    アカウント A (プライマリ Amazon RDS for MySQL インスタンス) で、バイナリログ記録がアクティブになっていることを確認します。デフォルトでは、自動バックアップとバイナリログ記録は RDS for MySQL でアクティブ化されます。バイナリログ記録は、自動バックアップがアクティブ化されるたびにアクティブ化されます。

注: バックアップ保持期間を [0] からゼロ以外の値に変更した場合、またはゼロ以外の値から [0] に変更すると、停止が発生します。

2.    次のコマンドを実行して、バイナリログの保持期間を更新します。

mysql>  CALL mysql.rds_set_configuration(name,value);

ヒント: 削除前に変更が適用されるのに十分な期間、レプリケーションソースのバイナリログファイルを保持する期間を選択します。Amazon RDS は、MySQL インスタンスにバイナリログファイルを最長 168 時間 (7 日間) 保持します。詳細については、mysql.rds_set_configuration を参照してください。

例えば、次の構文は、バイナリログの保持期間を 24 時間に設定します。

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

3.    アカウント A のプライマリインスタンスでレプリケーションユーザーを作成し、必要な許可を付与します。

mysql> CREATE USER 'repl_user'@'<domain_name>' IDENTIFIED BY '<password>';

4.    ステップ 3 で作成したユーザーに (必要な) REPLICATION CLIENT 権限と REPLICATION SLAVE 権限を付与します。

mysql> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO  'repl_user'@'<domain_name>';

5.    ターゲットリージョンを選択した状態で、プライマリアカウント内 (アカウント A) にクロスリージョンリードレプリカを作成します。

6.    アカウント A で作成したレプリカインスタンスにログインし、レプリカがプライマリ DB インスタンスに追いついたことを確認します。

mysql> SHOW SLAVE STAUS\G

注: Seconds_Behind_Master の値が「0」であることを確認してください。値が「0」の場合、レプリカはプライマリ DB インスタンスに追いついています。詳細については、リードレプリケーションのモニタリングを参照してください。

7.    リードレプリカがプライマリ DB インスタンスに追いついたら、ステップ 5 で作成したレプリカインスタンスでのレプリケーションを停止します。レプリケーションを停止するには、次の構文を使用します。

mysql> call mysql.rds_stop_replication();

8.    レプリカで SHOW SLAVE STATUS コマンドを実行し、Relay_Master_Log_File および Exec_Master_Log_Pos の出力値を記録します。Relay_Master_Log_File および Exec_Master_Log_Pos の値はバイナリログ座標であり、後の手順で外部レプリケーションを設定するために使用されます。

9.    アカウント A のレプリカインスタンスの DB スナップショットを作成します。

(オプション) あるいは、論理バックアップを生成するネイティブツール (mysqldump など) を使用して、アカウント A のレプリカインスタンスからデータをエクスポートできます。その後、ネイティブツールを使用して、アカウント B の新しく作成された同じバージョンの RDS for MySQL インスタンスにデータをインポートできます。このアプローチでは、2 つのアカウント間でスナップショットまたは AWS KMS キーをコピーして共有する必要はありません。このアプローチを使用する場合は、ステップ 12 に進み、両方のインスタンス間でネットワークアクセスとレプリケーションを設定します。このアプローチを使用する前に、アカウント B の Amazon RDS for MySQL インスタンスにデータをインポートする必要があります。

10.    アカウント B と DB スナップショットを共有します。

注: DB スナップショットが暗号化されている場合は、スナップショットの暗号化に使用される AWS KMS キーをターゲットアカウントと共有する必要があります。詳細については、「暗号化されたスナップショットの共有」を参照してください。

11.    アカウント B の DB スナップショットを復元します。

注: DB インスタンスは、共有されている暗号化されたスナップショットからは復元できません。代わりに、DB スナップショットのコピーを作成し、コピーしたバージョンから DB インスタンスを復元します。

12.    アカウント A (送信元アカウント) とアカウント B (送信先アカウント) の間にネットワークアクセスを設定します。ネットワークアクセスは、送信元アカウントと送信先アカウント間のトラフィックのフローを許可します。

13.    アカウント A のプライマリ DB インスタンスのインバウンドセキュリティグループルールを設定します。この設定は、アカウント B (送信先アカウント) で新しく作成された RDS for MySQL インスタンスからのトラフィックの、パブリックインターネット経由でのフローを許可します。セキュリティグループは、Amazon RDS for MySQL インスタンスを保護します。

プライベートレプリケーショントラフィックの場合、VPC ピアリング接続を作成し、2 つの AWS アカウント間で受け入れる必要があります

14.    アカウント B のターゲットインスタンスに外部レプリケーションを設定します。コマンド内で repl_user をパラメータとして使用します。注: CALL mysql.rds_set_external_master コマンドは、コマンド実行権限を持つ DB ユーザーによって実行される必要があります。

mysql> CALL mysql.rds_set_external_master (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  );

例:

mysql> CALL mysql.rds_set_external_master (mytestinnstance.us-east-1.rds.amazonaws.com', 3306, 'repl_user', '<password>', 'mysql-bin-changelog.000031', 107, 0);

mytestinnstance.us-east-1.rds.amazonaws.com: プライマリインスタンスエンドポイント 3306: プライマリインスタンスポート repl_user: ステップ 3 で作成されたレプリケーションユーザー名 password: ステップ 3 で作成されたユーザーパスワード mysql-bin-changelog.000031: ステップ 8 の出力からのバイナリログファイル名 107: ステップ 8 の出力からのバイナリログの位置

15.    アカウント B の復元されたインスタンスでレプリケーションを開始します。

CALL mysql.rds_start_replication;

この出力例を次に示します。

+-------------------------+
| Message                 |
+-------------------------+
| Slave running normally. |
+-------------------------+

16.    アカウント B インスタンスで次のコマンドを実行して、レプリケーションステータスを確認します。

mysql> show replica status \G

注: MySQL バージョン 8.0.22 以降では、SHOW SLAVE STATUS は非推奨となり、代わりに SHOW REPLICA STATUS が使用可能となります。詳細については、MySQL ウェブサイトの Checking replication status を参照してください。

17.    ステップ 5 で作成したレプリカ (中間インスタンスとして機能したもの) を削除します。このレプリカは、アカウント A のプライマリインスタンスにおける書き込みを中断することなく、バイナリログ座標を抽出するために使用されました。

クロスリージョンレプリケーションに関する考慮事項

クロスリージョンレプリケーションでは、次のアプローチを検討してください。

  • ソース DB インスタンスは、複数の AWS リージョンにクロスリージョンリードレプリカを持つことができます。詳細については、別の AWS リージョンでのリードレプリカの作成を参照してください。
  • ソースインスタンスとは異なる AWS リージョンにあるリードレプリカでは、ラグタイムが高くなることが予想されます。このラグタイムは、リージョン別データセンター間のネットワークチャネルが長いことによるものです。レプリケーションラグタイムの詳細については、リードレプリケーションのモニタリングを参照してください。
  • クロスリージョンレプリケーションのために転送されるデータについては、Amazon RDS データ転送料金が発生します。これらのデータ転送料金の詳細については、クロスリージョンレプリケーションのコストを参照してください。

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?