ちょっと話題の記事

Amazon Aurora 1.18.0がリリースされ並列クエリとOOM回避が実装されました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大栗です。

先程Amazon Aurora 1.18.0がリリースされました。並列クエリ(Parallel Query)とOOM回避(OOM Avoidance)という機能が搭載されましたのでご紹介します。並列クエリは2月からプレビューが開始されていましたが今回正式リリースとなりました。

Amazon Aurora 1.18.0

Amazon Aurora 1.18.0 は MySQL 5.6互換の最新バージョンとなります。新規でMySQL 5.6互換のAuroraを起動するとバージョンは1.18.0となり、既存のDBクラスタからもアップグレード可能です。ただし必須アップグレードではないため既存のバージョンのまま使い続けられます。Auroraのバージョンをv1.14.4、v1.15.1、v1.16、v1.17.6で起動したい場合はAWS CLIやAmazon RDS APIで起動可能です。

並列クエリ(Parallel Query)

AuroraはSQLクエリなどをパースするDBインスタンスとデータを保存するAuroraストレージの2層で構成されています。DBインスタンスは明示的に起動したインスタンスサイズの決まったCPUがあります。しかしストレージは分散環境になっており多数のノードに分かれており各々にCPUが搭載されています。その多数のストレージノードに並列でクエリを実行することで、ストレージノードのCPUをフル活用しつつ高速にクエリを実行することができます。

並列クエリを同時に実行できるクエリ数はインスタンスクラスで変わります。

|インスタンスクラス|並列クエリの 同時セッション数| |---|---|---| | db.r.large | 1 | | db.r.xlarge | 2 | | db.r.2xlarge | 4 | | db.r.4xlarge | 8 | | db.r*.8xlarge | 16 | | db.r4.16xlarge | 16 |

aurora_pqパラメータで並列クエリの有効/無効を設定できます。並列クエリを有効にするとオプティマイザが並列クエリを使用するか自動的に判断します。またaurora_pq_forceパラメータを使用するとオプティマイザの判断を上書きできます。

なお並列クエリはAuroraのCapacity typeでProvisioned with Aurora parallel query enabledを選択する必要があります。

AWS CLIの場合には--engine-modeオプションでparallelqueryを指定します。

OOM回避(OOM Avoidance)

OOM回避はシステムメモリを監視してデータベースが様々なコンポーネントで使用するメモリを追跡して、システムのメモリが不足した時にOOM(Out of Memory)にならないように各コンポーネントからメモリを開放するためにリストのアクションを実行してデータベースの再起動を回避します。ベストエフォートの機能で、T2インスタンスはデフォルトで有効になっており、aurora_oom_responseパラメータで有効化できます。パラメータはメモリ不足時に実行するアクションを記述します。

アクション 内容
print 大量のメモリを使用するクエリの出力のみします。
tune 内部テーブルキャッシュをチューニングして、メモリをシステムに開放します。
decline インスタンスのメモリが不足すると新しいクエリを拒否します。
kill_query インスタンスのメモリが閾値より下がるまでメモリ消費の大きい順にクエリを強制終了します。DDLは強制終了されません。
print, tune printtuneのアクションを実行します。
tune, decline, kill_query tunedeclinekill_query"のアクションを実行します。

旧バージョンを起動する

バージョン1.18.0がリリースされましたが、CLIを使用して旧バージョンのDBインスタンスを起動することができます。

まずは以下のようにDBクラスタを起動します。

$ aws rds create-db-cluster --db-cluster-identifier <DBクラスタ名> \
  --engine aurora \
  --engine-version 5.6.10a \
  --db-subnet-group-name default \
  --master-username awsuser \
  --master-user-password mypassword

クラスタの起動後にDBインスタンスを起動します。ここで--engine-versionに注目します。Aurora MySQL 1系は通常はバージョンを5.6.10aと記述しますが、5.6.10a.&lt;バージョン&gt;を記述します。バージョン1.14.4を起動する場合には5.6.10a.1.14.4となります。過去バージョンの起動はアンドキュメンテッドであり今後使用が変更される事がありうるのでご注意ください。

$ aws rds create-db-instance --db-instance-identifier <DBインスタンス名> \
  --db-cluster-identifier <DBクラスタ名> \
  --availability-zone ap-northeast-1a \
  --engine aurora \
  --engine-version 5.6.10a.1.14.4 \
  --db-instance-class db.r4.large

さいごに

今までAuroraは大量の小さいクエリを高スループットで捌く事を得意としたデータベースでしたが、今回のアップデートで並列クエリはAuroraのストレージノードに対して並行してデータにアクセスするのでDWHのようなデータへのアクセスが高速化されることが期待できます。同じDBエンジンで小さなクエリも大きなクエリも対応できるようになります。エンジンモードが異なり別々に起動する必要があるので、1台のDBで両方のクエリを高速に実行できるわけではありませんが同じAuroraとして実行ができます。同じAuroraであるのでDBの癖をあまり意識せずに使い分けられるのは大きなメリットだと思います。

またOOM回避はメモリを多用する環境で安定することが期待できます。Auroraは64TBのデータまでシームレスに拡張可能なのでしばしば大量のデータを保存しますが、大量のデータを保存するとメモリが枯渇して不鑑定になることがあります。今回のアップデートにより小さなインスタンスタイプや大量データの環境で安定性が増すと思われます。

バージョン1.18.0は必須アップグレードではないので今のところ既存のバージョンを使い続けられますが、安定性が増す機能も増えているのでバージョンを上げていく方が良いと思われます。