Amazon Web Services ブログ
Amazon RDS for MySQL および MariaDB に MariaDB MaxScale を使用して Binlog Server を設定する方法
Amazon RDS for MySQL と Amazon RDS for MariaDB の主要機能の 1 つが リードレプリカ を作成する機能です。AWS マネジメントコンソールまたは AWS CLI を使用して、1 つのマスターデータベースインスタンスについて、最大 5 つのレプリカを簡単に作成できます。Amazon RDS は、マスターのバックアップを作成し、バックアップをレプリカとしてリストアし、マスターとレプリカへのレプリケーションチャネルを確立する、といった作業すべてを処理します。Amazon RDS のレプリケーションを完全に自動化した処理は、マネージドレプリケーションと呼ばれます。
非標準のレプリケーショントポロジを求めている場合は、Binlog Server を使用できます。たとえば、レプリカが 5 つ以上必要な場合や、下流のアプリケーションにレプリケーションログレコードを転送する場合です。Binlog Server はレプリカとは違い、マスターのログレコードを使用せず、マスターと 1 つ以上のサブスクライバーの間にキャッシングレイヤーを提供します。今回の記事では、このアプローチを使用した場合の利点 (といくつかの制限) について説明します。MariaDB MaxScale と ノンマネージドレプリケーション を使用して、Amazon RDS for MySQL および MariaDB に Binglog Server をセットアップする作業を紹介します。
Amazon RDS for MySQL および MariaDB のマネージドレプリケーション
Amazon RDS のマネージドレプリケーションは、必ずバックアップが終了してから、マスターに適用される次のトランザクションを開始しますので、セットアップ中のデータのロスはありません。Amazon RDS はレプリケーションを継続的にモニターして調整を行います。たとえば、不正なトランザクションによってレプリケーションが中断した場合は、マスターまたはレプリカが機能停止してから、レプリケーションを適切に再開します (つまりマスターの自衛策)。
Amazon RDS for MySQL および MariaDB のノンマネージドレプリケーション
マネージドレプリケーションは、コンソールと Amazon RDS ウェブサービス API で提供されますが、ノンマネージドレプリケーションは、一連のストアドプロシージャで提供されます。この中には以下のものが含まれています。
- rds_set_external_master – Amazon RDS for MySQL または MariaDB のインスタンスからマスターへのカスタムレプリケーション設定を行います。このマスターは Amazon RDS インスタンスあるいは外部の MySQL互換インスタンス (たとえば、Amazon EC2 で稼働している MySQL インスタンス) の可能性があります。このプロシージャは、MySQL のネイティブ CHANGE MASTER TO コマンドのラッパーと考えられます。
- rds_set_external_master_gtid – ファイルベースの座標ではなく、グローバルトランザクション識別子 (GTID) ベースの座標を使用して、カスタムレプリケーションを設定する Amazon RDS for MariaDB のみのプロシージャ。
- rds_reset_external_master – 前に mysql.rds_set_external_master で設定したカスタムレプリケーション設定を削除する。このプロシージャは、MySQL のネイティブ RESET SLAVE コマンドのラッパーと考えられます。
- rds_start_replication – カスタムレプリケーションの設定完了後またはレプリケーション停止後に、レプリケーションを開始する。このプロシージャは、MySQL のネイティブ START SLAVE コマンドのラッパーと考えられます。
- rds_stop_replication – マネージドまたはノンマネージドのいずれかのレプリケーションを停止します。このプロシージャは、MySQL のネイティブ STOP SLAVE コマンドのラッパーと考えられます。
Binlog Server の概要
MySQL および MariaDB のユーザーの中には、MariaDB MaxScale などのプロキシサーバーを使用して、自動での読み込みと書き込みの分割、スキーマベースシャーディング、変更データキャプチャなどの機能をうまく活用するユーザーもいます。提供されている別のユニークな機能としては、マスターとレプリカの中間のバイナリログキャッシュレイヤーの役割を果たす Binlog Server を作る機能があります。マスターは Binlog Server で稼働しているプロキシにバイナリログを送信し、次にレプリカがそのプロキシのバイナリログを読み込みます。
このオプションにはさまざまな利点があります。
- バイナリログのレプリカへの送信には、プロキシとの通信が必要なだけなので、マスターの負荷が少なくなります。プロキシは順番にレプリカに送信します。
- プロキシには、もともとマスターにあったバイナリログと全く同じものがあります。これらのログは、マスターやレプリカに影響することなく保存して分析できます。
- Binglog Server プロキシによって、マスターとレプリカの依存関係が取り除かれるため、マスターのフェイルオーバーと別のマスターへの移動が簡単に自動化できます。
Booking.com の Jean-François Gagné は、Binlog Server の利点と、MaxScale を使用して、それをオンプレミス環境に設定する方法をさまざまなブログに投稿しています。
Amazon RDS に Binglog Server を設定する
MariaDB MaxScale と Amazon RDS ノンマネージドレプリケーションを使用して、Amazon RDS に Binglog Server を設定できます。Amazon RDS に一定の制限を加えると、オンプレミス環境と比べて Binlog Server の使用には制約があります。それでも、Amazon RDS for MySQL と Amazon RDS for MariaDB の両方にベーシックな設定をすることは可能です。
最初に、マスターとして使用する RDS インスタンスが必要となります。この設定では、まだレプリカがなく、マスターが新たに作成中であると仮定します。まず、ノンマネージドレプリケーションをサポートするバージョンを使用して、Amazon RDS for MySQL または MariaDB のインスタンスを作成します。これはメジャーバージョン 5.6 以降の Amazon RDS for MySQL インスタンス または Amazon RDS for MariaDB の任意のバージョンです。可能なら、最初はバックアップ保持有効のインスタンスは作成しないでください。その理由は、後にそのインスタンスが生成した最初のバイナリログが、Amazon RDS オートメーションによって自動的に削除されないということを確実にするためです。
試験設定では、jaime-binlog-server-master という名前の米国西部 (オレゴン) リージョンの MySQL 5.7.21 インスタンスに RDS を作成しました (デフォルトポート3306)。また、パラメータの変更が必要になる場合に備えて、自分のインスタンスに jaime-binlog-server-pg という名前のカスタムパラメータグループを作成しました。
binlog の保持の設定
RDS インスタンスを作成してから、SQL クライアントを使用した次のコマンドを実行することで、ホストのバイナリログの保持期間を延長することが可能になります。
このコマンドによって、バイナリログはローテーション後 24 時間、ホストに保持されることが確実になります。このコマンドを実行しなければ、ローテーション後約 5 分で、Amazon RDS オートメーションによってログはホストから削除されます。このコマンドを実行すると、AWS CLI またはコンソールを使用することで RDS インスタンスの バックアップの保持を有効にする ことができます。バックアップの保持期間を有効にすると、バイナリログも可能になります。保持期間を延長したため、生成されたバイナリログは、延長した期間ホストに保持されます。これは後に、最初に生成されたログから、Binlog Server がログのダウンロードを開始するために必要です。
Binlog Server の作成
最初に Amazon EC2 インスタンスをセットアップすることで、Binlog Server を作成します。このインスタンスは、最初に作成した Amazon RDS マスターインスタンスにアクセスできます。これは EC2 インスタンスを、RDS インスタンスと同じ Virtual Private Cloud (VPC) に作成するということになります。または、RDS インスタンスと関連するセキュリティグループに CIDR IP 範囲を許可することもでき、これには EC2 インスタンスの IP アドレスが含まれています。
EC2 インスタンスに使用する Amazon Machine Image (AMI) は、ユーザーの選択に任されます。ただし、MaxScale ソフトウェアのインストールは、使用される Linux ディストリビューションによって異なります。試験設定では、Red Hat Enterprise Linux (RHEL) 7.4 – ami-223f945a を選択しました。
RHEL 7 ベースにして EC2 インスタンスを作成すると、MariaDB Package repository を使用して、MariaDB クライアントツールと共に、MaxScale を簡単にインストールできます。
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
yum install maxscale
yum install MariaDB-server
本記事の執筆時点では、MaxScale の最新バージョンは、バージョン 2.2.5 です。
MaxScale ユーザーの作成
MariaDB MaxScale には、MySQL インスタンスに接続して、そのインスタンスの他のユーザーやアーティファクトの詳細を調べるコマンドを実行できる特殊なユーザーが必要です。これは通常の Amazon RDS マスターまたは MaxScale だけの特殊なユーザーです。
試験設定では、EC2 ユーザーのホスト名と関連付けて maxscale ユーザーを作成し、MaxScale に必要な適切な権限を付与する一連のコマンドを実行しました。
さらに、MaxScale はユーザーとしてマスターに接続し、バイナリログをダウンロードするため、 REPLICATION SLAVE 権限を持つユーザーが必要です。通常、Amazon RDS マスターユーザーがこの権限を持っています。しかし万が一の場合には、admin という名前のマスターユーザーに明示的に権限を付与するために、次のコマンドを実行できます。
maxscale.cnf の設定
MaxScale では、通常 /etc/maxscale.cnf
という名前の設定ファイルをコピーします。このファイルには、MaxScale で実行するサービスの種類とサービス固有のパラメータが定義されます。Binlog Server テンプレート設定ファイルは、この設定に含まれています。MaxScale を設定して Binlog Server として実行するには、テンプレートファイルを /etc/maxscale.cnf
としてコピーします。
次にこのファイルを編集して、次のように変更します。
user=repl
をuser=maxscale
にpasswd=slavepass
をpasswd=F7XfBfJl
に (maxscale
の user password に選択されたものであれば何でも) 変更します。version_string=5.6.15-log
をversion_string=5.7.21-log
に変更します。バージョンを表わす文字列は、MySQL または MariaDB の Amazon RDS のバージョンによって決まります。今回の場合、RDS インスタンスは MySQL 5.7.21 をベースにしていたので、6.15
を5.7.21
で置き換えました。router_options
の文字列には、サーバー ID、マスターユーザー名、マスターユーザーパスワード、、mariadb10-compatibility=0
、およびfilestem=mysql-bin-changelog
を含む必要があります。- サーバー ID については、
SELECT @@server_id
でクエリーした結果を記録することで、RDS インスタンスと同じサーバー ID を使用します。 mariadb10-compatibility=0
が必要なのは、MariaDB 10.0 以降と同じ GTID フォーマットを使用しない MySQL インスタンスであるためです。filestem=mysql-bin-changelog
により、MaxScale ではバイナリログにmysql-bin-changelog
というプレフィックスを付けることが分かりますが、これが Amazon RDS の標準の命名規則です。たとえば、サーバー ID を1961731445
、マスターパスワードをqqnalh9u
とすると、router_options
行は次のようになります。
router_options=server-id=1961731445,user=admin,password=qqnalh9u,mariadb10-compatibility=0,filestem=mysql-bin-changelog
- サーバー ID については、
address=master.example.com
を各自の RDS インスタンスのエンドポイントに変更します。今回の場合では、address=jaime-binlog-server-master.wzyowmbtiken.us-west-2.rds.amazonaws.com
[Binlog Listener]
セクションでは、port=5306
をport=3306
など、 RDS for MySQL インスタンスに設定されたポートに変更します。
/etc/maxscale.cnf
ファイル全体は、次のようになります。
master.ini の設定
デフォルトでは、バイナリログはMaxScale を実行している EC2 ホストの /var/lib/maxscale
ディレクトリにダウンロードされます。もう一つのマスター固有の設定ファイルがこのディレクトリに必要で、MaxScale に CHANGE MASTER TO
コマンドを発行し、RDS インスタンスでレプリケーションの設定をするために実行する必要があります。このファイルは master.ini
という名前で、少なくとも中に master_host
、master_port
、master_user
、および master_password
のプロパティがあります。このプロパティには、Amazon RDS エンドポイント、ポート、マスターのユーザー名、マスターのユーザーパスワードをそれぞれ設定する必要があります。
たとえば master.ini
ファイルは、試験設定では次のようになります。
もう一つの方法として、MaxScale を master.ini
ファイルなしで起動し、MaxScale のユーザーとしてプロキシに接続し、CHANGE MASTER TO
コマンドを発行することで、ファイルを自動生成するということも可能です。これは長期間にわたって稼働していて、初期のバイナリログファイルがすでにホストにない、既存のマスターに接続する必要がある場合に便利です。そうでない場合は、明示的な master.ini
をベースにした設定は、初期のバイナリログ (例、mysql-bin-changelog.000001
) から開始することが前提になります。
MaxScale の起動
この時点で間違いなく MaxScale.を起動できます。まず、MaxScale が Amazon RDS インスタンスに Amazon RDS エンドポイントとポートを経由してMaxScale ユーザーとして接続できることを検証します。MariaDB クライアントツールが EC2 ホストにインストールされているはずなので、mysql client を実行して接続性を検証します。
たとえば、次のコマンドは私が接続性を検証するために実行したものです。
接続できれば、次のコマンドを使用して MaxScale を安全に起動できます。
MaxScale が実行中の時も、次のコマンドでステータスを確認できます。
show services コマンドで maxadmin ユーティリティを実行し、Binlog_Service などのすべてのサービスのサマリーを取得することもできます
Binlog Server が適切に稼働しているとバイナリログが /var/lib/maxscale
ディレクトリに蓄積していき、mysql-bin-changelog.000001
から処理が開始します (明示的な master.ini
ファイルと仮定)。maxadmin のサービスサマリーの最初の数行は、次のような感じでしょう。
明示的な master.ini
ファイルがなければ、MaxScale ユーザーとしてプロキシにに接続し、CHANGE MASTER TO
コマンドを発行します。たとえば、ユーザーがバイナリログファイル mysql-bin-changelog.007076
の位置 4 からバイナリログのダウンロードの開始を求めている、ということに対応します。MaxScale を実行している EC2 では、MySQL クライアントを使用して、以前設定した MaxScale ユーザとして、ホストアドレス 127.0.0.1 に接続します。
次に、以下の CHANGE MASTER TO
コマンドを発行します。
レプリカの追加
適切なパラメータで mysql.rds_set_external_master へのコールを発行すると、Binlog Server にレプリカを追加できます。レプリカの初期設定は、次の 2 つの方法で実施できます。
- Amazon RDS マネージドレプリカを作成し、レプリケーションが完全に同期するまで待ち、rds_stop_replication をコールしてレプリケーションを停止します。
SHOW SLAVE STATUS
出力のRelay_Master_Log_File
と Exec_Master_Log_Pos 値を記録します。Read Replica を Promote し、それをマネージド Amazon RDS レプリカからノンマネージドに変換します。 - 標準の RDS インスタンスを作成し、mysqldump や AWS Database Migration Service (AWS DMS) などのツールを使用して、インスタンスをマスターから投入します。mysqldump を使用する場合、一貫性のあるデータのダンプを取るときは、マスターのバイナリログの位置を記録する必要があります。通常、これは mysqidump の一部として、
--master-data=2
を指定することで実現できます。ただし、Amazon RDS for MySQL では、FLUSH TABLES の内部制限のために、これではうまくいきません。
いずれにせよ、最終的にレプリカを追加する場合は mysql.rds_set_external_master をコールします。MaxScale を実行している EC2 ホストのホストアドレスを、Amazon RDS マスターユーザーの資格情報、レプリケーション開始位置のバイナリログファイルの座標と共に受け渡します。
試験設定では、1 番目のバイナリログから開始して次のコマンドを発行します。
Amazon RDS Binlog Server の制限
MaxScale は Amazon RDS をサポートしていますが、Amazon 以外の RDS for MySQL インスタンスを実行するときと比べて、次のようないくつかの制限に注意してください。
- Amazon RDS for MySQL および Amazon RDS for MariaDB で、log_slave_update パラメータを修正できます。このパラメータは、Amazon RDS for MySQL および MariaDB では常に使用可能です。
- Multi-AZ や Binlog Server のバイナリログの削除など、MaxScale のまわりには Amazon RDS オートメーションはありません。こうしたロジックはすべて手動で操作する必要があります。
- 現時点では GTID ベースのレプリケーションのサポートはありません。Amazon RDS for MySQL は GTID ベースのレプリケーションをサポートしていませんが、これは問題ありません。Amazon RDS for MariaDB については、mysql.rds_set_external_master_gtid ストアドプロシージャの代わりに、rds_set_external_master ストアドプロシージャを使用する必要があります。
まとめ
Binlog Server は、マスターと 1 つ以上のレプリカの間の中間的なバイナリログのキャッシュレイヤーとして有用です。この記事では、こうしたアプローチを採用した場合の利点と制限について説明し、MariaDB MaxScale を使用して Binglog Server を設定する手順を紹介しました。Amazon RDS for MySQL および MariaDB において、レプリケーションプロセスのコントロールを向上できるのは、魅力的な選択肢です。
著者について
Jaime Lichauco は、Amazon Web Services の RDS チームのデータベースエンジニアです。