読者です 読者をやめる 読者になる 読者になる

Zabbix-1.8で運用中のzabbix-serverを分散監視に切り替える場合の注意

実運用に使用している 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 などの大量にデータが保存されるテーブルにも更新が掛かるので、多くのホストを監視しているなどで大きなデータベースになっている場合、運用中に気軽に実行するのはパフォーマンス的に危険そうですね。

というメモでした。