実運用に使用している Zabbix-1.8 を、とある事情で途中から分散監視設定に変更しようかと思い立って調査したところ、気を付けないと危なそうなのでメモ。(zabbix-2.0以降はみていません)
分散監視のドキュメントを参考に、
zabbix_server.confファイルに次の行を設定します:
NodeID=1ステップ3 データベースデータの変換。
Zabbixサーバのバイナリを実行して、最初のノードが使用できるように一意なIDを変換します。
cd bin ./zabbix_server -n 1 -c /etc/zabbix/zabbix_server.conf Converting tables .................................................................. done.15 分散監視 [Zabbix Documentation 1.8]
zabbix-server に -n [nodeid] を指定してデータベースを変換する、とありますが、これを実行するとなにが起きるか。ソースコードでいうと src/zabbix_server/utils/nodechange.c の change_nodeid() 内ですが、DB内の多くのテーブルに対して全行を対象に UPDATE が発行されます。
DBexecute("update %s set %s=%s+" ZBX_FS_UI64 " where %s>0", tables[i].table, tables[i].fields[j].name, tables[i].fields[j].name, prefix, tables[i].fields[j].name);
MySQLのクエリログを出力するように設定したところ、こんな感じ。
Query begin Query update slideshows set slideshowid=slideshowid+100100000000000 where slideshowid>0 Query update slides set slideid=slideid+100100000000000 where slideid>0 Query update slides set slideshowid=slideshowid+100100000000000 where slideshowid>0 Query update slides set screenid=screenid+100100000000000 where screenid>0 Query update drules set druleid=druleid+100100000000000 where druleid>0 Query update drules set proxy_hostid=proxy_hostid+100100000000000 where proxy_hostid>0 (以下略)
history などの大量にデータが保存されるテーブルにも更新が掛かるので、多くのホストを監視しているなどで大きなデータベースになっている場合、運用中に気軽に実行するのはパフォーマンス的に危険そうですね。
というメモでした。