
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.障害発生時に大切なこと
これは自分に言い聞かせてますが、障害が発生したら応急処置は必要ですが、必要なログを取得することも忘れずにお願いします。
困ったら再起動と言うけれど、再起動すると大事なログが消失してしまう可能性があります。
早くしろ!!!!とお客さんに言われても、取れるものは取って再発防止に備えてください。
DBエンジニアのカケルと申します。
父親が国家公務員だった為、小学校と中学校の入学と卒業した学校が違う為、
環境へ溶け込めるの得意な方です。
学生の頃はバスケをやっており、ランニングが趣味です。
ハーフマラソンは完走経験があるので次はフルマラソンも視野に入れるか検討中。
ハマると2年は続ける傾向あり。
ボーリング2年(ハイスコア238、最高アベレージ170)
スキューバー2年(沖縄、伊豆、グアムでのエントリー経験あり、50本くらい)
ゴルフ2年(最低スコア231、最高スコア117)
仕事はスタートアップ事業の黒字化に向けて、マーケターのサポートしてます。
必要なデータのプラスワンを見出すためには何が必要か?を求めながら仕事してます。
コメント ( 0 )
トラックバックは利用できません。
この記事へのコメントはありません。