RDSのMulti-AZでは、別のAZにもデータベースを用意します。では、そのDBにもSELECTを送れば、読み取りの負荷を分けられるのでしょうか。
答えは、どのMulti-AZ構成を使うかで変わります。
- Multi-AZ DBインスタンス:スタンバイは読み取りに使えません。
- Multi-AZ DBクラスター:2台のリーダーを読み取りに使えます。
ここで比べているのは、普段の読み書きを担当するDB以外にも、読み取りを任せられるかです。Multi-AZにするとSELECT自体ができなくなる、という話ではありません。
この記事では、RDS for MySQL / PostgreSQLの2つの構成を整理します。Auroraは比較に含めません。AZはアベイラビリティーゾーンの略です。
まずは、2つの構成を並べてみる
| 構成 | 普段の読み書きを担当するDB | ほかのDBの役割 |
|---|---|---|
| Multi-AZ DBインスタンス | プライマリ1台 | スタンバイ1台。障害時の切り替えに備える。通常時の読み取りには使えない |
| Multi-AZ DBクラスター | ライター1台 | リーダー2台。通常時の読み取りと、障害時の切り替え先を兼ねる |
プライマリとライターは、どちらも読み書きを担当する側の呼び名です。図では青い矢印がその接続、緑の矢印がリーダーへの読み取り接続を表しています。
左は2つのAZ、右は同じリージョン内の3つのAZに配置する構成です。矢印は接続先と複製の関係を示したもので、実際のエンドポイントは省略しています。
DBインスタンス:スタンバイは、切り替えに備えるための1台
Multi-AZ DBインスタンスでは、プライマリのデータを別のAZのスタンバイへ同期的に複製します。プライマリに障害が起きた場合などに、RDSがスタンバイへの切り替えを行います。
ただし、通常時にアプリからスタンバイへ接続して、SELECTを実行することはできません。読み取りも書き込みも、プライマリが受け持ちます。
たとえば、商品一覧を表示するSELECTが増えてプライマリの負荷が高くなっても、このスタンバイに読み取りを分担させることはできません。2台あることと、2台とも読み取りに使えることは別です。
DBクラスター:2台のリーダーにも、読み取りを任せられる
Multi-AZ DBクラスターは、1台のライターと2台のリーダーを、同じリージョンの3つのAZに配置します。
リーダーは、通常時にSELECTを受け付けます。さらに、ライターに障害が起きたときには、どちらかが新しいライターになる切り替え先でもあります。
この構成なら、商品一覧などの読み取りを、リーダーへ接続する処理に分けられます。接続先は、たとえば次のように使い分けます。
- 注文の登録や更新:クラスターエンドポイント(ライターへの接続先)を使う。
- 読み取りの負荷をリーダーへ分けたい処理:リーダーエンドポイントを使う。
ライター側でもSELECTは実行できます。どの読み取りをリーダーへ任せるかは、アプリ側で決めます。
また、リーダーエンドポイントが振り分けるのは、各リーダーへの接続です。同じ接続でSELECTを繰り返したときに、SQLごとに別のリーダーへ振り分ける仕組みではありません。
「読める」ことと「今書いたデータが見える」ことは別
読み取り先を増やすときは、データが反映されるまでの遅れも考えます。
ここで、名前の似たリードレプリカも分けておきます。DBインスタンスから別途作成するリードレプリカと、Multi-AZ DBクラスターに含まれる2台のリーダーは、同じ構成ではありません。
DBインスタンスから作るリードレプリカには、元のDBの変更が非同期で反映されます。注文を保存した直後にリードレプリカからその注文を読み返すと、まだ反映されておらず、見つからない場合があります。
DBインスタンスから作成したリードレプリカの例です。時間の長さは説明用で、実測値ではありません。
Multi-AZ DBクラスターのリーダーにも、反映の遅れはあります。 クラスターは準同期レプリケーションを使いますが、すべてのリーダーで更新の適用が終わるまで待つ方式ではありません。「クラスターだから、どのリーダーを読んでも直前の更新が必ず見える」とは考えないほうがよいです。
注文完了画面などで、今保存したデータをすぐに表示したいなら、書き込み完了後にライター側から読み返す設計を検討します。負荷を分けたい読み取りと、新しいデータをすぐ確認したい読み取りは、接続先を分けて考えられます。
覚えておきたいのは、Multi-AZという名前より「誰が読むか」
「Multi-AZは読み取り分散に使えるか」と聞かれたら、まず構成を確認します。
- DBインスタンスのスタンバイは、通常時の読み取り先にできない。
- DBクラスターのリーダーは、読み取り先にできる。
- 読み取り先を増やしても、接続の振り分けとデータの反映遅延は別に考える。
資格試験の問題文でも、構成図でも、「Multi-AZ」の一語で判断せず、そのDBがどの役割なのかを見ると整理しやすくなります。
参考資料
- Multi-AZ DB instance deployments
- Multi-AZ DB cluster deployments(構成・準同期レプリケーション・反映遅延)
- Connecting to a Multi-AZ DB cluster(エンドポイント)
- Working with DB instance read replicas
テイ チョウユウです。『AWS総合実践ガイドブック』の著者で、MaritSpace Academyを運営しています。書籍で扱う範囲は出版社の目次にまとめられています。

