ブログの話です。案件じゃないです。残念だったな。

ホントにクソ詰まったから障害報告をする。

◆背景

こないだ、このブログのお引越しをした。AzureのApp Serviceというクラウドサービス上にあったのを、今回はGCPというクラウドサービスの仮想マシンに移動した。

そいで、CloudflareというCDNサービスを利用するようにした。CDNっていうのは、Webページの情報を適当な場所に保存して、そこから配信することによってサイトの速度向上を図ったり負荷を低減させたりするものだ。Cloudflareはもっと多機能だったりもする。

DebianというOSが動く仮想マシン上にbitnamiをぶち込んだ。結果nginx、php-fpm、MySqlがうごめいている。nginxはサーバー。MySqlはデータベース。php-fpmは

っていう風に丁寧に解説してると文章量がえぐいから程々にしておく。

◆死亡

2019/6/27の夕方ごろ、ブログのページを表示しようとしたら妙に反応が遅い。数分待ったのち

Error 524: A timeout occurred

という表示がされた。これはCloudflareくんが表示している画面だった。「Cloudflareまで来てっけど、お前んとこのサーバーがタイムアウトしたで。」という表示だ。

やめてくれぇ

障害が起きた時は、とにもかくにも原因の切り分けです。これまでの情報からわかることは

  • DNS生きてて
  • Cloudflare生きてて
  • Cloudflareからサーバーへの問い合わせは成功していて
  • 戻ってこない

うん。

◆直接IPアドレスをたたく

http://34.67.37.11/

五分待って

504 Geteway Time-Out

という表示がされた。つまりサーバーが生きていることが分かる。到達できなかったら違うHTTPステータスコードになりますね。

参考:HTTPステータスコード

◆止めゆ

いったん止めよう。落ち着こう。そうしよう。

GCPのDeployment Manager行って、対象のリソースを選択。

「SSH」ってボタンがあるから何となくクリックしてリソースに潜入した。

コマンドであれこれ止めよう。

sudo /opt/bitnami/ctlscript.sh stop nginx
sudo /opt/bitnami/ctlscript.sh stop php-fpm
sudo /opt/bitnami/ctlscript.sh stop mysql

記憶がもう失われててあれなんだけどとにかくMySQLが怪しくねぇかという話になり、MySQLだけ起動。

sudo /opt/bitnami/ctlscript.sh start mysql

で、MySQLにログインしなけりゃならん。

◆MySQLにログイン

さっきのDeployment Managerのページあんじゃん?そこにAdmin passwordって記載があると思うんだけど、そのパスワードでMySQLにログインできた。

SSHで以下のコマンドをうちこむ。

mysql -u root -p

「Enter password:」とか表示されるんで、件のパスワードを入力。

◆原因究明

サイトが動いている時、「show processlist;」コマンドを打ち込んだところ、返ってこねークエリが数件見つかった。何だかんだあった結果、ログファイルが超大量に吐き出されているという事が判明した。クエリ内容を見た結果、jetpackがクエリ投げまくってるらしい。

◆原因

まずjetpack。

※以下の手順はやる必要なし。

sshでログインして、

cd /opt/bitnami/apps/wordpress/htdocs/wp-content/plugins

して

mv jetpack _jetpack

して、bitnamiのrestart叩いたら戻った。

次、MySQLくん。

https://dev.mysql.com/doc/refman/5.6/ja/binary-log-setting.html

つまるところ、データ更新した結果影響のあった行をすべてログとして保存しやがっていたのだ。馬鹿か。

◆解

MySQLにログインした状態で

show master logs;

すると、大量のログを見ることが出来る。

下記のコマンドで削除。000232って数字は適当だから、show master logsで見えてる一番大きい数字に読み替えろ。

purge binary logs to 'binlog.000232';

そいで、このままじゃ使い物にならんのでログの取り方を変更。

SET GLOBAL binlog_format = 'STATEMENT';

かまして「my.cnf」ファイルで

binlog_format=statement
expire_log_days = 3

追加した。

※やり方をめもる。あとで。

反省点として、最初にpluginsをplugins2にリネームして復帰しなかったからウンコだった。bitnamiの再起動をかけるべきだった。

◆結論

いろいろ勉強になったわ。とくにMySQLとnginx。

涙の数だけ強くなれる系エンジニア。

でもMySQLはマジに許さんからな。