Auroraのパラメータグループの優先順位について実験してみた

2020.02.10

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

2020/03/03 実験条件を見直し、加筆修正を行いました。

こんにちは。AWS事業本部のKyoです。

AuroraのDB パラメータグループおよび DB クラスターパラメータグループについて、どちらが優先されるのかイメージしづらかったので、実験してみました。

Auroraのパラメータグループとは

Auroraのパラメータグループには以下の二種類が存在します。

  • DB クラスターパラメータグループ
  • DB パラメータグループ

公式ドキュメントによる定義は以下です。

DB クラスターパラメータグループ

DB クラスターパラメータグループのパラメータは、DB クラスター内のすべての DB インスタンスに適用されます。データは、Aurora 共有ストレージサブシステムに保存されます。このため、テーブルデータの物理レイアウトに関連するすべてのパラメータは、Aurora クラスター内のすべての DB インスタンスで同じにする必要があります。同様に、Aurora DB インスタンスはレプリケーションで接続されているため、レプリケーション設定のすべてのパラメータは Aurora クラスター全体で同じにする必要があります。

DB パラメータグループ

DB パラメータグループのパラメータは、Aurora DB クラスター内の単一の DB インスタンスに適用されます。これらのパラメータは、同じ Aurora クラスター内の DB インスタンス間で変化させることができるメモリ使用量などの要素に関連しています。たとえば、クラスターには、AWS インスタンスクラスが異なる DB インスタンスが含まれる場合がよくあります。

長いので以下、DB クラスターパラメータG, DBパラメータGと表記します。

やってみた

対象クラスタ

  • エンジン: Aurora MySQL 5.6.10a
  • インスタンスタイプ: db.r5.large
  • クラスタ構成: Writer x1, Reader x1

実験方法

  1. Auroraクラスタ, DB クラスターパラメータG, DBパラメータGを作成(DBパラメータGはWriter, Readeで共通
  2. DB クラスターパラメータG, DBパラメータGのmax_connectionsの設定値を後述のケースで指定するものに変更
  3. EC2からWriter, Readerそれぞれのエンドポイントに接続しSELECT @@max_connections;を実施
  4. ケース5についてはデフォルトの値を再設定不能なため、DBパラメータGを新しく作成し、Writer, Reader共に適用(再起動)。その後SELECT @@max_connections;を実施

※ケース 1-4については連続的に実施

実験結果

下記の結果が得られました。

ケース DB クラスターパラメータGの設定値 DB パラメータGの設定値 Writerの測定値 Readerの測定値 反映されたパラメータG
1 デフォルト デフォルト 1000 1000 -
2 デフォルト 50 50 50 DB パラメータG
3 300    50 50 50 DB パラメータG
4 600 50 50 50 DB パラメータG
5 600 デフォルト 600 600 DB クラスターパラメータG

※(max_connectionsの)デフォルト: GREATEST({log(DBInstanceClassMemory/805306368)*45},{log(DBInstanceClassMemory/8187281408)*1000})

原則として「DB パラメータG」の値が適用されており、DB パラメータGの値がデフォルトの際に「DB クラスターパラメータG」の値が適用されています。実験結果から、変更の順序に関係なく、DB パラメータGの設定値がデフォルトであることが基準であると考えられました。

これは公式ドキュメントと一致します。

非サーバーレスクラスターの場合、DB クラスターパラメータグループで変更した設定値は、DB パラメータグループのデフォルト値を上書きします。 DB パラメータグループ内の対応する値を編集すると、これらの値によって DB クラスターパラメータグループの設定が上書きされます。

【補足】 Writer, Readerで異なるDB パラメータGが設定されている場合

Writer, Readerに異なるDB パラメータGを設定するとどうなるかについても実験してみました。

変更点は以下です。

  • Writer, Readerに異なるDB パラメータGを設定
  • DB パラメータGはWriterのmax_connectionsのみ変更
  • ReaderのDB パラメータGの設定値は常にデフォルト
ケース DB クラスターパラメータGの設定値 DB パラメータGの設定値 Writerの測定値 Readerの測定値 反映されたパラメータG
1 デフォルト デフォルト 1000 1000 -
2 デフォルト 50 50 1000 DB パラメータG
3 300    50 50 300 DB パラメータG
4 600 50 50 600 DB パラメータG
5 600 デフォルト 600 600 DB クラスターパラメータG

この結果から、Writer, Readerに異なるDB パラメータGを設定した場合、それぞれの測定値は独立に振舞うことが確認できました。

余談ですが、この実験条件では以下の様なレコメンドが表示されていました。DBインスタンスの互換性の観点から、クラスター内のDBインスタンスには同一のパラメータGを適用することが推奨されているようです。

おわりに

パラメータグループが2つあることで混乱しやすいAuroraですが、個別のインスタンスに適用する「DB パラメータG」が優先で、「DB パラメータG」がデフォルトの際に「DB クラスターパラメータG」が適用されると理解すると良いようです。

以上、何かのお役に立てれば幸いです。