真夏のMySQL!! HDDいっぱいで緊急停止事件簿 ITかあさん

ITかあさん

真夏のMySQL!! HDDいっぱいで緊急停止事件簿

down-your-site

真夏の怖い話と言えばやっぱりあれですよね

真夏ですし、今日は恐怖の怪談話をしましょう。。
突然電話が鳴ってですね、こう言われるんですよ。。。。。

「サイト落ちてますよ」

いやあああああああああ!!!!!!!!!

Webエンジニア恐いのは、幽霊じゃない、妖怪じゃない、ゾンビじゃない!!
「サイトが何故か落ちてる」問題!!

震える指先、笑うヒザ。。安定運用を3年、なーんの異常もないまま3年経過した運用サーバ。(VPS) クラウドじゃないのでオートスケール対応してないので、何らかの事情で落ちるケースもある。お安いVPS。落ちることもたまにはあるでしょう。

過去の経験則から Apacheかと推測し、とりま再起動しようとするも。。あれ?Apacheは落ちてない。

??

セツコ!!落ちたのはApacheやない!MySQLや!

アンちゃん。。。。

MySQLもアクセス不可で落ちることもありますね。

MySQLを再起動するも。。。。。

# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [FAILED]

※CentOS6の運用サーバのため、古いコマンドです

??あれ?停止したあと起動しない

# /etc/init.d/mysqld start
MySQL Daemon failed to start.
Starting mysqld: [FAILED]

!!!!!????????

起動しない!!

何度やっても起動しない!

down-your-mysql

運用サーバのMySQLが死亡した模様。。

ギャーーーー!!!!!

落ち着いてMySQLのログを確認することに。

# tail -f /var/log/mysqld.log
2017-07-25 12:52:43 29864 [ERROR] /usr/sbin/mysqld: Error writing file '/var/run/mysqld/mysqld.pid' (Errcode: 28 – No space left on device)
2017-07-25 12:52:43 29864 [ERROR] Can't start server: can't create PID file: No space left on device

No space left on device?? お前のデバイスはもう空きがない、HDDがいっぱいで起動出来ないですと??

df コマンドで、ディスクの空き容量を調べる

-hオプションで容量に対してそれっぽい単位で表示してくれます

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 98G 93G 0 100% /
tmpfs 1003M 0 1003M 0% /dev/shm

100%!!!!use 100%!! もう全く容量が完全に限界まで使われていました。

今回運用していたサーバは格安のVPS。クラウドではないため 容量アップも出来ません。そもそもコンテンツとしての容量も100GB容量のVPSに10GB程度しか積んでません。

でも原因は分かりました。何かがHDDの容量を圧迫していてMySQLの起動に失敗しているようです。

HDDの容量を圧迫している箇所を知る方法

# sudo du -sh /*

.
.
.
8.0K /tmp
789M /usr
90G /var

これでどのディレクトリがどれだけの容量のデータを積んでいるのかわかります。varが90Gも持ってることが分かりますね。
あとはディレクトリの階層を掘りながら再びds

# du -sh /var/*
.
.
.
8.0K /var/lock
90G /var/log
0 /var/mail
.
.

HDDの容量90%を占める溜まりまくったクソログが原因と判明。。
btmpとsecureのログがかなり溜まっている様子。サーバへの不正ログイン系ですね。
確かにSSHは22番ポートをデフォルトで使っていましたが、こういう不正ログインのクソログの温床にもなるのでやはりsshのポートは22以外にしておくのがベータのようです。

