このトピックでは、RDS High-availability Edition の ApsaraDB RDS for MySQL インスタンスで読み書き分離を検証する方法について説明します。このトピックでは、Elastic Compute Service (ECS) インスタンスが内部ネットワークを介して RDS インスタンスに接続されています。
前提条件
RDS High-availability Edition のプライマリ RDS インスタンスが作成されていること。
プライマリ RDS インスタンス用に読み取り専用 RDS インスタンスが作成されていること。
RDS インスタンス上に少なくとも 1 つのデータベースが作成され、そのデータベースに少なくとも 1 つのテーブルが含まれていること。RDS インスタンス用にテストアカウントが作成されていること。テストアカウントは、標準アカウントまたは特権アカウントのいずれかです。詳細については、「アカウントとデータベースの作成」をご参照ください。
説明標準アカウントを作成する場合は、その標準アカウントに必要なデータベースに[読み書き (DDL + DML)] 権限を付与する必要があります。
この例では、testdb01 という名前のデータベース、products という名前のテーブル、cxx1 という名前のテストアカウントが作成されています。
RDS インスタンス用にIP アドレスホワイトリストが設定されていること。
RDS インスタンスに接続する ECS インスタンスが、RDS インスタンスと同じ Virtual Private Cloud (VPC) 内にあること。ECS インスタンスに MySQL クライアントがインストールされていること。
RDS インスタンスでデータベースプロキシ機能が有効化されていること。
RDS インスタンスでSQL Explorer と監査機能が有効化されていること。
背景情報
データベースプロキシ機能の読み書き分離機能は、書き込みリクエストをプライマリ RDS インスタンスに、読み取りリクエストを読み取り専用 RDS インスタンスに転送し、自動的な読み書き分離を実現します。これにより、プライマリ RDS インスタンスにかかる読み取りリクエストの負荷が軽減されます。データベースプロキシ機能を有効にして設定した後、このトピックで説明する操作を実行して、指定した読み取りの重みに基づいて読み取りおよび書き込みリクエストが転送されるかどうかを確認できます。
検証プロセス
この例では、ECS インスタンスを内部ネットワーク経由で RDS インスタンスに接続し、読み書き分離の有効性を検証します。次の手順を実行します:
ApsaraDB RDS コンソールで、読み取り専用 RDS インスタンスの重みを 100 の倍数に、プライマリ RDS インスタンスの重みを 0 に設定します。この設定により、すべての読み取りリクエストが読み取り専用 RDS インスタンスに転送されるようになります。この例では、読み取り専用 RDS インスタンスの重みを 10000 に、プライマリ RDS インスタンスの重みを 0 に設定します。
テストアカウントを使用して、データベースプロキシエンドポイント経由で ECS インスタンスを RDS インスタンスに接続し、読み取りおよび書き込み操作を実行します。
ApsaraDB RDS コンソールの [SQL Explorer と監査] ページで、プライマリ RDS インスタンスと読み取り専用 RDS インスタンスで実行された SQL 文のレコードを表示します。
SQL 文の実行レコードに基づいて、読み取りリクエストが読み取り専用 RDS インスタンスによって処理され、書き込みリクエストがプライマリ RDS インスタンスによって処理されているかを確認し、読み書き分離が機能しているかを判断します。
操作手順
-
読み取りの重みを指定します。
ApsaraDB RDS コンソールにログインし、[インスタンス] ページに移動します。上部メニューで、プライマリ RDS インスタンスがあるリージョンを選択します。次に、プライマリ RDS インスタンスを見つけ、その RDS インスタンスの ID をクリックします。
-
左側のナビゲーションペインで、データベースプロキシ をクリックします。接続情報 セクションで、対象のプロキシエンドポイントの ID を見つけます。
-
対象のプロキシエンドポイントの 操作 列で、設定の変更 をクリックします。
-
表示されるダイアログボックスで、次のパラメーターを設定します:
-
読み書きプロパティ を 読み書き (読み書き分離) に設定します。
-
読み取りの重み割り当て で、カスタム を選択します。読み取り専用インスタンスの重みを 10000 に、プライマリインスタンスの重みを 0 に設定します。その後、OK をクリックします。
-
-
接続情報 セクションで、VPC タイプのプロキシエンドポイントを取得します。
cxx1 テストアカウントを使用して ECS インスタンスをデータベースに接続し、読み取り操作を実行します。
RDS インスタンスへの接続元の ECS インスタンスにログインします。
説明詳細については、「インスタンスへの接続」をご参照ください。
次のコマンドを実行して、ECS インスタンスを RDS インスタンスに接続します:
mysql -h [プロキシエンドポイント] -P [ポート番号] -u [ユーザー名] -p上記のコマンドで使用されるパラメーターを次の表に示します。
パラメーター
説明
設定
プロキシエンドポイント
手順1 で取得したVPC タイプのプロキシエンドポイント。
クライアントを使用して RDS インスタンスに接続する場合、パブリックプロキシエンドポイントを使用する必要があります。
-P
ポート番号。大文字の P の後にポート番号を入力します。
N/A。
-u
ユーザー名。u の後にユーザー名を入力します。
N/A。
-p
パスワード。小文字の p の後にパスワードを入力します。
-pの後にパスワードを入力します。スペースは使用できません。コマンドを実行する前に
-pに続けてパスワードを入力する代わりに、コマンド実行後にパスワードを入力することもできます。これにより、パスワードが平文で表示されるのを防ぐことができます。次のコマンドを実行して、データベース testdb01 にアクセスします:
USE testdb01;読み取り操作の SQL 文を 6 回実行します。ステートメントの例:
SELECT * FROM products LIMIT 20;
testdb01 データベースで、テーブルを作成する書き込み操作を 3 回実行します。たとえば、次のステートメントを参考に、Products11、Products12、Products13 のように異なる名前のテーブルを 3 つ作成します。
説明前の手順で、ECS インスタンスを RDS インスタンスに接続し、testdb01 データベースにアクセスしました。詳細については、手順2をご参照ください。
CREATE TABLE Products11 ( prod_id CHAR(10) NOT NULL, vend_id CHAR(10) NOT NULL, prod_name CHAR(254) NOT NULL, prod_price DECIMAL(8,2) NOT NULL, prod_desc VARCHAR(1000) NULL );-
プライマリ RDS インスタンスと読み取り専用 RDS インスタンスで実行された SQL 文のレコードを表示します。
読み取り専用インスタンスがすべての
SELECTクエリを処理し、プライマリインスタンスがすべてのCREATEクエリを処理したことを確認します。読み取り専用インスタンスにCREATEクエリのログが表示されないことを確認してください。ApsaraDB RDS コンソールにログインし、[インスタンス] ページに移動します。上部メニューで、プライマリ RDS インスタンスがあるリージョンを選択します。次に、プライマリ RDS インスタンスを見つけ、その RDS インスタンスの ID をクリックします。
-
プライマリインスタンスの左側のナビゲーションペインで、 を選択します。時間範囲を選択し、検索 をクリックします。
SELECTクエリの実行ログが表示されないことを確認します。 -
プライマリインスタンスの左側のナビゲーションペインで、基本情報 をクリックします。読み取り専用インスタンス の横にある数字にカーソルを合わせ、表示されるダイアログボックスで読み取り専用インスタンスの ID をクリックします。
-
読み取り専用インスタンスの左側のナビゲーションペインで、 を選択します。時間範囲を選択し、検索 をクリックします。SQL 監査ログには、
SELECT * FROM products LIMIT 20クエリのレコードが 6 件表示されます。データベースはtestdb01、操作タイプはSELECT、すべての操作のステータスはSuccessです。 -
プライマリインスタンスの左側のナビゲーションペインで、 を選択します。時間範囲を選択し、検索 をクリックします。
CREATEコマンドの実行レコードが 3 件表示されます。たとえば、これらのレコードはCREATE TABLE Products11、CREATE TABLE Products12、CREATE TABLE Products13などのクエリに対応する可能性があります。データベースはtestdb01で、すべての操作のステータスはSuccessです。
検証の結論
読み取り専用 RDS インスタンスの重みが 10000、プライマリ RDS インスタンスの重みが 0 に設定されている場合、すべての書き込みリクエストをプライマリ RDS インスタンスが処理し、すべての読み取りリクエストを読み取り専用 RDS インスタンスが処理します。これにより、読み書き分離が実現されます。