shibatch's journey

日々考えていることをつらつら書くだけです

AuroraでAZをまたぐ設計にしたらレイテンシが悪くなった話

最近AWSでRDS Aurora⇔EC2のいわゆるクライアントサーバシステムを構成したのですよ。マルチAZで可用性を担保し、EC2はAuroraのPrimaryへ接続する構成です。

f:id:shibatch:20210228232314p:plain

で、負荷試験を実施するとEC2のレイテンシがばらんばらんになるという不可思議な事象が発生しました。

具体的にはこんな感じ。だいぶ違う。単位はQuery per secです。

  • Aurora-1 ⇔ EC2-1 … 148qps
  • Aurora-1 ⇔ EC2-2 … 933qps
  • Aurora-1 ⇔ EC2-3 … 369qps

これなんでかなーと思ったら AZをまたいたのが原因のよう。 まぁAZは地理的に離れているので考えてみればありうるな、という感じではあるんですが、マルチAZ構成って普通に使う構成ではあると思うので、世の中的にはどうやって解決してるんだろな、と素朴には思ったのでした。

ちなみに自分の解決法はちょっと入り組んだ話になるので細かくは書きませんが、かんたんには更新処理と参照処理で別のELBを立てて、参照処理は同じAZにあるAuroraを使うようにしました。

f:id:shibatch:20210228233821p:plain

(この図では参照処理だけ抜き出しています)(微妙に上とイラストが違ってたりしてごめんなさい)

で、AuroraがないAZのEC2インスタンスは速度が出ないのでAZごと削除。そのかわり、同じAZにはEC2を2つ立てて冗長化をはかった構成に。

Auroraは安いサービスではないので、なるべくリソースの無駄使いにならないようにしたいですね。今回構築した構成はAuroraでt3インスタンスタイプを使っていて、通常時ではAuroraのCPUがバーストしないくらいのトラフィック量で、障害が発生してひとつのAZに集中したらもしかしたらバーストしてCPUクレジット使うかもな、くらいの設計にしています。 t3インスタンスなのでCPUクレジットを使い切ったら追加料金が発生するけれども、まぁ平常時はコストメリットあるよね、という塩梅です。

AZまたいでもレイテンシが落ちないようなベストプラクティスあったりするのかな。あるならぜひ知りたいところでした。まぁ構築はうまくいったのでよしとはしています。