zabbix proxy/node 的使用总结教训

这两个的运用场景可以参见官方的这个文档
实际情况是,我们是同机房的不同 vlan 通过 proxy 收集,跨机房的则通过 node 跟目前的 master 并行。proxy 以及 node 的操作都没什么难度。这里跟大家说说我们在拆分 node 的一些教训。

# zabbix_server -n 20 -c /etc/zabbix/zabbix_server.conf
Dropping foreign keys ………………………………………. done.
Converting tables ………………………. done.
Creating foreign keys ………………………………………. done.
Conversion completed successfully.

上面这个如此简洁的 stdout 其实是我们新上的一个 zabbix server 做的 node,item 少的很。但是,当拿一个跑了有大半年的 zabbix server(跟那个新的 zabbix server 跨机房) 做 node 的时候,情况就不是那么美好了。

执行上面这条命令其实执行的是 src/libs/zbxdbhigh/dbschema.c 这个文件里面的 db_schema_fkeys 以及 db_schema_fkeys_drop 里面的 sql 语句。
慎重提醒,如果你的 zabbix 以及跑了很长的时间,像我们,单单 history_uint 表做了 partition 之后还有接近 1亿 的条目。要执行完上面的所有的 sql 语句会花费很长的时间。
之前对这个命令没有很好的理解,以为最多几分钟就能搞定的。结果等了几十分钟还没结束,幸好 zabbix_server 会把 slow query 打印在屏幕上,才能找到原来是上面那个 dbschema.c 文件里面执行的 sql。
另外,下面这条语句也能看到目前的 process:
> select * from information_schema.processlist  where info != 'NULL';

另外,官方说上面那个命令只能执行一遍,中途不能按 ctrl+c 停止,一直等到了最终执行完毕,整个过程持续了 6h+。

zabbix_server [310083]: Warning: slow query: 2965.823846 sec, "update history set itemid=itemid+1001000000000000 where itemid>0"
zabbix_server [310083]: Warning: slow query: 12539.601075 sec, "update history_uint set itemid=itemid+1001000000000000 where itemid>0"

基础设施做的不好,后期的维护成本会相应的变高。付出的人力精力时间也会成倍的增加,并且需要承担更大的风险。因此,这类基础性的设施是越早做越好。

zabbix JVM 的一些问题

调研了下,几乎所有的 JVM 的监控都是通用的,无外乎这么几个 item:
* JVM Heap & Non Heap Memory Usage
* Garbage Collection Information
* Class Loading and Unloading Information
* Running Thread Information
* Server Response Time
* Enterprise JavaBeans (EJBs)
* Metrics of all web applications
* Java Database Connectivity (JDBC) Pools

上面的这些可以在启动 java 进程的通过 jmx 开启。
JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9999"


在 2.0 上已经是原生支持 JMX 的监控了,所以部署好 zbx java gateway 之后,直接添加需要的 item 就好了。其 zabbix_java_gateway.conf 的配置说明可以在这里找到。
JMX 的 item: jmx[,]跟普通的有点小区别,分为 object name 和 attribute name。这些跟什么 key => value 都很类似,个人觉得不过是换了个说法罢了。

需要注意的是,每一台 server/proxy 上只能部署一个 java gateway。

如果要 debug 的话,需要在 logback.xml 里面开启 debug 的开关

有一个叫 jmxtrans 的项目,可以通过 JMX 将获取到的数据通过 json 的格式导入到  Graphite, StatsD, Ganglia, cacti/rrdtool 里面。

由于 2.0 原生就支持 JMX,因此供了大量的 JMX 的 item、trigger 以及 graph,最上面提到的一些 item 其默认都有支持,这个根据实际应用,进行一定的修改应该就能满足日常的需求了。

使用 low level discovery 添加不同的 instance

到目前为止,zabbix 一般的监控需求都能完全搞定,唯一有问题的就是同一台主机上不同端口的 instance 的监控,比如我在同一台主机上同时起了 27017, 27018, 27019 三个 mongod 的 instance 这类的情况。对此,这两个(1, 2)链接讨论了可行的情况。

1. Parametrized templates,这个需要引入一个抽象的 template,其实类似 nagios 里面通过 register 定义一个抽象可继承的 host/service,这个开发量比较大,目前使用不现实
2. 每一个 instance 单独定义一个 host,这个实现方式虽然可用,也比较简单,但是姿势太丑,如果一台主机有 10 个 instance,那么我需要定义 10 个不同的 host,大量重复无聊的工作
3. 通过 zabbix 2.0 引入的 low level discovery 实现,几乎没有开发量,姿势非常的优美,通过 active check 能自动的检测添加匹配要求的 instance

low level discovery 最重要的就是对不同 instance 特征的匹配问题,我们这里的情况相对比较简单,通过 netstat, lsof 把不同 mongo instance 的匹配出来,然后添加 item, graph, trigger 之类的就好了。
以下的工作参考了这两个链接(1, 2)。

按照起官方文档的解释,其匹配出的结果必须是 JSON 格式:
# cat /etc/zabbix/scripts/discovery.sh
#!/bin/bash
portarray=(`sudo lsof -iTCP -sTCP:LISTEN | grep "$1"| awk '{print $9}' | awk -F: '{if ($NF~/^[0-9].*$/) print $NF}' | sed -n 'p;n' | sort | uniq   2>/dev/null`)

length=${#portarray[@]}
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
        printf '\n\t\t{ '
        printf "\"{#TCP_PORT}\":\"${portarray[$i]}\" }"
        if [ $i -lt $[$length-1] ];then
                printf ','
        fi
done
printf  "\n\t]\n"
printf "}\n"

Continue reading

Ubuntu 10.04 安装 Zabbix

安装可以分为直接通过包管理器安装以及编译安装,10.04 通过包管理器安装的版本是 1.8.1,而最新的稳定版本是 1.8.10。

$ sudo apt-get install zabbix-server-mysql
$ sudo apt-get install zabbix-agent
$ sudo apt-get install zabbix-frontend-php

注意:使用 backports 会安装 1.8.10:
$ sudo apt-get install -t lucid-backports zabbix-agent

通过下面的命令查看版本号:
$ zabbix_agent --version
Zabbix Agent v1.8.1 (revision 9702) (27 January 2010)
Compilation time:  Apr  6 2010 01:54:49
$ zabbix_server --version
Zabbix Server (daemon) v1.8.1 (revision 9702) (27 January 2010)
Compilation time:  Apr  6 2010 01:55:32

后台 http://ip/zabbix,默认用户名密码是 admin/zabbix,记得登录后修改密码。然后根据出现的提示修改 /etc/php5/apache2/php.ini 中的指令。

下面主要记录编译安装的步骤,具体的解释请看官方文档
Continue reading