AWSのRDSがファイルオーバ時、ZabbixがRDSに再接続しない
以下の環境でZABBIXを構築しております。
Zabbix: zabbix_server (Zabbix) 3.0.0alpha4
OS: AWS上のEC2インスタンス Amazon Linux AMI 2015.09
DB: AWS上のRDSインスタンス エンジン MySQL 5.6.23
事象:
RDSを再起動(フェイルオーバ)させたところ、以下のログが出力されて
Zabbix~RDS間の接続が切断されたように見えますが、
その後、30分間に渡り放置状態でしたが、自動で再接続されませんした。
質問事項:
1)Zabbix側からMYSQLのDBに再接続させるためには、何かしらの設定が必要でしょうか。
2)または、これは3.0.0alpha4 ということでの不具合でしょうか。
3)それとも、DBとしてAWSのRDSを使用する場合には制約が存在するのでしょうか。
お手数ですが、ご教示をお願いいたします。
ログ: zabbix_server.log
[Z3001] connection to database 'zabbix' failed: [2003] Can't connect to MySQL server on 'dbname.rds.amazonaws.com' (110)
watchdog: database is down
[Z3005] query failed: [2013] Lost connection to MySQL server during query [select h.hostid,h.host,h.name,t.httptestid,t.name,t.variables,t.headers,t.agent,t.authentication,t.http_user,t.http_password,t.http_proxy,t.retries,t.ssl_cert_file,t.ssl_key_file,t.ssl_key_password,t.verify_peer,t.verify_host from httptest t,hosts h where t.hostid=h.hostid and t.nextcheck<=1453455611 and mod(t.httptestid,1)=0 and t.status=0 and h.proxy_hostid is null and h.status=0 and (h.maintenance_status=0 or h.maintenance_type=0)]
14955:20160122:185554.639 [Z3005] query failed: [2013] Lost connection to MySQL server during query [select distinct r.druleid,r.iprange,r.name,c.dcheckid,r.proxy_hostid from drules r left join dchecks c on c.druleid=r.druleid and c.uniq=1 where r.status=0 and (r.nextcheck<=1453455623 or r.nextcheck>1453455623+r.delay) and mod(r.druleid,1)=0]
14956:20160122:185600.271 [Z3005] query failed: [2013] Lost connection to MySQL server during query [begin;]
14956:20160122:185600.271 slow query: 939.508485 sec, "begin;"
14953:20160122:185601.810 [Z3005] query failed: [2013] Lost connection to MySQL server during query [begin;]
14953:20160122:185601.810 slow query: 931.022981 sec, "begin;"
14958:20160122:185605.391 [Z3005] query failed: [2013] Lost connection to MySQL server during query [begin;]
14958:20160122:185605.391 slow query: 939.627227 sec, "begin;"
TNK - 投稿数: 4740
RDSの場合、フェールオーバーした時にIPアドレスが変わっている
のではないでしょうか?
データベースのクラスタリングの方法によっては、仮想的なIPアド
レス(VIP)を共有して、フェールオーバーが発生しても同じVIPでア
クセスできるので、最初にFQDNから名前解決したVIPを利用して再
接続することができます。
RDSの場合は、そのようなVIPを利用する形式ではなく、DNSの情報
を変更して対応していたと思うので、そうすると現時点のZabbixの
実装で、データベースへの再接続時にDNSでの名前解決からはやり
直さない実装になっていると、Zabbix側が何度再接続しようとして
もIPアドレスが変わってしまっていて接続できていないのではない
でしょうか?
先に書かせていただいた通りであれば、設定では回避できません。
関係ありません。
以前のバージョンでも同様の問題は発生すると思います。
恐らく、その状態から復旧するにはzabbix_serverの再起動が必要
になると思います。
別の監視の仕組みと組み合わせて、RDSのフェールオーバーが発生
して、zabbix_serverからデータベースへの接続ができない状態が
発生した時にzabbix_serverを再起動する仕組みを実装している方
もいらっしゃるようです。
例えば、swatchなどを利用してzabbix_serverのログを監視する方
法もあるでしょう。
ただし、自動復旧の仕組みを実装した場合に、メンテナンス時にそ
の自動復旧の仕組みを停止することを忘れてしまうと、再起動の処
理を繰り返し続けたりしてしまうことが予想されますのでご注意く
ださい。
# Zabbixのソースの再確認や実際にRDSで環境を構築して確認は行
# っていません。
zab-SR - 投稿数: 14
TNKさん、コメントありがとうございます。
>RDSの場合は、そのようなVIPを利用する形式ではなく、DNSの情報
>を変更して対応していたと思うので、そうすると現時点のZabbixの
>実装で、データベースへの再接続時にDNSでの名前解決からはやり
>直さない実装になっていると、Zabbix側が何度再接続しようとして
>もIPアドレスが変わってしまっていて接続できていないのではない
>でしょうか?
ZABBIX → RDSはDNSを元に接続しているのですが、DNS情報自体はフェイルオーバ後も変更ありません。
ただ、AWS上のZONEはフェイルオーバ後に変更されていますので(Multi-AZ)、
IPアドレスは見えないのですが当然変わっていると思います。
この場合、Zabbixの実装として、DNSからあらためて名前解決して再接続はしないという理解でよろしいでしょうか。
なお、1)2)の ご回答ありがとうございました。
3)は、、 そうなんですね。LINUX、Zabbixともまだまだ勉強中で、新たな作り込みは避けたいなぁと思ってますが、どうしようもないですかね。
ちなみに現在は、TNKさんのおっしゃる通り、手動でZabbixを再起動して復旧させております。
zab-SR - 投稿数: 14
tnkさん、本当にありがとうございました。
自己解決できた?ようなので、ご報告です。
swatchをインストールして、zabbix_server.logを監視させてみました。
以下のような感じです。
swatch が”watchdog: database is down” を検出
swatch がzabbix_server停止、起動
これで再接続できました。
【蛇足】
何度かRDSをフェイルオーバさせて試していたのですが、
以下のようにZabbix_serverが再接続してくれる場合があるようです。
1)のケースですね。
条件は皆目見当はつかないのですが、
とりあえずswatchで再接続もできるので良しとしておきます。
zabbixが勝手に自動で再接続してくれたときのログ
30107:20160127:171044.240 [Z3005] query failed: [2013] Lost connection to MySQL server during query [select distinct r.druleid,r.iprange,r.name,c.dcheckid,r.proxy_hostid from drules r left join dchecks c on c.druleid=r.druleid and c.uniq=1 where r.status=0 and (r.nextcheck<=1453881673 or r.nextcheck>1453881673+r.delay) and mod(r.druleid,1)=0]
30107:20160127:171044.240 slow query: 570.495456 sec, "select distinct r.druleid,r.iprange,r.name,c.dcheckid,r.proxy_hostid from drules r left join dchecks c on c.druleid=r.druleid and c.uniq=1 where r.status=0 and (r.nextcheck<=1453881673 or r.nextcheck>1453881673+r.delay) and mod(r.druleid,1)=0"
30099:20160127:171114.703 [Z3001] connection to database 'zabbix' failed: [2003] Can't connect to MySQL server on 'dbzabmade201511112010.c2j2hkyyg5ku.ap-northeast-1.rds.amazonaws.com' (110)
30099:20160127:171114.703 database is down: reconnecting in 10 seconds
30099:20160127:171124.707 database connection re-established