概要
データベースの負荷が上がったとき、原因が「読み取りの多さ」にあることはよくあります。一覧画面の表示や集計のクエリが大量に流れると、同じインスタンスで処理している書き込みまで待たされ、更新の応答が遅くなります。
このとき考えるべきなのは、読み取りを別のインスタンスに逃がすことです。Amazon Aurora では、同じクラスターに Aurora レプリカ(リーダーインスタンス)を足し、アプリケーションが読み取りをリーダーエンドポイント、書き込みをクラスターエンドポイントへ送るように分けます。Aurora レプリカはライターとストレージを共有しているため、データのコピーを持たずに読み取りを肩代わりできます。
この記事では、読み取りの負荷を逃がす方法(Aurora レプリカ、RDS のリードレプリカ、マルチ AZ のスタンバイ、キャッシュ)の違いと、Aurora のエンドポイントの使い分けを整理します。実践では、ライターだけの Aurora クラスターにリーダーを足し、2 つのエンドポイントで接続先と読み取り専用かどうかが変わることを確かめます。

クラウドおさる猿山の帳場で、バナナの出し入れの記帳と在庫の問い合わせを 1 匹がさばいていたら、記帳がいつまでも終わらないでござる。今日は問い合わせ係を別に立てて、窓口を分けるところまで確かめるでござるよ。
この記事のメリット
- 読み取りの負荷を逃がす方法(Aurora レプリカ・RDS リードレプリカ・マルチ AZ のスタンバイ・キャッシュ)を使い分けられるようになる
- Aurora レプリカがストレージを共有する仕組みと、レプリカラグの目安が分かる
- クラスターエンドポイント・リーダーエンドポイント・インスタンスエンドポイントの役割を説明できるようになる
- リーダーエンドポイントが「接続」を振り分ける仕組みであることと、その注意点が分かる
- Aurora レプリカがフェイルオーバー先にもなることと、優先度の考え方が分かる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
読み取りの負荷を逃がす方法
読み取りが書き込みの足を引っ張っているとき、候補になる方法は複数あります。似た名前のものが多いので、「読み取りに使えるか」で区別します。
| 方法 | 読み取りに使えるか | レプリケーション | 主な用途 |
|---|---|---|---|
| Aurora レプリカ | 使える(リーダーエンドポイントで分散) | クラスターボリュームを共有。ラグは通常 100 ミリ秒未満 | 読み取りのスケーリング、フェイルオーバー先 |
| RDS のリードレプリカ | 使える(レプリカごとのエンドポイント) | 非同期。別リージョンにも作れる | 読み取りの負荷分散、レポート、災害対策 |
| RDS マルチ AZ(DB インスタンス)のスタンバイ | 使えない | 同期 | 高可用性 |
| RDS マルチ AZ DB クラスター | 使える(2 台のリーダー) | 準同期 | 高可用性と読み取りの両立 |
| ElastiCache などのキャッシュ | データベースの前で結果を返す | アプリケーションがキャッシュを読み書きする | 同じ結果を何度も読むクエリの高速化 |


Aurora を使っているなら、まず候補になるのは Aurora レプリカです。別の Aurora クラスターを作ってつなぐ必要はなく、同じクラスターにリーダーを足すだけで済みます。



マルチ AZ のスタンバイは、控えにいても問い合わせには答えない当番でござる。「読み取りを分けたい」ときに選ぶのは、リーダーとして窓口に立てるほうでござるぞ。
Aurora レプリカの仕組み
Aurora の DB クラスターは、1 台のライター(プライマリインスタンス)と、最大 15 台の Aurora レプリカで構成できます。
- ライターと Aurora レプリカは、クラスターボリュームのデータを 1 つの論理ボリュームとして共有する。レプリカごとにデータのコピーを持たないため、レプリカを足すときの追加の作業は小さい
- ライターに書き込まれたデータは、複数の AZ にまたがる 6 つのストレージノードに同期的に複製される
- Aurora レプリカは読み取り専用で、書き込みはライターが処理する
- ライターが書き込んでから Aurora レプリカで読めるまでのラグは、通常 100 ミリ秒未満。書き込みが非常に多いときは増えることがある
Aurora レプリカは、ライターが使えなくなったときのフェイルオーバー先にもなります。
| 項目 | 内容 |
|---|---|
| 昇格の順序 | レプリカごとの優先度(tier-0 が最も高く、tier-15 が最も低い)で決まる。同じ優先度なら、サイズの大きいレプリカが優先される |
| 復旧時間の目安(レプリカあり) | 通常 60 秒未満、多くの場合 30 秒未満 |
| 復旧時間の目安(レプリカなし) | ライターを作り直すため、通常 10 分未満 |
エンドポイントの使い分け
Aurora のクラスターには、用途の違うエンドポイントがあります。アプリケーション側で、書き込みと読み取りの接続先を分けて設定する必要があります。
| エンドポイント | 接続先 | 使いどころ |
|---|---|---|
| クラスターエンドポイント(ライター) | 現在のライター。フェイルオーバー後は新しいライターに自動で向く | INSERT などの書き込み、DDL |
| リーダーエンドポイント | Aurora レプリカに接続を振り分ける。レプリカが無ければライターに接続する | SELECT などの読み取り |
| インスタンスエンドポイント | 特定の 1 台。フェイルオーバーで向き先は変わらない | 特定のインスタンスの診断・チューニング |
| カスタムエンドポイント | 自分で選んだインスタンスの組み合わせ | インスタンスクラスの違うリーダーを用途別に分ける |


