二次开发:zabbix 进程和命令
zabbix 进程构成
了解完 zabbix 特性之后,本该进入 zabbix 安装教程,但是我觉得在安装之前我们很有必要了解一下 zabbix 进程组成结构,默认情况下 zabbix 包含 5 个程序:zabbix_agentd、zabbix_get、zabbix_proxy、zabbix_sender、zabbix_server,另外 zabbix_java_gateway 是可选,需要另外安装。下面来分别介绍下他们各自的作用。
zabbix_agentd
客户端守护进程,收集客户端数据,例如 cpu 负载、内存、硬盘使用情况等
zabbix_get
zabbix 工具,单独使用的命令,通常在 server 或者 proxy 端执行,用户获取被监控端数据,通常用于排错。例
如在 server 端获取不到客户端的内存数据,我们可以使用 zabbix_get 获取客户端的内容的方式来做故障排查。
zabbix_sender
zabbix 工具,用于发送数据给 server 或者 proxy,通常用于耗时比较长的 check,并且与 trapper 配合使用。生存环境中,个别非常耗时间 check 经常导致 zabbix 超时。于是我们在脚本执行完毕之后,使用 sender 主动提交数据。
zabbix_server
zabbix 服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway 的数据最终都是提交到 server
备注:当然不是数据都是主动提交给 zabbix_server,大多数情况下都是 server 主动去取数据。
zabbix_proxy
zabbix 代理守护进程。功能类似 server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交
到 server 里。一般跨机房、地区的环境需要用到 proxy。
zabbix_java_gateway
zabbix2.0 之后引入的一个功能。顾名思义:Java 网关,类似 agentd,但是只用于 Java 方面。需要特别注意的
是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到 server 或者 proxy。
Zabbix 命令
zabbix 协议概述
zabbix_server建立TCP连接到10050端口,请求具体的某个key值, zabbix_agentd对请求的进行数据的响应,下面用telent来进行模拟测试
[root@zabbix ~]# telnet 127.0.0.1 10050 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. agent.version Connection closed by foreign host.
上述语句中,请求key是agent.version,响应的数据是ZBXD口3.0.0rc13,用zabbix_get程序获取到的数据
[root@zabbix ~]# zabbix_get -s 127.0.0.1 -p 100k agent.version 3.0.13
Agent响应的数据中有一个头部信息ZCXD如下图所示
Zabbix Agent的数据发送格式如下:
<HEADER><DATALEN><DATA>
解释如下
HEADER: "ZBXD\X01"(5字节) DATALEN: 数据长度(8字节),1将被格式化为01/00/00/00/00/00/00/00(十六进制8字节,64位数字) DATA:大小有限制。为了不耗尽zabbix_server的内存,在zabbix_server将单个数据的带下限制在64MB zabbix2.2.0以前的版本为128MB,在zabbix2.0.3版本之前对大小无任何限制,在zabbix2.2.3中,改为128MB 的大小限制,在64MB限制的版本中将会丢弃超过64MB大小限制数据
更加详尽地解释了上面的数据格式如下图:
zabbix_server
介绍
zabbix 可以没有 zabbix_agentd,也可以没用 snmp、也可以没有 proxy,但是 zabbix_server 那是绝对不能少,它是 zabbix 最核心的东西。获取数据、配置主机、发送邮件等等众多事情都是由 zabbix_server 完成,zabbix_server 绝对
是日理万机废寝忘食的好员工。
兼容系统
虽然和 zabbix_agentd 相比,zabbix_server 支持的系统少一点,但是它还是支持着众多操作系统。最遗憾的是它不支持 windows 系统。windows sa 们可以哭一会儿。支持的系统如下:
Linux Solaris AIX HP-UX Mac OS X FreeBSD OpenBSD NetBSD SCO Open Server Tru64/OSF1
命令详解
使用语法
zabbix_server [-hV] [-c <file>] [-n <nodeid>] [-R <option>]
命令选项
-c --config <file> 配置文件路径 -n --new-nodeid <nodeid> 将数据转为 nodeid,如果当前服务器想作为一个 nodeid 需要使用名,切记,操作不可逆 -R --runtime-control <option> 执行管理功能,如:config_cache_reload Runtime 控制项: config_cache_reload reload 配置缓存
zabbix_server 命令实例
启动 zabbix server
/usr/local/zabbix-2.2.1/sbin/zabbix_server -c /usr/local/zabbix-2.2.1/etc/zabbix_server.conf
转为 node 模式(只做转换,不会启动 server)
/usr/local/zabbix-2.2.1/sbin/zabbix_server -c /usr/local/zabbix-2.2.1/etc/zabbix_server.conf -n 12
reload 配置缓存
/usr/local/zabbix-2.2.1/sbin/zabbix_server -c /usr/local/zabbix-2.2.1/etc/zabbix_server.conf -R config_cache_reload
zabbix_get
zabbix_get 作用
总有人在群里提问,为什么 zabbix 获取不到数据,为什么 zabbix 提示 Not Support,怎么办?别老问,用 zabbix_get 试着获取数据即可。在 zabbix server 上执行 zabbix_get 命令来试着获取 item 值 zabbix_get 命令详解
命令在 zabbix 安装目录 bin 下,如果是 window 命令自然是 zabbix_get.exe,使用方法都是一样的。端口和源(绑定)
IP 是可选的,其他参数不能漏掉
[root@zabbix ~]# zabbix_get -h usage: zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] -k item-key zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] --tls-connect cert --tls-ca-file CA-file [--tls-crl-file CRL-file] [--tls-agent-cert-issuer cert-issuer] [--tls-agent-cert-subject cert-subject] --tls-cert-file cert-file --tls-key-file key-file -k item-key zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] --tls-connect psk --tls-psk-identity PSK-identity --tls-psk-file PSK-file -k item-key zabbix_get -h zabbix_get -V Get data from Zabbix agent. General options: -s --host host-name-or-IP Specify host name or IP address of a host -p --port port-number Specify port number of agent running on the host (default: 10050) -I --source-address IP-address Specify source IP address -k --key item-key Specify key of the item to retrieve value for -h --help Display this help message -V --version Display version number TLS connection options: --tls-connect value How to connect to agent. Values: unencrypted - connect without encryption (default) psk - connect using TLS and a pre-shared key cert - connect using TLS and a certificate --tls-ca-file CA-file Full pathname of a file containing the top-level CA(s) certificates for peer certificate verification --tls-crl-file CRL-file Full pathname of a file containing revoked certificates --tls-agent-cert-issuer cert-issuer Allowed agent certificate issuer --tls-agent-cert-subject cert-subject Allowed agent certificate subject --tls-cert-file cert-file Full pathname of a file containing the certificate or certificate chain --tls-key-file key-file Full pathname of a file containing the private key --tls-psk-identity PSK-identity Unique, case sensitive string used to identify the pre-shared key --tls-psk-file PSK-file Full pathname of a file containing the pre-shared key Example(s): zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]" zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]" \ --tls-connect cert --tls-ca-file /home/zabbix/zabbix_ca_file \ --tls-agent-cert-issuer \ "CN=Signing CA,OU=IT operations,O=Example Corp,DC=example,DC=com" \ --tls-agent-cert-subject \ "CN=server1,OU=IT operations,O=Example Corp,DC=example,DC=com" \ --tls-cert-file /home/zabbix/zabbix_get.crt \ --tls-key-file /home/zabbix/zabbix_get.key zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]" \ --tls-connect psk --tls-psk-identity "PSK ID Zabbix agentd" \ --tls-psk-file /home/zabbix/zabbix_agentd.psk Report bugs to: <https://support.zabbix.com> Zabbix home page: <http://www.zabbix.com> Documentation: <https://www.zabbix.com/documentation> [root@zabbix ~]# zabbix_get -h usage: zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] -k item-key zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] --tls-connect cert --tls-ca-file CA-file [--tls-crl-file CRL-file] [--tls-agent-cert-issuer cert-issuer] [--tls-agent-cert-subject cert-subject] --tls-cert-file cert-file --tls-key-file key-file -k item-key zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] --tls-connect psk --tls-psk-identity PSK-identity --tls-psk-file PSK-file -k item-key zabbix_get -h zabbix_get -V Get data from Zabbix agent. General options: -s --host host-name-or-IP Specify host name or IP address of a host -p --port port-number Specify port number of agent running on the host (default: 10050) -I --source-address IP-address Specify source IP address -k --key item-key Specify key of the item to retrieve value for -h --help Display this help message -V --version Display version number TLS connection options: --tls-connect value How to connect to agent. Values: unencrypted - connect without encryption (default) psk - connect using TLS and a pre-shared key cert - connect using TLS and a certificate --tls-ca-file CA-file Full pathname of a file containing the top-level CA(s) certificates for peer certificate verification --tls-crl-file CRL-file Full pathname of a file containing revoked certificates --tls-agent-cert-issuer cert-issuer Allowed agent certificate issuer --tls-agent-cert-subject cert-subject Allowed agent certificate subject --tls-cert-file cert-file Full pathname of a file containing the certificate or certificate chain --tls-key-file key-file Full pathname of a file containing the private key --tls-psk-identity PSK-identity Unique, case sensitive string used to identify the pre-shared key --tls-psk-file PSK-file Full pathname of a file containing the pre-shared key Example(s): zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]" zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]" \ --tls-connect cert --tls-ca-file /home/zabbix/zabbix_ca_file \ --tls-agent-cert-issuer \ "CN=Signing CA,OU=IT operations,O=Example Corp,DC=example,DC=com" \ --tls-agent-cert-subject \ "CN=server1,OU=IT operations,O=Example Corp,DC=example,DC=com" \ --tls-cert-file /home/zabbix/zabbix_get.crt \ --tls-key-file /home/zabbix/zabbix_get.key zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]" \ --tls-connect psk --tls-psk-identity "PSK ID Zabbix agentd" \ --tls-psk-file /home/zabbix/zabbix_agentd.psk Report bugs to: <https://support.zabbix.com> Zabbix home page: <http://www.zabbix.com> Documentation: <https://www.zabbix.com/documentation>
参数说明:
-s –host: 指定客户端主机名或者 IP -p –port:客户端端口,默认 10050 -I –source-address:指定源 IP,写上 zabbix server 的 ip 地址即可,一般留空,服务器如果有多 ip 的时候,你指定一个。 -k –key:你想获取的 key
至于使用长参数还是短的,自己选,我经常使用-s 而不是-host,太长了。来个例子咯
zabbix_get 获取数据
获取负载
[root@zabbix ~]# zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg15]" 0.050000
获取主机名
[root@zabbix ~]# zabbix_get -s 127.0.0.1 -p 10050 -I 127.0.0.1 -k "system.hostname" zabbix
Zabbix 命令:zabbix_agentd
zabbix_agentd 用途
zabbix_agentd 非常非常重要,它是每个学习 zabbix 必须熟悉也必须接触到得东西,把 zabbix_agentd 安装到被监控服务器上,zabbix_server 便可以和 zabbix_agentd 通信来获取数据。下面来详细聊聊 zabbix_agentd。
兼容系统
作为一个跨平台的监控系统,zabbix_agentd 可以被安装到各式各样的系统中,如下:
Linux IBM AIX FreeBSD NetBSD OpenBSD HP-UX Mac OS X Solaris: 9, 10, 11 Windows: 2000, Server 2003, XP, Vista, Server 2008, 7
命令详解(Linux)
linux 和 windows 上略有不同,不过基本上差不多使用方法
usage: zabbix_agentd [-Vhp] [-c <config-file>] [-t <item key>]
参数
-c --config <config-file> 配置文件绝对路径 -p --print 打印出所有的 item,然后退出 -t --test <item key> 测试指定 item key,然后退出 -h --help 帮助 -V --version 显示版本号
命令详解(Windows)
基本上使用方法和 linux 一样,不过有些特殊,在 window 里,zabbix_agentd 多了服务这块。
-i --install 安装为服务 -d --uninstall 移除服务 -s --start 启动服务 zabbix_agentd -x --stop 关闭 zabbix_agentd -m --multiple-agents 多个服务,服务名包含 agentd 的主机名(不常用)
实例测试
列出 items
# zabbix_agentd -p | grep uptime system.uptime [u|15923945]
测试 key
# zabbix_agentd -t system.uptime -c /usr/local/zabbix-2.2.1/etc/zabbix_agentd.conf system.uptime [u|15923992]
启动 zabbix_agentd
# zabbix_agentd -c /usr/local/zabbix-2.2.1/etc/zabbix_agentd.conf
Zabbix 命令:zabbix_sender
zabbix_sender 用途
zabbix 获取 key 值有超时时间,如果自定义的 key 脚本一般需要执行很长时间,这根本没法去做监控,那怎么办呢?
使用 zabbix 监控类型 zabbix trapper,需要配合 zabbix_sender 给它传递数据。关于 trapper 的用法,我们来弄个实例。
执行超长时间脚本,如:脚本去几十台服务器拉去数据,每个日志都上 G,然后日志整合在一起,统计出返回值。这种脚本比如超时,所以我们必须改成让客户端提交数据的方式。
命令详解
语法
usage: zabbix_sender [-Vhv] {[-zpsI] -ko | [-zpI] -T -i <file> -r} [-c <file>]
使用参数
-c --config <file> 配置文件绝对路径 -z --zabbix-server <server> zabbix server 的 IP 地址 -p --port <server port> zabbix server 端口.默认 10051 -s --host <hostname> 主机名,zabbix 里面配置的主机名(不是服务器的 hostname),不能使用 ip 地址 -I --source-address <IP address> 源 IP -k --key <key> 监控项的 key -o --value <key value> key 值 -i --input-file <input file> 从文件里面读取 hostname、key、value 一行为一条数据,使用空格作为分隔符, 如果主机名带空格,那么请使用双引号包起来 -T --with-timestamps 一行一条数据,空格作为分隔符: <hostname> <key> <timestamp> <value>,配合 --input-file option,timestamp 为 unix 时间戳 -r --real-time 将数据实时提交给服务器 -v --verbose 详细模式, -vv 更详细
使用实例
# zabbix_sender -s 127.0.0.1 -z 127.0.0.1 -k "ttlsa.trapper" -o 1 -r info from server: "processed: 0; failed: 1; total: 1; seconds spent: 0.000024" sent: 1; skipped: 0; total: 1
ttlsa.trapper:是我们定义好的 key
-0 1:1 是 key 值
failed:错误数,说了-s 不能用 ip 地址,那么我们改成配置文件中得主机名吧
#zabbix_sender -s "Zabbix server" -z 127.0.0.1 -k "ttlsa.trapper" -o 1 -r info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000035" sent: 1; skipped: 0; total: 1
zabbix_sender 批量传递 key 值
#cat f.txt "Zabbix server" ttlsa.trapper 10 "Zabbix server" ttlsa.trapper 20 "Zabbix server" ttlsa.trapper 30 "Zabbix server" ttlsa.trapper 40 "Zabbix server" ttlsa.trapper 1
# zabbix_sender -z 127.0.0.1 -i f.txt info from server: "processed: 5; failed: 0; total: 5; seconds spent: 0.000085" sent: 5; skipped: 0; total: 5
每行对应一个 key 值,一般是不同的主机名、不同的 key、不同的 key 值。这边方便测试,所以都用了同一个 key
zabbix_proxy
zabbix_proxy 介绍请看《zabbix proxy 分布式配置》 ,zabbix_proxy 收集被监控端的数据,先缓存到本地然后把数据传给 zabbix server,因为 zabbix_proxy 基本上是在收集数据,而不像 server 一样要处理数据,所以 zabbix_proxy 对硬件的要求相对不高,今天主要是来了解 zabbix_proxy 命令的,往下看吧。
兼容系统
和 zabbix server 基本一样,server 支持什么,proxy 就支持什么。请参考《zabbix_server 命令详解》
命令详解
使用语法
zabbix_proxy [-hV] [-c <file>] [-R <option>]
使用参数
-c --config <file> 配置文件路径 -R --runtime-control <option> 执行管理功能 Runtime control options: config_cache_reload Reload 配置缓存
启动 proxy
# /usr/local/zabbix-2.2.1/sbin/zabbix_proxy -c /usr/local/zabbix-2.2.1/etc/zabbix_proxy.conf
Rreload proxy 配置缓存
# /usr/local/zabbix-2.2.1/sbin/zabbix_proxy -c /usr/local/zabbix-2.2.1/etc/zabbix_proxy.conf -R config_cache_reload