まじかよ!!
昨日CentOSのOSアップデートしたら、勢いよくZabbixがBAD requestを返すようになったぜorg
簡単な内部構成図
Zは、Zabbix Aは、Apache NXは、Nginx RPは、ReverseProxy Jは、Jenkins
数字は、内部はそのPortで通信させて、NginxでReverseProxyでFront側を制御している。そして、ドメインベースのSSL証明書を入れてFront側は完全にSSLで443通信させている。
何はともあれ調査
yum logを確認して何がアップデートがかかったかを確認する。その上でZabbixログ確認とsyslogみたり、MariaDBプロセスが上がっているとか、DBにログインしたりして状況を把握する。
状況
今回ログからMariaDBがアップデートされていることは確認したので、今度はプロセスが上がっているかを確認したら、問題無くprocessはあがっていてDBにログインも出来たので、DB自体が壊れた訳ではなさそうです。ただ、ログを見る限りどうも、MariaDBとZabbixが同時にアップデートされた模様。
Zabbixログを確認すると、Zabbixパッケージのアップデートが終わって、DBをアップデートしてる最中に構造が壊れてそこで止まってるようだ。DBにログインしてみるとテーブルが激しく破損している。
原因
状況証拠をもとに考えると、yum updateでZabbixがアップデートしてauto起動でreloadしてDBテーブルをアップデートしてる最中に、MariaDBアップデートは走りアップデート途中でMariaDBプロセスがダウンしたため、もはや動作環境としては破損した状況に陥った。
復旧
もう、とっとと復旧しましょう。今Zabbixが動いてるサーバは1日1回スナップショットをOSまるってとっているので、スナップショットからインスタンスを作成する。
スナップショットを取った時は、もちろん破損してないので何も無く起動してくる。そこからDBdumpを作成し、そのデータをローカル経由で今回壊れたサーバの/tmp位において、DBdumpをインポートする。
DBdump : mysqldump –single-transaction -u zabbix -p qqqqaaaavvv > /tmp/zabbix.db.sql
DBDump import : mysql -u zabbix -p qqqqaaaavvv < /tmp/zabbix.db.sql
その上でZabbixを起動してやると、DBアップデートが走るので正常に完了で動き出す。しかし、まだBADrequestを返す。
こちらで使っているZabbixは、内部を別ポートでフロントをnginxでリバプロ接続している。フロント側が443で通信している関係で、apacheアップデートしたときに、何故かSSLで起動して来て既にnginxが443を掴んでいたので、apacheが上がらずBADrequestを返していたようです。ssl.confをリネームして再起動して問題なく画面出るようになりました。
教訓
yum updateでリストをみて、ZabbixとMariaDBがアップデートが重なる時は、一端Zabbixを除外してアップデートしてから、後でZabbixをアップデートするようにしよう。もしくは、Zabbixを落としてからアップデートを行うと共にアップデート前に、DBdumpをとっておこう。OSごとスナップショットを取って復旧できるようにしておこう。
やれやれ 2時間位かかりましたw疲れますね。