リーダーエンドポイントの振り分けは接続単位で、クエリ単位ではありません。1 本の接続を張りっぱなしにすると、その接続のクエリはずっと同じレプリカに届きます。クエリごとに読み取りを分散させたい場合は、クエリごとにリーダーエンドポイントへ新しい接続を開きます。



リーダーエンドポイントは「窓口の案内係」で、来た客をどの係に通すかを決めるのは最初の 1 回だけでござる。同じ客が居座れば、ずっと同じ係が相手をするのでござるな。
実践
ライターだけで動いている Aurora MySQL クラスターにリーダーを 1 台追加し、EC2 からクラスターエンドポイントとリーダーエンドポイントの両方に接続して、つながる先と読み取り専用かどうかを確かめます。
前提条件
- リージョン:
ap-northeast-1(東京) - RDS・EC2・Systems Manager の操作権限を持つ IAM ユーザーまたはロールでコンソールにログイン済みであること
以下のリソースが作成済みであることを前提とします。Aurora クラスターには、まだライターが 1 台あるだけです。
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| VPC・サブネット | aurora-lab-vpc | パブリックサブネット aurora-lab-public-1a、プライベートサブネット aurora-lab-private-1a / aurora-lab-private-1c | Amazon RDS でデータベースを作成し EC2 から接続する |
| Aurora DB クラスター | aurora-lab-cluster | Aurora MySQL。マスターユーザー admin、パスワードは Secrets Manager で管理。DB サブネットグループは 2 つのプライベートサブネット | 同上 ※エンジンを Aurora (MySQL Compatible) にする |
| ライターインスタンス | aurora-lab-writer | db.t4g.medium・ap-northeast-1a | 同上 |
| EC2 インスタンス | aurora-lab-client | Amazon Linux 2023。mysql クライアント(mariadb105)と jq を導入済み。Session Manager で接続でき、クラスターの情報とマスターユーザーのシークレットを読み取れる IAM ロールを付与 | 同上 |
| セキュリティグループ | aurora-lab-db-sg | aurora-lab-client からの MySQL(3306)だけを許可 | 同上 |
このハンズオンで作成するリソースは以下のとおりです。
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| Aurora レプリカ(リーダーインスタンス) | aurora-lab-reader-1 | 読み取り用。ap-northeast-1c に置く |
Aurora の DB インスタンスは、起動している間ずっと 1 台ごとに課金されます。リーダーを足すとそのぶん料金が増えます。検証が終わったら必ず削除してください。
手順 1: リーダーを足す前のエンドポイントを確かめる
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
上部の検索バーに RDS と入力し、「Aurora and RDS」を選択します。左側ナビゲーションの「データベース」を選択し、aurora-lab-cluster の配下に aurora-lab-writer(ロール: ライターインスタンス)だけがあることを確認します。
aurora-lab-cluster を開き、「接続とセキュリティ」タブを選択します。「エンドポイントタイプ」が クラスターエンドポイント の状態で、「接続先」を ライター と リーダー に切り替えると、表示される接続コマンドのホスト名が変わります。ライターは aurora-lab-cluster.cluster-…、リーダーは aurora-lab-cluster.cluster-ro-… です。リーダーがまだ無いため、この時点ではリーダーエンドポイントもライターに接続します。


手順 2: リーダーを追加する
aurora-lab-cluster の画面右上の「アクション」→「リーダーの追加」をクリックします。「リーダーの追加」の画面で、以下を設定します。
- DB インスタンス識別子:
aurora-lab-reader-1 - DB インスタンスクラス:
バースト可能クラスのdb.t4g.medium(デフォルト) - アベイラビリティーゾーン:
ap-northeast-1c(デフォルトは「指定なし」) - パブリックアクセス:
パブリックアクセス不可(デフォルト)


その他の項目はデフォルトのままにして、「リーダーを追加」をクリックします。作成には 10 分ほどかかります。
aurora-lab-reader-1 のステータスが「利用可能」になり、ロールが「リーダーインスタンス」になったことを確認します。


