
一、了解 zabbix 监控系统¶
监控系统的四大核心任务:采集、存储、告警、展示。
zabbix 的组件:
- zabbix-server:从数据库读取要采集什么样的数据,并执行采集动作;
- zabbix-database:保存着配置信息;
- zabbix-web-GUI:定义要采集什么数据,把配置信息存放至数据库;
- zabbix-proxy:代理 server 收集数据;
- zabix-agent:客户端程序,对数据进行采集。
数据采集的信道:
- zabbix;
- SNMP;
- IPMI;
- JMX;
- ssh/telnet;
其他的监控工具:
- Open-falcon 是小米二次研发并开源的;
- Prometheus 是容器的监控系统,被 CNCF 收录,但是展示界面不好看,后期可以结合 Grafana 来展示强大的图形界面。
二、安装 zabbix¶
安装 Server 端¶
首先安装好 Mariadb 数据库,然后按照官方文档中的步骤安装就可以了,这里使用的版本是 4.0 LTS。
官方文档 https://www.zabbix.com/download。
注意一点,启动服务前,要编辑 http 的配置文件 /etc/httpd/conf.d/zabbix.conf,把关于时区的配置给启用,默认是注释的。
1 | vim /etc/httpd/conf.d/zabbix.conf |
安装好后就可以登录 Web 管理界面,默认用户名为 Admin,密码为 zabbix。
安装 agent 端¶
在需要被监控的主机上安装 agent 客户端。
1 | yum install zabbix-agent |
agent 端的配置文件在 /etc/zabbix/zabbix_agentd.conf
被动监控的相关配置段在 ##### Passive checks related
Server:允许哪个 Server 来读取监控数据;ListenPort:自己监听哪个套接字;ListenIP:自己监听哪个端口;StartAgents:启动几个子进程;
主动监控的相关配置段在 ##### Actice checks related
ServerActive:把监控数据发给哪个 Server;- 注意:为了让 Server 能够识别当前主机,要发送自己的标识信息,有 4 中方式:
Hostname:直接发送主机名称;HostnameItem:发送采集到的与主机名相关的数据(建议);HostMetadata:发送元数据信息;HostMetadataItem:发送采集到的与主机名元数据相关的数据;
BufferSend:定义使用启用发送缓冲;BufferSiza:定义发送缓冲区的大小;
三、ZABBIX 功能配置¶
Items 监控项¶
监控数据需要 agent 来执行命令或通过调用系统库来获得,agent 程序的内部内键了一些通用的获取指标数据的操作,如果不能满足自己的需求,就需要自己定义操作,而 items 就是用来自定义以何种方式采集指标数据的。
如果使用内键的操作,就直接调用对应的 key 即可,但如果使用自定义的操作,就需要在配置文件中事先定义 key 对应的操作是什么。
这里可以查看支持的内键 key 的详细信息。
https://www.zabbix.com/documentation/4.0/zh/manual/config/items/itemtypes/zabbix_agent
内键的 key 有两种:
- 不可以传参数的,例如:
system.cpu.switches:统计上下文交换的数量。
- 需要传参数的,例如:
net.if.in[if,<mode>]:网卡流入量统计,中括号内指定参数。if:定义要监控的网卡名;mode可用的值:bytes:字节数(默认);packets:包数量;errors:错误数量;dropped:丢包数量;
添加 item 时可在 Preprocessing 选项卡中定义对数据进行预处理。
- Change 变化量:
Simple change:这次数据减去前一次;Change per second:这次减去前一次再除以时长;
Triggers 触发器¶
zabbix 支持的触发器有很多,关于触发器的介绍可以查看官网。
官方文档中也有对触发器表达式的详细介绍。
触发器中使用的表达式是非常灵活的,一个简单有效的表达式如下:
1 | {<server>:<key>.<function>(<parameter>)}<operator><constant> |
server:主机名称;key:主机上关系的响应监控项的 key;function:评估采集到的数据是否在合理范围内时所使用的函数,支持的 完整函数列表。parameter:函数的参数;大多为数字型的函数接受秒数来作为参数,可以使用前缀#来指定参数具有不同的含义,如sum(600)代表 600 秒内所有值的总和,sum(#5)就代表最后 5 个值的总和;另外,一些函数支持额外的第二个参数时间偏移量,这个参数允许从过去一段时间内引用数据。例如,avg(1h,1d)将会返回一天前 1 小时的平均值。operator:运算符;constant:常量;
触发器示例¶
对 www.zabbix.com 站点的处理器负载过高的触发判断:
1 | {www.zabbix.com:system.cpu.load[all,avg1].last()}>5 |
解析:它指定了服务器是 www.zabbix.com,监控项的键值是 system.cpu.load[all,avg1]。通过使用函数 last() 获取最新的值。最后,>5 意味着当 www.zabbix.com 最新获取的处理器负载值大于 5 时触发器就会处于异常状态。
触发器的严重等级¶
触发器严重性定义了触发器的重要程度,Zabbix 支持下列触发器的严重程度:
| 严重性 | 定义 | 颜色 |
|---|---|---|
| 未分类 | 未知严重性 | 灰色 |
| 信息 | 提示 | 浅蓝色 |
| 警告 | 警告 | 黄色 |
| 一般严重 | 一般问题 | 橙色 |
| 严重 | 发生重要的事情 | 浅红色 |
| 灾难 | 灾难,财务损失等 | 红色 |
触发器严重性用于:
- 触发器的直观表示,不同的颜色代表不同的严重程度;
- 全局报警音频。不同的音频代表不同的严重程度;
- 用户媒介,不同的用户媒介(通知渠道)代表不同的严重程度。例如,SMS - 高严重性,email - 其他;
- 通过触发器严重程度的条件来限制动作。
触发器等级的名称和颜色可以自定义。
Actions 动作¶
在 Action 中可定义触发器被触发后要做的行动。
比如可以自动报警,这里介绍两种报警方式:
1. 直接通过 Email 发送报警邮件¶
- 在 Administrator 中添加 一个
media type,这里使用Email的方式,以后发送报警信息时通过这个媒介发送。 - 因为 所有报警信息的接收者,必须是 zabbix 账号,所以在 Administrator 的
Users选项中,给要接收报警信息的 zabbix 账号,在Media中定义此账号接收报警信息的邮箱地址,并可以定义通过哪个media发送。 - 在 Configuration 中新建一个
Actions,Event source使用Tiggers类型,在内部添加一个Operations,选择Send message可以定义如何发送报警信息。
2. 使用 Python 脚本发邮件¶
如果因为邮箱不支持等其他原因不能直接使用 Email,也可以通过触发脚本来发送 Email,在配置文件 /etc/zabbix/zabbix_server 中的 AlertScriptsPath=/usr/lib/zabbix/alertscripts 定义脚本的放置路径。
(1). 新建一个用于发送邮件的 python 脚本 EmailScript.py,放在脚本路径下。
1 | #!/usr/bin/python |
(2). 上面脚本中的最后一行会接收 3 个参数,我们要把以下 3 个 zabbix 的内部宏传给脚本,分别代表了:
{ALERT.SENDTO}:接收告警信息的接收地址;{ALERT.SUBJECT}:接收告警信息的主体;{ALERT.MESSAGE}:告警信息的正文;
在 Administrator 中添加 Media types,选择 Type 为 Script,并把上面 3 个内部宏直接写在 Script parameters 中。
后面和 email 的配置方式就一样了。
Remote command 远程命令¶
一旦发现目标出现故障时,可以先自动采取一些处理措施,而不是直接发邮件。在添加 Actions 时,不选择 Send message,而选择 Remote command,可以使用 SSH、Telnet 等方式远程执行一段命令,也可以使用 Custom script 执行一个脚本,并可以指定是由 Zabbix agent、Zabbix server(proxy) 还是 Zabbix server 来执行。
- 添加一个 Nginx 的 item,使用内键 key
net.tcp.listen[port]来监控 Nginx 的80端口是否在正常监听。这个 key 检测的返回值为1正常,0为不正常,用户看起来会不直观,所以可以在Show value中选择Service state将返回值自动转换为up和down。 - 添加一个 Tigger,当目标 item 的值为
0时则触发。 - 添加一个 Action,当 Tigger 触发时,第一步先使用 agent 执行脚本尝试重启 Nginx,选择
Remote command,在Commands中定义要执行的脚本或直接写语句sudo systemctl restart nginx,并指定使用Zabbix agent执行。然后添加第二步操作,当第一步执行失败时,发送告警邮件,如果成功了,则不会发送。需要注意的是:agent 进程是由 zabbix 账户启动的,无法重启 Nginx 进程,需要 root 权限,所以需要在目标主机上使用visudo为 zabbix 用户添加一个权限,用来执行重启 Nginx 服务的命令。 - 为了安全,zabbix-agent 默认禁止了远程执行命令的操作,在目标主机的配置文件
/etc/zabbix/zabbix_agent.conf中找到EnableRemoteCommands=0改成EnableRemoteCommands=1并重启服务来启用。
Macros 宏¶
宏可以理解为是一个文本替换模式:
级别:
- 全局范围生效,在这里定义:
Administrator->General-> 右上角下拉选Macros; - 模板范围生效:在模板中定义;
- 主机范围生效,在这里定义:
Configuration->Hosts->要定义的主机名->Macros;
类型:
- 内键宏引用格式为
{MACRO_NAME},必须使用全大写;官方也给了所有支持的内键宏完整列表。 - 自定义宏无论是定义、赋值还是引用时,都必须加
$符{$MACRO_NAME},命名使用大写字母、数字和下划线。
key 自定义¶
在 zabbix_agent.conf 的配置文件中使用 UserParameter=<key>,<command> 指令自定义 key。
建议将自定义配置集中写在 /etc/zabbix/zabbix.agentd.d/*.conf 中。
示例:从 Nginx 自带的状态页获取连接数¶
先启用 Nginx 的 STATUS 页面。
1 | location /status { |
新建一个配置文件用来自定义 key。
1 | vim /etc/zabbix_agentd.d/nginx_key.conf |
使用 systemctl restart zabbix-agent 重启 agent 服务生效。
之后可使用 zabbix-get 工具可以测试自定义的 key 是否生效。
1 | yum install zabbix-get |
示例:给自定义的 key 传递参数¶
使用自定义 key 时可以传入参数,那么在定义 key 时要使用 [*] 来开启传递参数的功能。
目标:定义一个 key,实现通过获取 /proc/meminfo 来显示内存的信息,并且可以通过传递的参数只显示指定的行和字段。
/proc/meminfo 中保存了各种内存信息,使用 awk 可以把期望显示的行过滤出来,并截取出第 2 段的数值。其中期望显示的行就可以使用参数中传递。
1 | UserParameter=memory.info[*],awk '/^$1/{print $$2}' /proc/meminfo |
memory.info是 key 的名字;[*]代表此 key 可以接受多个参数;$1使用第 1 个传入的参数;$$2意思是取awk的第 2 段,本来应该写为$2,但是这里如果还是这么写会被理解为使用第 2 个传入的参数,所以使用两个$$来逃逸。
使用 zabbix-get 工具可以测试 key,通过传入一个参数 MemTotal,就可以只显示 MemTotal 这一行信息。
1 | zabbix_get -s 192.168.50.13 -p 10050 -k "memory.info[MemTotal]" |
Template 模板¶
配置模板需要首先通过定义一些参数来创建模板,然后添加实体(项目,触发器,图形等)。
使用模板时需要链接模板,链接模板的操作在 Host 中定义;而当不使用模板时,可以选择只拆除链接,或者拆除链接并删除过去的数据。
除了内键模板,zabbix 官方提供了一个站点,收集了互联网上其他人上传的模板。https://share.zabbix.com/
模板文件格式为 .xml,支持导出和导入,大部分模板有格式为 *.conf 的自定义 key 的配置文件,要放置在 agent 端的 zabbix.agentd.d 目录下,否则可以无法使用模板。
Discovery 自动发现¶
自动发现有两种:
Hosts中的Discovery,代表总线发现,比如用来发现主机有几块硬盘,几个分区,每个分区的容量等等。Configuration->Discovery中的自动发现规则,是用来自动发现主机的。
自动发现主机的规则配置含义:
IP range:扫描的网络范围;Checks:定义使用哪种方式探测,有Zabbix agent ping、ICMP ping、TCP ping等等。Zabbix agent ping的方式是向目标主机中的 agent 发送一个 key 请求,比如system.uname;如果正确收到主机名回应了,就代表可以添加,所以这种方式比 TCMP 的方式较稳妥。
Device uniqueness criteria:定义一个主机的唯一性以什么作为标准;IP address:使用 IP 地址作为唯一标准;如果一个主机有多个 IP,会被作为不同的主机;Zabbix agent "system.uname":使用 Zabbix agnet 中的 keysystem.uname作为主机的唯一标准;- 使用条件:只有在使用
Zabbix agent ping作为的探测条件时才能使用。
- 使用条件:只有在使用
使用此规则发现的主机并不会添加到 zabbix 中,而只是触发了一个 Discovery event,而后续的添加主机或添加模板应该是使用 Actions 来完成。
自动添加主机的 Action¶
在 Configuration 中新建一个 Actions,注意 Event source 要使用 Discovery 类型;而后在 Action 中的 New condition 添加发现条件,比如可以结合以下几个条件使用:
Discovery rule:指定使用哪一条规则去检查,这里就可以选择刚刚创建的自动发现规则;Dicsovert status:指定当主机为哪种状态时添加,比如Up。主机的状态分为四种:Up、Down、Discoveryd、Lost;Uptime/Downtime:如果刚一发现就添加进来可能比较武断,可以定义>=一段时间后才加入,比如>=120;Received value:如果返回字串中有指定的关键字则添加(返回的字符串就是在自动发现规则中定义的探测方式中 key 的返回结果,比如system.uname),比如使用like Linux,就可以判断操作系统为 Linux;
而后在 Operations 内选择期望的动作,比如添加主机、链接模板、发送信息等等。
配置主动监控模式¶
agent 向 Zabbix Server 请求与自己相关的监控项配置,并根据收到的配置采集好数据后主动发给 Server,而不是 Server 去 agent 抓取。
- 要在 agent 的配置文件中定义好关于主动模式的配置,至少包含
ServerActive=、Hostname=、HostnameItem=; - 在 Server 配置监控项时,
Type类型要选择Zabbix agent (active)。
Zabbix trapper 撒网监控¶
客户端可以结合 crontab,实现自己提交监控数据给 Server。
trapper 方式发送数据是以主机名处理,不是 IP 地址,所以 agent 配置文件中的主机名要唯一。
1、在配置 item 时 Type 类型选 zabbix trapper,然后自定义一个 key 值,假如是 memory.usage.free。
2、在 agent 端使用 zabbix-sender 工具向 Server 端中刚刚定义的 key 发送数据。
1 | zabbix_sender -z 192.168.50.11 -s "node2" -k "memory.usage.free" -o $(awk '/^MemFree/{print $2}' /proc/meminfo) |
3、然后在 Latest data 中就可以看到数据了。
Web 监控¶
web 监控会从三个维度监控指定站点:
- 资源下载速度;
- 页面响应时间;
- 响应码。
SNMP 监控¶
内容较长,在第 43 天 zabbix使用进阶(03).exe
JMX 监控¶
JMX 是一个 Java 管理扩展的类库,Tomcat 也支持 JMX 接口,只不过默认没有开启。
Tomcat 中开启 JMX 方法¶
先部署好 Tomcat¶
1 | yum install -y tomcat tomcat-webapps tomcat-docs-webapp tomcat-admin-webapps |
在 /etc/sysconfig/tomcat 或 /etc/tomcat/tomcat.conf 配置文件中,添加:
1 | CATALINA_OPTS="-Dcom.sun.management.jmxremote=true /* 定义 JMX 是否支持远程管理 */ |
在 zabbix server 连接 JMX¶
1、安装 java 网关
zabbix 默认是无法和 JMX 直接通信的,需要借助 zabbix-java-gateway 组件与 JMX 通信,可以直接在 zabbix server 主机上安装,也可以单独部署一台服务器上。
1 | yum install zabbix-java-gateway |
2、配置 zabbix-java-gateway
安装好后可以在配置文件 /etc/zabbix/zabbix_java_gateway.conf 中自定义端口,默认端口为 10052,如不需要修改可直接启动服务。
1 | systemctl start zabbix-java-gateway |
3、配置 zabbix-server
接下来告诉 zabbix server 如何连接 zabbix-java-gateway,编辑配置文件 zabbix_server.conf 中的如下配置:
1 | JavaGateway=ZABBIX-JAVA-GATEWAY-IP |
重启 zabbix-server 服务后,zabbix 就可以连接至 zabbix-java-gateway 了。
此时 zabbix 就可以和 JMX 通信了,在添加主机时填写客户端的 IP 地址和端口即可。
4、最后,在 zabbix 中添加 JMX 主机监控
在目标主机中添加一个 JMX interfaces,地址为 JMX 的地址。模板使用 Template App Generic Java JMX。
四、分布式监控(Proxy)¶
安装 zabbix-proxy 程序。
1 | yum install zabbix-proxy zabbix-agent |
proxy 可以有多个,每个 proxy 的数据应该存放在自己的库中,用来临时保存数据,可以和 Server 使用同一个主机,也可以独立使用一台主机。
安装数据库,并启动服务。
1 | yum install mariadb-server |
然后创建 proxy 的数据库并授权。
- 注意:如果 Zabbix server 和 Zabbix proxy 安装在相同的主机,它们必须创建不同名字的数据库!
1 | mysql -uroot -p |
导入表结构。
1 | `zcat /usr/share/doc/zabbix-proxy-mysql-4.0.12/schema.sql.gz | mysql -uzabbix-proxy -pzabbix-proxy zabbix_proxy` |
编辑 proxy 配置文件 /etc/zabbix/zabbix_proxy.conf。
1 | ProxyMode=0 # 配置工作模式,0 为主动,1 为被动,默认为 0 |
在 Server Web 中添加 Proxy 主机的步骤:
Administrator->Proxies中点Create proxy- 其中
Proxy name代表:Server 依靠此名字和 Proxy 主机通信,所以一定要确保和 Proxy 配置文件中Hostname=指定的名字一致,并且能够正确解析。
在自动发现的配置中也可以开启 proxy 功能,之后就可以通过 Proxy 发现主机了。
注意:要在每个 agent 端的配置文件 /etc/zabbix/zabbix_agent.conf 中,把允许哪些主机来抓取监控数据的配置中,加上 Proxy 主机的 IP,否则 Proxy 会没有权限监控 agent。
示例:
1 | 主机信息 |
重启 agent 服务后,可以在 proxy 主机上使用 zabbix_get 工具进行测试,如果能采集到数据就为正常。
1 | # zabbix_get -s 192.168.50.12 -k 'system.uname' |
五、ZABBIX 性能优化¶
zabbix 子进程介绍:
- Poller: 向 agent 发起监控请求的子进程;
- HTTPPoller: 监控 web 时用来请求页面资源去做探测的进程;
- Preprocessor: 数据预处理器,在 item 中可以定义对数据进行一定处理后展示;
- PollersUnreachable: 每次采集数据时,如果对方无法探测,使用此进程来检测对方存活与否;
- Trapper: 在 trapper 模式时用来接收对方使用
zabbix_sender发来的监控数据; - Discoverer: 作为主机发现功能的进程;
- Pinger: 通过
tcp ping或ping操作进行主机发现的进程; - Timer: 计时器;
- Escalator: 报警升级器;
- Alerter: 报警器,用来触发邮件等报警操作;
- Housekeeper: 检查并清理过期的历史数据;
- DB_Config_Syncer: 当 proxy 为被动模式时,负载把监控配置推送给 proxy;
- DB_Data_Syncer: 当 proxy 为被动模式时,负载把监控数据从 proxy 拉回来;
每一个进程的工作项不同,需要的任务量也会不同。以 poller 为例,假如有 1000 个 agent 需要监控,但是默认的 poller 进程只有 5 个,这样每个 poller 被分配到的任务量就会过大,导致无法完成。
这时可以把 poller 进程的数量调大来解决问题,在监控场景较大时,必然需要调整这些进程的运行数量。在配置文件 /etc/zabbix/zabbix_server.conf 中的 ######ADVANCED PARAMETERS###### 配置段中可以调整。
设定合理的缓存大小
CacheSize=8M:缓存大小;HisrotyCacheSize=16M:历史数据缓存大小;HistoryIndexCacheSize=4M:趋势数据的缓存大小;ValueCacheSize=8M:监控采用数据的值的缓存大小;
性能评估的标准 NVPS: new values per second
代表每秒钟向服务器中插入的数据量,数值越高,ZABBIX DATABASE 的压力越大。官方表示理想状态下,最大支持 15000/s 个采集项入站,也就是 100w/m 个。而实际上能达到 5000/s 个,压力已经很大了。
优化准则:
- 数据库:
- 历史数据不要保存太长时长,90 天已经足够了,如果允许可以只保留 30 天;
- 趋势数据可以多保存一些时间,比如 2-3 年;
- 尽量让数据缓存在数据库服务器的内存中,降低数据库查询时的压力;
- 触发器表达式
- 定义触发器表达式时,尽量减少使用
min()、max()、avg()等,因为这 3 个是聚合计算,有大量的比较操作;而尽量使用last()、nodata();
- 定义触发器表达式时,尽量减少使用
- 数据收集
- 数据采集时,使用 polling 的方式较慢,所以应减少使用 SNMP、SSH、anent(被动) 的方式;而应该多使用 trapping、agent(主动) 的方式。
- 数据类型
- 文本型的数据处理速度较慢,尤其是还要使用正则表达进行匹配时,速度更慢。所以尽量减少采集 text 或 string 类型的数值,多使用 numeric 类型的数据。
常见的压力大部分是出现在数据库上,所以可以针对数据库进行分表优化。
如果想要绚丽的图形展示界面,可以使用 Grafana 展示 ZABBIX 的数据。