1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RDSのMulti-AZは読み取りを分散できる?2つの構成を図で整理

1
Posted at

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台。通常時の読み取りと、障害時の切り替え先を兼ねる

プライマリとライターは、どちらも読み書きを担当する側の呼び名です。図では青い矢印がその接続、緑の矢印がリーダーへの読み取り接続を表しています。

Multi-AZ DBインスタンスではスタンバイを読み取りに使えず、Multi-AZ DBクラスターでは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がどの役割なのかを見ると整理しやすくなります。

参考資料


テイ チョウユウです。『AWS総合実践ガイドブック』の著者で、MaritSpace Academyを運営しています。書籍で扱う範囲は出版社の目次にまとめられています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?