共計 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 行業資訊頻道!