[AWS] RDSのパラメータグループ仕様変更がクリティカルな件

By | 2019年2月14日

 最近、RDSのクラスターパラメータグループで仕様変更があったようです。
具体的には、今までクラスターのパラメータグループに設定できなかった項目が追加されたようです。

 ここで問題なのがmax_connectionなどDBパラメータグループでも設定できる項目があることです。

 そうなると、クラスターパラメータグループで設定した値DBパラメータグループで設定した値はどちらが優先されるのかが心配になりますね。
 というか仕様変更される以前からRDSを立てていた場合には、クラスターパラメータグループの仕様変更を知らないまま過ごすことになるので、影響範囲を把握しておかないと少々危険です。

 ということで今回は、パラメータグループの仕様について調査しました。

 

パラメータグループの変化


 これは検証用に作成したクラスターのパラメータグループです。
今までは設定できなかったmax_connectionsの設定が表示されていることが分かります。


 そしてDBパラメータグループの設定にも当然のごとくmax_connectionsがあります。

 『え、ちょっと待って???
 クラスターのパラメータグループとDBのパラメータグループで別々のmax_connectionsが設定できちゃうやん???』

 って思ったことが今回の記事の発端です。

 ちなみに仕様変更以前に作成したクラスターのパラメータグループは、追加項目が全てデフォルト値になっていました。

 

検証準備


 まずは検証用に作成したパラメータグループを当て込んだ新規のクラスターとDBインスタンスを作成します。


 そしてクラスターのパラメータグループで接続上限数を10に設定します。


 DBのパラメータグループの接続上限数は1にしました。

さて、どちらが優先的に適用されるんでしょうか・・・?

 

なぜか接続上限まで接続できない


「Too many connections」ということで接続上限に達しているためアクセスできませんでした。


 ただしメトリクスを見る限りでは接続数は0です。

 
 ということで、上記の謎の現象について先に調査することにしました。
クラスターパラメータグループとDBパラメータグループを両方とも接続上限10にして、10個のコネクションを試みます。


 10人分のユーザーで全て接続できることに期待したのですが、実際には7ユーザー分しか接続できませんでした。


 メトリクスを確認しても接続数は7止まりです。
つまりmax_connectionsで設定した上限まで接続できませんでした。


 rootアクセスが私の検証接続ですが、rdsadminという見慣れないユーザーが4件表示されています。
 接続元がlocalhostなので、AWS側で必ず接続されるユーザーなのかもしれません。

 ということでmax_connections通りの接続数にならない理由は、rdsadminという管理用ユーザーが接続枠を取っているからですね。ちなみにrdsadminはメトリクスに表示されないようです。AWSに問い合わせたから間違いない!


 max_connectionsを変更しても、リードレプリカを追加しても、DBを再起動しても、必ずrdsadminが4つ出てきます。

 ということで少なくともmax_connectionsは5以上を設定してあげるべきかもしれません。とは言ってもSleep状態なので放置していればrdsadminは時間経過で自然消滅すると思います。


 ちなみに時々変なのも出てきます(笑)

 接続上限に達していないのにToo many connectionsになる場合にはこういった感じで何らかの原因があるのかもしれません。

 

パラメータグループの検証結果

◆検証1
・新規にクラスターとDBインスタンスを立ち上げる
・クラスターパラメータグループのmax_connectionsをデフォルトのまま
・DBパラメータグループのmax_connectionsを10にする
・「SELECT @@max_connections;」 の結果、max_connectionは10。
 ↑DBパラメータグループが適用されている

◆検証2
・検証1の後の環境をそのまま使う
・DBパラメータグループのmax_connectionsを10のまま
・クラスターパラメータグループのmax_connectionsを5にする
・「SELECT @@max_connections;」 の結果、max_connectionは5。
 ↑クラスターパラメータグループが適用されている

◆検証3
・検証2の後の環境をそのまま使う
・クラスターパラメータグループのmax_connectionsを5のまま
・DBパラメータグループのmax_connectionsを20にする
・「SELECT @@max_connections;」 の結果、max_connectionは20。
 ↑DBパラメータグループが適用されている

 つまり、最後に更新したパラメータグループの設定が適用されます!!

 ただし、今回の例で言うところのmax_connections以外の項目を更新した場合には接続数は変更されません。例えば、検証3の後の環境で、max_connections以外のクラスターパラメータグループを更新しても、接続上限数は20のままです。

 

終わりに

 クラスターパラメータグループと、DBパラメータグループで重複する項目は最後に更新した方が優先的に適用されます。クラスターパラメータグループでは後から表示された項目がありますので、気がついたら予期せぬ値になっていたなんてことがないようにしっかり注意したいですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)