前言
目前项目组正在做一个包含zabbix监控的项目,由于之前没有接触过zabbix这个工具,所以在工作期间遇到了很多zabbix相关的问题,通过zabbix api以及zabbix表结构的了解逐步解决了一些问题,在这分享一下一些问题的解决思路。
zabbix api
https://www.zabbix.com/documentation/3.4/zh/manual/api
问题
某次在凌晨数据库服务器出现了频繁的ORA-04031问题,导致zabbix server挂掉了,编写的守护进程重启zabbix server后,没过几分钟zabbix server还是挂掉了。在第二天,解决了数据库问题后,重启了zabbix server后,队列出现了堆积,由于其他系统需要及时的获取监控主机的最新数据,不能等待zabbix自己恢复。
解决思路
查看zabbix proxy节点上sender进程后每次上传数据条数
发现sender进程每次上传至zabbix server的数据量很少(上图data sender进程是已经恢复后的),通过zabbix api了解到以下命令
增加所有进程的日志级别:
shell> zabbix_proxy -c /usr/local/etc/zabbix_proxy.conf -R log_level_increase
增加第二个 Poller 进程的日志级别:
shell> zabbix_proxy -c /usr/local/etc/zabbix_proxy.conf -R log_level_increase=poller,2
增加 PID 为 1234 进程的日志级别:
shell> zabbix_proxy -c /usr/local/etc/zabbix_proxy.conf -R log_level_increase=1234
降低 http poller 进程的日志级别:
shell> zabbix_proxy -c /usr/local/etc/zabbix_proxy.conf -R log_level_decrease="http poller"
随后观察日志
发现sender进程与proxy节点上的proxy_history表以及ids表有关,通过了解这两个表的表结构
Zabbix 数据库表结构说明文档
https://blog.youkuaiyun.com/zhangxueleishamo/article/details/94400572
推测代理节点上传数据逻辑大致为:
- 代理获取其代理的主机的各监控项数据,存入proxy_history表中
- 按照ids表中nextId为起始每次查询1000条,查询结束后向zabbix server节点上传数据
- 上传完成后,更新ids表中proxy_history对应的nextId更新为proxy_history中主键最大值+1
- 等待下次上传。
于是得出解决办法:
可更改ids表中proxy_history对应的nextId值,拉小他与proxy_history中主键最大值的差距,即可缓解队列问题(缺点:会导致部分数据断图,历史数据缺失)