当ブログと月間15万PVほどあるWebサイトを運営している筆者。
どちらもWordPressで運用しているのですが、月に1~2回は突然「データベース接続エラー」が発生し、サイトが落ちてしまいます。
今回はこの問題の原因と解決法をご紹介します。
原因:メモリ不足によるMySQL(MariaDB)のダウン
ほとんどの場合、「メモリ不足によるMySQL(MariaDB)のダウン」が原因です。
サーバーのコンソールでデータベースの稼働状況を確認しましょう。動作が停止していることが確認できると思います。
LinuxにはOOM-Killer(Out-of-memory Killer)という機能が搭載されており、メモリが不足すると、メモリを多く消費しているプロセスから強制終了を行います。
MySQLはメモリ消費が大きいほうなので、Webサイトへのアクセスが集中するなどしてメモリ不足が起こると、まずもってMySQLもkillされてしまいます。
結果的にデータベースにアクセスできない=「データベース接続エラー」が発生するというわけです。
対策:メモリを増やす+OOM-Killerの監視対象から外す
対策は次の2つです。
メモリを増やす
一番かんたんなのはメモリを増やすことです。
メモリに余裕があれば、OOM-Killerも発動しなくなり、サーバーの動作にも余裕が出ます。普段から空きメモリに余裕がない場合はメモリを追加したほうがいいでしょう。
OOM-Killerの監視対象から除外する
一方で、Webサーバーのメモリ使用率は、アクセス状況によって大きく変動します。
どんなにメモリを増やしたところで、アクセスが集中したときにメモリ使用量が瞬間的に増加し、OOM-Killerが発動する可能性は完全には排除できません。
そこで、OOM-Killerの対象からMySQLを外すことにします。
サービスの定義ファイルでOOMScoreAdjustという数値を設定すると、OOM-Killerの監視対象から除外することができます。MySQL(MariaDB)のサービス定義ファイルを編集し、OOM-Killerの監視から除外します。
# systemctl edit mariadb.service
エディタが開くので、以下を追加します。
[Service]
OOMScoreAdjust=-1000
セーブしてmysqlを再起動します。
# systemctl restart mariadb.service
これにより、どんなに空きメモリに余裕がなくなっても、MySQLはkillされなくなります。
まとめ
今回はWordPressのデータベース接続エラーの解決法についてご紹介しました。
「ちゃんと稼働できていたのに、ある日突然データベース接続エラーが出てしまう」というケースでは、ほとんどがメモリ不足によるMySQLのダウンが原因です。
メモリ増設に加え、OOM-Killerの設定を調整することで、意図しないデータベースのダウンを避けることができますよ。
コメント