# cd /var/log
# ls -ll
total 6968212
-rw——- 1 root root 0 Feb 23 2015 anaconda.log
-rw——- 1 root root 0 Feb 23 2015 anaconda.program.log
-rw——- 1 root root 0 Feb 23 2015 anaconda.storage.log
-rw——- 1 root root 0 Feb 23 2015 anaconda.syslog
-rw——- 1 root root 0 Feb 23 2015 anaconda.xlog
-rw——- 1 root root 0 Feb 23 2015 anaconda.yum.log
drwxr-x— 2 root root 4096 Jul 24 02:45 audit
-rw-r–r– 1 root root 33415 Sep 14 2015 boot.log
-rw——- 1 root utmp 4422120960 Jul 25 13:08 btmp
-rw——- 1 root root 10876 Feb 26 2015 cron
-rw-r–r– 1 root root 19284 Sep 14 2015 dmesg
-rw-r–r– 1 root root 19284 Feb 25 2015 dmesg.old
drwx—— 2 root root 4096 Feb 26 2015 httpd
-rw-r–r– 1 root root 148044 Jul 25 12:35 lastlog
-rw——- 1 root root 8450523 Jul 25 13:12 maillog
-rw——- 1 root root 277469 Jul 24 15:33 messages
-rw-r—– 1 mysql mysql 4865748 Jul 25 13:12 mysqld.log
drwxr-xr-x 2 ntp ntp 4096 Nov 29 2011 ntpstats
-rw——- 1 root root 2692548419 Jul 25 13:08 secure
-rw——- 1 root root 0 Feb 23 2015 spooler
-rw——- 1 root root 0 Feb 23 2015 tallylog
-rw-rw-r– 1 root utmp 36480 Jul 25 12:35 wtmp
-rw——- 1 root root 4197 Dec 21 2015 yum.log

このほかApacheでも大量のログを持っていることが判明。

# du -sh /var/log/httpd/*
0 /var/log/httpd/access_log
168K /var/log/httpd/error_log
488K /var/log/httpd/ssl_access_log
664K /var/log/httpd/ssl_error_log
624K /var/log/httpd/ssl_request_log
6.8G /var/log/httpd/virtual-access_log
76G /var/log/httpd/virtual-error_log

溜まったログを削除していきます。

手順はどのログの削除も一緒なのでbtmpのみ記載します

rm btmp
rm: remove regular file `btmp'? y (本当に消していいの?と聞かれるので”y”で)

touchして権限を600にしておきます。同様に全てのクソログ溜まったログファイルを同様の手順で一度削除して、新しくファイルを作ってください。

# touch /var/log/btmp
# chmod 600 /var/log/btmp

ファイルをrmしたはずなのに、HDDの使用量に変化がない!!

やばいファイルをrmしたはずなのに、HDDの使用量に変化がほぼ変化が起きない

参考

rmでファイル削除後にdf -hで容量が減らない時の対処(Linux)
参考の通りなのですが、プロセスが活きている使用中のファイルはrmしても変化が無いようです。
今回だと調べた結果、一番ヤバいログはhttpdに関連するログでした。対象のログファイルをrmしたあとhttpdを再起動したところ無事HDDの使用量は劇的に減りました

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 98G 5.8G 87G 7% /
tmpfs 1003M 0 1003M 0% /dev/shm

# /etc/init.d/mysqld start
MySQL Daemon failed to start.
Starting mysqld: [OK]

無事起動が確認できました

まとめ

サーバ管理の専門職では無いためやはり運用しているサイトのサーバが落ちると焦ります。が、やはり冷静にログを見れば解決方法は必ずあるはずなので。
サイトが落ちたときの監視として クラウドサーバ以外のサーバでは外部サービスで80ポート監視して一定時間応答がなければメールでお知らせするように設定していました。
今回だとMySQLが完全に落ちてしまい、アクセス不可による停止出なかったた80ポートは正常動作。これにより発見が遅れてしまいました。
クラウドサーバだとこれらHDDの容量制限が危なくなるとメールでお知らせしてくれるものですが、格安VPSにはこれらは自分で監視しなければなりません。。
やっぱりクラウドが何かと安心で便利。月額1000円程度のVPSは月間数万PVくらいしか耐えられないかもしれません。やはり今回の運用サイトは移転が必要かもしれません。
あ、なお今回落としたのはITかあさんブログではありません。ITかあさんはクラウドでオートスケールに対応しているからです。
今後はログも含めたHDDの容量の監視にも目を光らせていと思います。まる。

初夏のJavaScript祭 in サーキュレーションビル ForPro