はじめに
RDS の DB インスタンスを新規に作成する際、何も指定しないとデフォルトのパラメータグループを使う設定となります。
デフォルトのパラメータグループなので、それなりに標準的な設定になっており、とりあえずはこれを使っておくのが無難かなと思っていましたが、大きな間違いでした、、、というお話です。
かなり初歩的なお話ですね。。。
ちなみに、MySQL 前提での話ですが、PostgreSQL など他のエンジンでも基本的には同じ話だと思います。
デフォルトのパラメータグループを使うと起きる問題
DB を使っていると、設定を変更したくなることが多々あります。
例えば、私の場合は DB インスタンスのリソースがまだガッツリ残っているのに Too many connections が出るようになったので、max_connections を引き上げたくなりました。
それ以外でも、例えば、slow_query_log を出したい/出したくないとか、その閾値 long_query_time を変えたいなどといったことはよくあると思います。
しかしながら、、、デフォルトのパラメータグループではパラメータの設定変更が一切できません!
つまり、どうしても設定変更をしたいのであれば、まずは DB インスタンスが使用しているパラメータグループ自体を変えないといけないことになります。
さらに、、、使用するパラメータグループを変更する際には、DB インスタンスの再起動 が必要となります。
つまり、サービスが止まります。
この辺の話が、下記の AWS のページに記載されています。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-modify-parameter-group-values/
DB インスタンスを作成する際に、安易にデフォルトのパラメータグループを使うことを選択しただけでサービス停止を余儀なくされるのは、サービスによってはとても痛いと思います。
独自のパラメータグループを作成することはまったく難しくないので、DB インスタンスの作成時には必ずパラメータグループも新規に作成するクセを付けるくらいで良いと思います。
パラメータグループの設定パラメータの変更
稼働中の DB インスタンスで使われているパラメータグループの設定パラメータの変更は、DB インスタンスの再起動無しに動的に行えます。
ただし、動的パラメータと呼ばれるパラメータのみで、静的パラメータの変更後の有効化には再起動が必要となります。
パラメータグループの共有
独自に作成したパラメータグループを複数の DB インスタンスで共有することも可能です。
これはこれで便利な仕組みなのですが、注意が必要です。
設定パラメータの変更は、あくまでもパラメータグループの内容の変更になります。
従って、設定パラメータを変更するとそのパラメータグループを参照しているすべての DB インスタンスの設定が変更されます。
よって、明確に設定値を揃える必要がない限りは、基本的にはそれぞれの DB インスタンスには別々のパラメータグループを用意するのが無難だと思います。
※例えば、同じ種別の複数台のreadレプリカには同じパラメータグループを割り当てた方が都合が良いといったことが考えられます。
結論
- サービスを簡単に停止できない DB インスタンスにはデフォルトのパラメータグループは使わない
- 特別な理由がない限りは、パラメータグループは DB インスタンスごとに作成して関連づける
あくまでもザックリとした個人的な感覚レベルなので、ベストプラクティス的な情報があれば教えていただけるとありがたいです。