mysql DBコネクション数急上昇の障害対応したこと

この前、AWSのシステムでMySQLを利用しているのですが、
DBへ接続できない事象がありました。

構成は下記の通り
EC2サーバー
Mysql
Apache

Topページに移動できるがログインしようとしたらタイムアウト。。。

システム障害発生。。。また、障害に出くわせてしまった。。。

1.現象確認

AWAのコンソールにログインし、CloudWatchにて稼働状況を見たところ、
メモリの負荷異常なし、CPU使用率異常なし。

Database Connections Sumを調べたら、凄く急上昇している。
※Database Connectionsについては「5.Database Connections Sumについて」を参照

2.応急処置①(プロセス確認)

この事象の場合はRDSへ接続できるかを確認したら、接続できました。
※接続できないかつ、緊急性が高い時は何分か待って、再起動するしかないよね。

今回の暫定対応の結論はSLEEPになっていたプロセスを殺しました。

接続できたのでプロセスの状況がわかるコマンドを実行

実行ログ

show full processlist \G

*************************** 1. row ***************************
Id: 1
User: rdsadmin
Host: localhost:aaaa
db: mysql
Command: Sleep
Time: 13
State:
Info: NULL
*************************** 2. row ***************************
Id: 3931350
User: root
Host: nnn.sss.nnn.mmm:aaaa
db: mysql_test
Command: Sleep
Time: 6945
State:
Info: NULL
*************************** 2. row ***************************

3.プロセスリストのカラム説明

プロセスに関する説明を簡単に書きます。

 Id:プロセスID
User:プロセスの利用者
Host : サーバー名もしくはIP
Command:処理を取得しているステータス
Query : 実行しているSQL
Sleep : 処理待ち
※他にもありますが、今回のケースではこちらしかなかったのでほかは割愛します。
Time:プロセスが発生してから経過した時間(秒)
State : 具体的な状況(Queryの場合はSQLが表示されます)
Info : ステートメントが何も実行されていなければNULL
※プロシージャをCALLしている場合は値が入る場合があるそうです。

4.プロセスを殺す

今回はCommandがSleepかつ、Timeの値が大きいプロセスを殺しました。

実行したコマンドはこちらです。

KILL 3931350;

こちらを実行したら、Database Connections Sumが下がり、
復旧しました。

5.Database Connections Sumについて

Database Connections Sumは、データベースに接続して処理中の合計数です。

処理が完了しましたら、connectionは減少します。

connectionが増加する理由は下記の通り。
①SQLの実行結果が遅い
②connectionが中途半端に残っている
③急激にアクセス数が増える

4.恒久対応(再発防止策)

SQLの実行が遅い場合は実行計画を実行して、なぜ遅いかを分析したほうが良いです。

実行するコマンドはこちら
EXPLAIN SELECT * FROM test

こちらを見て、インデックスを貼るかを検討する。

※後日、インデックスの貼り方について記事を書こうかと思います。

5.遅いクエリやボトルネックになるSQL特定方法

slow_query_logもしくはgeneral_logから特定することが多いです。
※show full processlistに出力されていたら、それで対処するのがベストですが、
キャッチできるかわからないのでこちらのログにて特定してます

Slow Query : 処理が遅いSQLが出力されるログ
general_log : 実行されたSQLがすべて出力される
※general_logを設定するとサーバー負荷が上がってしまうので、設定する時は要検討が必要です。

上記のログはAWSのコンソールのパラメータグループの設定変更で処理できます。
RDS > パラメータグループ > RDSのインスタンス名から変更できますが、
slow_query_log、general_logの設定変更はサーバーの再起動が必要になります。

6.障害発生時に大切なこと

これは自分に言い聞かせてますが、障害が発生したら応急処置は必要ですが、必要なログを取得することも忘れずにお願いします。

困ったら再起動と言うけれど、再起動すると大事なログが消失してしまう可能性があります。

早くしろ!!!!とお客さんに言われても、取れるものは取って再発防止に備えてください。

関連記事一覧

  • コメント ( 0 )

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。