だ。ログ。

開発とかスノボとかやきうとか。

zabbixを利用してmysqlを監視する時にハマったこと

かなりドツボにハマって1日調べた。

CentOS 6
今回利用するzabbixのバージョンは3.4.15
zabbixのサーバーは他ホストで存在している事が前提。

zabbix-agentのインストール

# rhel6のパッケージインストール
$ rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/6/x86_64/zabbix-release-3.4-1.el6.noarch.rpm

# zabbix-agentインストール
$yum install zabbix-agent zabbix-get

# zabbix-agentの設定をいじる
$ cd /etc/zabbix/
$ cp zabbix_agentd.conf zabbix_agentd.conf.default
$ vi zabbix_agentd.conf

# 中身
Server=192.168.0.0,127.0.0.1
ServerActive=192.168.0.0
## 注意 ##
# 192.168.0.0 はzabbixサーバー側のIPを入れる。カンマ区切りは自分で自分をzabbix-getできるか確認するため。

# mysqlにユーザーを作成する 例:ユーザー名:hoge パスワード:fuga
$ grant process on *.* to hoge@localhost identified by 'fuga';

$ cd /var/lib/
$ mkdir zabbix
$ cd zabbix
$ vi .my.cnf
#####中身#####
[client]
host     = localhost
user     = hoge
password = fuga
socket   = /var/lib/mysql/mysql.sock

# 起動
$ service zabbix-agent start
$ chkconfig zabbix-agent on

これでzabbix-server側にホストを設定すれば、サーバーは認識してくれる。
が、ここからが問題。テンプレートで Template DB MySQL を選択すると MySQL is Down と言うトリガが作成される。
これを試す手っ取り早い方法として

$ service mysqld stop

mysqlを停止させれば良い。
のだが、反応しない。待てど暮せどmysqlが死んだと言う報告が挙がってこない。
なぜ?

## zabbix-server側を確認する
監視している側のログを追ってみる

$ tail -f /var/log/zabbix/zabbix_server.log

ログを見ると疎通は出来ていて、接続エラーが出ているがzabbixが反応していない。

どうやら、死活監視をされている側が正しい返り値を返していない為に反応がないらしい。
ぴぐろぐ様
pig-log.com

こちらの例を参考にして

$ cd /etc/zabbix/zabbix_agentd.d
$ cp userparameter_mysql.conf userparameter_mysql.conf.default
$ vi userparameter_mysql.conf

##内容(原本)##
UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema=\"$1\"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name=\"$2\"");" | HOME=/var/lib/zabbix mysql -N'
UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V

##変更後##
UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema=\"$1\"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name=\"$2\"");" | HOME=/var/lib/zabbix mysql -N'
#UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive ← コメントアウト
UserParameter=mysql.ping,mysqladmin --defaults-extra-file=/etc/zabbix/zabbix_agentd.d/zabbix_my.cnf ping 2>&1 | grep -c alive ←こちらに変更
UserParameter=mysql.version,mysql -V

変更後はmysql.pingの変更を行う。ここが正しく返り値を返却しないので正しい物にロジック変えした形になる。
その他を変更すると、グラフ用のモニタリングが正しく動かなくなる。
相当ハマったが、これでグラフの可視化+mysqlのみの死活の監視が出来るようになった。