こんにちは、cloudpack今岡 です。

Amazon RDS はインスタンスのスペックに応じて、自動でDBパラメータを調整してくれるのが売りでもありますが、どうしても変更したいパラメータがあったりします。有名なところでは

  • max_allowed_packet
  • character_set_xxx 系

この辺りのパラメータや、もっと重いパラメータ(クエリキャッシュの有効化等) 変更時に、DBリブートはかかるのか、かけなくていいのかを検証します。今回はとりあえずMySQLです。

リブートが掛かっていないかの確認

スクリプトを用意しました。しょうもないスクリプトですが、使ってください。

#!/bin/bash

while :
do
 dt=$(date)
 state=$(timeout 5 mysqladmin ping -u -p -h)
 echo $dt-$state
 sleep 1
done

failoverをやった場合に、 mysqladmin が接続を掴んで離さず、正確な停止時間が測れなかったので、 timeout を使ってみます。今回はfailover関係ないですが、一応入れたままで使います。 使い方は

$ ./mysqlping.sh > reboot.txt &
$ tail -f reboot.txt

とか、 tee でもいいですよ。

中身未設定のParameter Groupsを適応した場合

Parameter Groups を作成し、RDS Instance に適応しただけではリブートはかかりませんでした。 但し、マネジメントコンソールの表示は下記のように変化します。 設定直後
RDSでParameter Groups変更時のDBリブートについて: Parameter Groups を設定直後
設定後しばらくたったら
RDSでParameter Groups変更時のDBリブートについて: Parameter Groups を設定後しばらく経った状態
pending rebootとなります。リブートは自動でかからないけど、リブートしないとParameter Groupsとして、 paramtest は適応しないよ!という意味です。そのため、手動リブートが必要です

Dynamicなパラメータを変更する

Parameter Groupsの設定画面で下記のような列があります。
RDSでParameter Groups変更時のDBリブートについて: Dynamicなパラメータを変更する (1)

これ、だいたい分かりますよね?たぶん

  • Dynamic = DBリブート不要
  • Static = DBリブート必要

だろうと、そう思ったら検証です。 Dynamic でおそらくいちばん弄られているであろうパラメータを下記のように変更します。
RDSでParameter Groups変更時のDBリブートについて: Dynamicなパラメータを変更する (2)

先の工程で、 paramtest というのを一旦空で作成し、適用だけはしているので、マネジメントコンソールで確認すると、一旦 applying になり、
RDSでParameter Groups変更時のDBリブートについて: Dynamicなパラメータを変更する (3)

すぐに in-sync となります。リブートは自動で掛かることもないし、掛ける必要も無いです。
RDSでParameter Groups変更時のDBリブートについて: Dynamicなパラメータを変更する (4)

Staticなパラメータを変更する

今度はリブートが必要であろうパラメータ query_cache_type を変更します。このパラメータは文字通りのクエリーキャシュですね。MySQLというかRDSはデフォルトNOなのか、、へぇそうなんだ。まずは変更前に mysql コマンドで直接確認。

mysql> show variables like 'query_cache_%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
5 rows in set (0.00 sec)

OFFですね。ではマネジメントコンソールで変更した直後のステータスは
RDSでParameter Groups変更時のDBリブートについて: Staticなパラメータを変更する (1)

自動でリブートはもちろん掛からないが、しばらくすると
RDSでParameter Groups変更時のDBリブートについて: Staticなパラメータを変更する (2)

でた、 pending reboot ということですので、手動でリブートする前に、パラメータ確認しましょう。

mysql> show variables like 'query_cache_%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
5 rows in set (0.00 sec)

OFFのまんまですね。

では、手動リブートし、しばらくした後確認したら。

mysql> show variables like 'query_cache_%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
5 rows in set (0.01 sec)

ONになったよ!

まとめ

  1. Parameter Groups の変更や、割り当て作業で、自動でリブートかかることはない。
  2. Dynamicのパラメータ変更については、リブート不要。但し、Parameter GroupsのDBインスタンスへ割り当てと、同時に実行するなら、リブートは必要
  3. Staticのパラメータについては、リブート必須

とりあえず、RDSを立てたら、問答無用で Parameter Groups を一個作成し、適応、そしてリブートまでかけておけば、後からDynamicパラメータ変更となってもリブートの心配は不要ですし、損はないです。

元記事はこちらです。
RDSでParameter Groups変更時のDBリブートについて調査してみた