zabbix 监控 ipvs(lvs) 运行状态

要监控 ipvs 的状态,无外乎从下面两个地方入手:
1. ipvsadm 命令
2. /proc/net/ip_vs* 下面的文件

其中 1 应该也是从 2 获取到的数据,因此比较直接的方式还是直接从 /proc 下面拿到数据。

虽然通过 low level discovery 可以自动的实现 rs 的增删减操作,但是仔细想想没有必要那么复杂,多定义几个 item 就可以替代上面的操作了。

同一时间只有会有一台 dr 进行工作,因此,完全可以在两台 dr 上部署一模一样的监控,最后通过 aggregate 相加起来。

以 ipvsadm 这个命令为例,要拿到当前 InActConn 总和,直接几个 pipe 就可以搞定:
# ipvsadm -L -n | grep Route | tr -s ' ' '\t'  | awk '{print $6}' | awk 'BEGIN{sum=0}{sum+=$1}END{print sum}'

而如果是通过读取文件来做,需要处理下进至问题,如果不愿意在这里处理,可以直接在新建 item 的时候,以 "hex" 做为 Data Type。以 ip_vs_stats 这个文件为例,主要就是 in/out/total 三个大的参数:
# cat /proc/net/ip_vs_stats
   Total Incoming Outgoing         Incoming         Outgoing
   Conns  Packets  Packets            Bytes            Bytes
     D53    11514        0           886EF0                0

 Conns/s   Pkts/s   Pkts/s          Bytes/s          Bytes/s
       2       24        0             11C7                0

下面这个就能拿到当前的 total/in/out 的 delta(conns, pkts, Bytes/s) 值了:
# tail -1 /proc/net/ip_vs_stats | /usr/bin/awk '{print strtonum("0x"$1), strtonum("0x"$2), strtonum("0x"$3), strtonum("0x"$4), strtonum("0x"$5)}'
0 11 0 1445 0

LVS tcp 的状态还是看 proc 下面的文件:
# grep -i es  /proc/net/ip_vs_conn | cut -d' ' -f8  | grep -v ^$ | uniq -c

至于其他的诸如每个 rs 上的连结数,当前的 rs 的个数,rs 的健康状况,dr 有没有被 keepalived failover 等问题,参照上面的思路,应该都很好解决。不过对于第一个,每个 rs 上的连接数,用 low level discovery 来完成会更优雅些,具体的做法可以参考我之前写的一个 mongo instance,只不过是把 port 变成了 ip:port 而已,其他的都没有大的变化。

这个(1, 2) 脚本也可以做类似的事情,不过需要开 SNMP,多一分服务多一份担心,最终还是没采用,而是自己写简单的脚本实现。

上面的 item 都写好了,定义 trigger、graph 是不是就很简单了,综合起来搞套 template 就具有通用性了。

ref:
http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.monitoring_lvs.html