手順 3: 2 つのエンドポイントに接続して違いを確かめる
上部の検索バーに EC2 と入力し、「EC2」を選択します。左側ナビゲーションの「インスタンス」から aurora-lab-client を選択し、「接続」→「Session Manager」タブ→「接続」をクリックします。
開いたターミナルで、次のコマンドを実行します。エンドポイントはクラスターの情報から、パスワードは Secrets Manager から取得します。パスワードは画面に表示せず、環境変数 MYSQL_PWD で mysql クライアントに渡します。
export AWS_DEFAULT_REGION=ap-northeast-1
WRITER=$(aws rds describe-db-clusters --db-cluster-identifier aurora-lab-cluster \
--query 'DBClusters[0].Endpoint' --output text)
READER=$(aws rds describe-db-clusters --db-cluster-identifier aurora-lab-cluster \
--query 'DBClusters[0].ReaderEndpoint' --output text)
SECRET_ARN=$(aws rds describe-db-clusters --db-cluster-identifier aurora-lab-cluster \
--query 'DBClusters[0].MasterUserSecret.SecretArn' --output text)
export MYSQL_PWD=$(aws secretsmanager get-secret-value --secret-id "$SECRET_ARN" \
--query SecretString --output text | jq -r .password)それぞれのエンドポイントに接続し、つながったインスタンスと、読み取り専用かどうかを表示します。
mysql -h "$WRITER" -u admin -e "SELECT @@aurora_server_id AS server, @@innodb_read_only AS read_only;"
mysql -h "$READER" -u admin -e "SELECT @@aurora_server_id AS server, @@innodb_read_only AS read_only;"クラスターエンドポイントでは server が aurora-lab-writer、read_only が 0 になります。リーダーエンドポイントでは server が aurora-lab-reader-1、read_only が 1 になります。
リーダーが「利用可能」になった直後は、リーダーエンドポイントの DNS がまだライターを指していて、server が aurora-lab-writer になることがあります。今回は切り替わるまでに数分かかりました。その場合は少し待ってから実行し直します。


手順 4: 書き込みはライター、読み取りはリーダーで行う
クラスターエンドポイントでテーブルを作り、データを書き込みます。
mysql -h "$WRITER" -u admin -e "
CREATE DATABASE IF NOT EXISTS lab;
CREATE TABLE IF NOT EXISTS lab.orders (id INT AUTO_INCREMENT PRIMARY KEY, item VARCHAR(20));
INSERT INTO lab.orders (item) VALUES ('banana'), ('apple');"続けて、リーダーエンドポイントで読み取ります。ライターで書いたデータが、すぐにリーダーからも読めます。
mysql -h "$READER" -u admin -e "SELECT * FROM lab.orders;"最後に、リーダーエンドポイントで書き込みを試します。
mysql -h "$READER" -u admin -e "INSERT INTO lab.orders (item) VALUES ('grape');"読み取り専用モードで動いているため実行できない、という ERROR 1836 (HY000) at line 1: Running in read-only mode が返ります。リーダーは読み取り専用なので、書き込みはクラスターエンドポイントに送る必要があります。





「読み取りが書き込みを遅くしている」と言われたら、読み取り用の窓口を足して接続先を分ける話でござる。マルチ AZ のスタンバイやキャッシュと取り違えず、「読めるか」「エンドポイントは何か」で見分けるのが肝でござるな。
まとめ
| 要件 | 選ぶもの |
|---|---|
| Aurora で読み取りを書き込みから切り離したい | Aurora レプリカを足し、読み取りをリーダーエンドポイントへ送る |
| RDS(Aurora 以外)で読み取りを分散したい、別リージョンにも置きたい | RDS のリードレプリカ |
| AZ 障害に備えたい(読み取りは不要) | RDS マルチ AZ(DB インスタンス)。スタンバイは読めない |
| 同じ結果を何度も読むクエリを速くしたい | ElastiCache などのキャッシュ |
- Aurora レプリカはクラスターボリュームを共有し、データのコピーを持たない。ラグは通常 100 ミリ秒未満で、1 クラスターに最大 15 台
- 書き込みはクラスターエンドポイント、読み取りはリーダーエンドポイント。アプリケーション側で接続先を分ける
- リーダーエンドポイントは接続単位で振り分ける。クエリ単位では分散しない
- Aurora レプリカはフェイルオーバー先にもなる。優先度は tier-0(最も高い)〜 tier-15
参照先
- Amazon Aurora でのレプリケーション – Amazon Aurora
- Amazon Aurora エンドポイント接続 – Amazon Aurora
- Amazon Aurora のリーダーエンドポイント – Amazon Aurora
- DB クラスターに Aurora レプリカを追加する – Amazon Aurora
- Amazon Aurora の高可用性 – Amazon Aurora
- DB インスタンスのリードレプリカの操作 – Amazon Relational Database Service
- Amazon RDS のマルチ AZ DB クラスターデプロイ – Amazon Relational Database Service















