共计 3210 个字符,预计需要花费 9 分钟才能阅读完成。
行业资讯
数据库
Zabbix agent 挂掉后 Zabbix Web 监控依然能够收到数据是怎么回事
这篇文章主要为大家展示了“Zabbix agent 挂掉后 Zabbix Web 监控依然能够收到数据是怎么回事”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“Zabbix agent 挂掉后 Zabbix Web 监控依然能够收到数据是怎么回事”这篇文章吧。
一 问题描述:
在一台主机上添加了 Web 监控,当这台主机下架后没有在 Zabbix 页面中删除,在 Zabbix 页面上仍然能够接收到这台主机上的 Web 监控数据。按理来说,主机不可达后 Zabbix 页面不应该再看到这台主机上的任何监控数据,但是唯独自带的 Web 监控可以看到数据。这是个问题。
二 问题分析
之前一直以为 Zabbix 自带的 Web 监控是在 Agent 端执行的,所以为每个主机添加相应的 Web 监控,那么在 Zabbix 前端看到的监控数据应该是反映相应的 url 在这台主机上访问情况。但是当这台主机不可达时, 这台主机上的 Web 监控依赖有数据更新。由此猜想,Zabbix 自带的 Web 监控并不是在 Agent 端执行的,而是在 Server 端或者 Proxy 端执行的。
我们从 Zabbix server 的源代码入手一步一步的去了解 Zabbix 是如何去执行 Web 监控的
调用 src/zabbix_server/server.c 代码中的 main() 函数执行 Zabbix server 进程的入口程序
调用 zbx_load_config() 函数加载配置文件
调用 libs/zbxnix/daemon.c 代码中的 daemon_start() 函数允许进程从后台运行
调用 src/zabbix_server/server.c 代码中的 MAIN_ZABBIX_ENTRY() 函数
调用 zbx_free_config() 释放配置内存
调用 libs/zbxdbcache/dbcache.c 代码中的 init_database_cache() 函数为数据库缓存分配共享内存
调用 libs/zbxdbcache/dbconfig.c 中的 init_configuration_cache() 函数为配置缓存分配共享内存
调用 libs/zbxself/selfmon.c 代码中的 init_selfmon_collector() 函数 初始化 zabbix 自身监控
调用 libs/zbxdbhigh/db.c 代码中的 zbx_db_get_database_type() 函数 判断当前数据库是 server 还是 proxy 数据库
判断的标准就是 select userid from users 如果至少有一条数据在 users 表中,那么就返回 ZBX_DB_SERVER,如果没有就返回 ZBX_DB_PROXY
调用 libs/zbxdbhigh/db.c 代码中的
调用 libs/zbxdbcache/dbconfig.c 代码中的 DBconnect() 函数连接 Zabbix 数据库
调用 libs/zbxdbcache/dbconfig.c 代码中的 DCload_config() 函数加载 config 表到缓存中
调用 DCsync_configuration() 函数从数据库中同步配置数据
Zabbix server 启动的线程总数如下
threads_num = CONFIG_CONFSYNCER_FORKS + CONFIG_WATCHDOG_FORKS + CONFIG_POLLER_FORKS
+ CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
+ CONFIG_ALERTER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
+ CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
+ CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
+ CONFIG_SNMPTRAPPER_FORKS + CONFIG_PROXYPOLLER_FORKS + CONFIG_SELFMON_FORKS
+ CONFIG_VMWARE_FORKS;
然后对每个线程进行初始化操作
循环调用 get_process_info_by_thread() 函数根据线程信息获取进程信息
如果 thread_args.process_type 为 ZBX_PROCESS_TYPE_HTTPPOLLER,每个 http poller 线程调用 libs/zbxsys/threads.c 代码中的 zbx_thread_start(httppoller_thread, thread_args) 函数启动线程
然后调用 zabbix_server/httppoller/httppoller.c 代码中的 ZBX_THREAD_ENTRY(httppoller_thread, args) 函数循环处理 httptests
然后调用 zabbix_server/httppoller/httptest.c 代码中的 process_httptest() 函数处理每个 httptest
process_httptest() 函数会调用几个 libcurl 提供的函数来完成每个 httptest 中定义的 url 的访问
curl_easy_setopt() 设置 libcurl 访问 url 时的各种参数
curl_easy_perform() 执行访问 url 操作
curl_slist_free_all(headers_slist); curl_easy_perform() 执行完后必须要调用这个函数
curl_easy_getinfo() 获取访问 url 的结果信息
调用 process_step_data() 处理 httpstep
调用 process_httptests() 处理 httptests
从整个 Zabbix server 处理 Web 监控的过程来看,Zabbix server 是通过 httppoller 线程去循环执行各个 httptest 中的 httpstep 定义的 url 访问的,每次执行的时候都要从相应的表中查找信息然后过滤处理再将执行的结果写入的相应的表中,和 Zabbix agent 没有任何关系,在一些主机上添加 Web 监控只是当 httppoller 执行 curl 操作的时会去读出这台主机上的 Web 监控步骤再在 server 端执行。
需要了解一下一台主机如果是通过 Zabbix proxy 来管理的,那么在这台主机上添加的 Web 监控就会在它所在的 proxy 上由 httppoller 线程去执行
三 问题总结
通过以上分析,可以知道 Zabbix server 或者 proxy 在执行 Web 监控时只是从数据库中读取这台主机相关的 Web 监控项目获取 url,然后通过 libcurl 访问这个 url,再将结果写入到数据库中。所以,如果是想通过 Zabbix 自带的 Web 监控来检测各个 agent 所在的区域的访问 url 的质量是行不通的,因为所有的 url 都是在 proxy 或者 server 端访问,把 server 或者 proxy 端的外网访问权限去掉,那么所有的 web 监控都会失效。
以上是“Zabbix agent 挂掉后 Zabbix Web 监控依然能够收到数据是怎么回事”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!