zabbix的架构是怎么样的?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: zabbix的架构是怎么样的?

zabbix的构成

zabbix主要由数据库、zabbix_server、zabbix_agent、zabbix_proxy和zabbix_web构成。各个部分的组成结构如下:

zabbix_server

这是zabbix的服务端,是zabbix的逻辑核心。

下面是zabbix_server的main函数的启动过程

也就是说,启动程序最终是 zabbix_server中的server.c里面的MAIN_ZABBIX_ENTRY方法。

以下是该函数的主要步骤和调用的方法:

  1. 初始化环境和锁:
  • 初始化 IPC 服务。
  • 创建锁。
  • 打开日志。
zbx_ipc_service_init_env(CONFIG_SOCKET_PATH, &error);
zbx_locks_create(&error);
zabbix_open_log(&log_file_cfg, CONFIG_LOG_LEVEL, &error);
  1. 打印启动信息:
  • 打印 Zabbix 版本和修订版本信息。
  • 打印启动消息。
printf("Starting Zabbix Server. Zabbix %s (revision %s).\nPress Ctrl+C to exit.\n\n",
        ZABBIX_VERSION, ZABBIX_REVISION);
zabbix_log(LOG_LEVEL_INFORMATION, "Starting Zabbix Server. Zabbix %s (revision %s).",
           ZABBIX_VERSION, ZABBIX_REVISION);
  1. 初始化 IPC 服务和加载模块:
  • 初始化 IPC 服务环境。
  • 创建并加载模块。
  • 释放配置。
zbx_ipc_service_init_env(CONFIG_SOCKET_PATH, &error);
zbx_load_modules(CONFIG_LOAD_MODULE_PATH, CONFIG_LOAD_MODULE, config_timeout, 1);
zbx_free_config();
  1. 初始化运行时控制服务和 Vault:
  • 初始化运行时控制服务。
  • 从环境变量获取 Vault 令牌。
  • 初始化 Vault。
  • 从 Vault 获取数据库凭据。
zbx_rtc_init(&rtc, &error);
zbx_vault_token_from_env_get(&(zbx_config_vault.token), &error);
zbx_vault_init(&zbx_config_vault, &error);
zbx_vault_db_credentials_get(&zbx_config_vault, zbx_config_dbhigh->config_dbuser,
                              &zbx_config_dbhigh->config_dbpassword, &error);
  1. 初始化数据库:
  • 初始化数据库。
  • 检查数据库类型。
  • 初始化数据库缓存。
  • 检查字符集。
zbx_db_init(DCget_nextid, program_type, &error);
zbx_db_get_database_type();
init_database_cache(&error);
zbx_db_check_character_set();
zbx_check_db();
zbx_db_save_server_status();
DBcheck_double_type(zbx_config_dbhigh);
zbx_db_check_instanceid();
  1. 初始化导出功能和历史存储:
  • 初始化导出功能。
  • 初始化历史存储。
zbx_initialize_events();
zbx_init_library_export(&zbx_config_export, &error);
zbx_history_init(&error);
  1. 启动 HA 管理器:
  • 初始化 HA 配置。
  • 启动 HA 管理器。
  • 获取 HA 节点的状态。
zbx_ha_start(&rtc, ha_config, &error);
zbx_ha_get_status(CONFIG_HA_NODE_NAME, &ha_status, &ha_failover_delay, &error);
  1. 根据 HA 状态执行相应操作:
  • 如果是 Active 节点,则执行启动操作。
  • 如果是 Standby 节点,则进行相关处理。
if (ZBX_NODE_STATUS_ACTIVE == ha_status)
{
    server_startup(&listen_sock, &ha_status, &ha_failover_delay, &rtc);
    //...
}
else if (ZBX_NODE_STATUS_STANDBY == ha_status)
{
    //...
}
  1. 在运行中处理消息和事件:
  • 接收并处理 IPC 消息。
  • 处理 HA 消息。
  • 处理运行时控制服务消息。
while (ZBX_IS_RUNNING())
{
    //...
    zbx_ipc_service_recv(&rtc.service, &rtc_timeout, &client, &message);
    zbx_ha_dispatch_message(CONFIG_HA_NODE_NAME, message, &ha_status, &ha_failover_delay, &error);
    zbx_rtc_dispatch(&rtc, client, message, rtc_process_request_ex_server);
    //...
}
  1. 根据 HA 状态进行相关操作:
  • 根据 HA 状态进行不同的操作,例如日志记录、处理状态切换等。
if (ZBX_NODE_STATUS_ERROR != ha_status)
{
    //...
    if (ZBX_NODE_STATUS_ACTIVE == ha_status)
    {
        //...
    }
    else if (ZBX_NODE_STATUS_STANDBY == ha_status)
    {
        //...
    }
}
  1. 在退出时进行清理和关闭:
  • 关闭子系统。
  • 暂停 HA 管理器。
  • 清理数据库版本信息。
  • 注册退出函数。
zbx_rtc_shutdown_subs(&rtc);
zbx_ha_pause(&error);
zbx_db_version_info_clear(&db_version_info);
zbx_on_exit(ZBX_EXIT_STATUS());
  1. 返回 SUCCEED 表示正常退出。

以上是 MAIN_ZABBIX_ENTRY 函数的主要流程和调用的一些关键方法。此函数主要负责初始化 Zabbix 服务端的各个模块,处理 HA 状态,接收和处理消息,执行相应的操作,并在退出时进行清理。

zabbix_agent

这是zabbix中负责实现信息采集的部分。

MAIN_ZABBIX_ENTRY

MAIN_ZABBIX_ENTRY 函数是 Zabbix Agent 启动的主要入口点,以下是函数中的主要步骤:

  1. 处理预定义宏和全局变量初始化:
  • 检查并初始化 Windows 下的异常处理机制(可选)。
  • 初始化变量,包括一个用于存储线程句柄的数组。
  1. 输出启动信息:
  • 如果是以前台模式启动,输出启动信息。
  1. 创建锁和打开日志:
  • 在非 Windows 平台上,创建并初始化锁,防止并发问题。
  • 打开日志文件,如果失败则输出错误信息并退出。
  1. 输出启用的功能信息:
  • 输出当前启用的功能,如 IPv6 支持和 TLS 支持。
  1. 初始化模块和加载用户参数:
  • 如果不是 Windows,禁用核心转储。
  • 在非 Windows 平台上,加载模块。
  • 加载用户定义的参数。
  1. 初始化监听套接字和模块:
  • 如果定义了 CONFIG_FORKS[ZBX_PROCESS_TYPE_LISTENER],则初始化 TCP 监听套接字。
  • 初始化 Modbus 模块。
  1. 初始化和启动数据收集器线程:
  • 初始化数据收集器。
  • 在 Windows 上,初始化性能计数器收集器。
  1. 释放配置内存:
  • 释放配置文件相关的内存。
  1. 初始化 TLS 父线程:
  • 如果启用了 TLS,初始化 TLS 父线程。
  1. 启动各个线程:
  • 计算线程总数。
  • 为每个线程创建参数结构和线程信息结构,然后根据线程类型启动相应的线程(收集器线程、监听线程、主动检查线程)。
  1. 在 Windows 上等待线程退出:
  • 在 Windows 下,使用 WaitForMultipleObjectsEx 等待线程退出。
  1. 在非 Windows 平台上等待任何子进程退出:
  • 在非 Windows 平台上,使用 wait 等待任何子进程退出。
  1. 退出处理:
  • 输出退出信号的日志信息。
  • 在 Windows 下,清理监听套接字并等待服务工作线程终止。
  • 调用 zbx_on_exit 处理程序。
  1. 返回执行结果:
  • 返回 SUCCEED 表示成功,FAIL 表示失败。

这个函数主要负责初始化 Zabbix Agent 的各个模块,启动监听套接字,初始化并启动各个线程,处理异常情况,并在退出时清理资源。

zabbix_proxy

这段代码是 Zabbix Proxy 中的主函数,主要实现了以下功能:

  1. 初始化环境和日志:
  • 初始化 IPC 服务,用于进程间通信。
  • 创建锁。
  • 打开日志文件,根据配置设置日志级别。
if (FAIL == zbx_ipc_service_init_env(CONFIG_SOCKET_PATH, &error))
{
    // 处理错误,退出程序
}

if (SUCCEED != zbx_locks_create(&error))
{
    // 处理错误,退出程序
}

if (SUCCEED != zabbix_open_log(&log_file_cfg, CONFIG_LOG_LEVEL, &error))
{
    // 处理错误,退出程序
}
  1. 打印启动信息和启用的特性:
  • 打印 Zabbix Proxy 的启动信息,包括代理模式、主机名、Zabbix 版本和修订版本。
  • 打印已启用的特性,如 SNMP 监控、IPMI 监控、Web 监控等。
printf("Starting Zabbix Proxy (%s) [%s]. Zabbix %s (revision %s).\nPress Ctrl+C to exit.\n\n",
        ZBX_PROXYMODE_PASSIVE == config_proxymode ? "passive" : "active",
        CONFIG_HOSTNAME, ZABBIX_VERSION, ZABBIX_REVISION);

zabbix_log(LOG_LEVEL_INFORMATION, "Starting Zabbix Proxy (%s) [%s]. Zabbix %s (revision %s).",
        ZBX_PROXYMODE_PASSIVE == config_proxymode ? "passive" : "active",
        CONFIG_HOSTNAME, ZABBIX_VERSION, ZABBIX_REVISION);

zabbix_log(LOG_LEVEL_INFORMATION, "**** Enabled features ****");
zabbix_log(LOG_LEVEL_INFORMATION, "SNMP monitoring:       " SNMP_FEATURE_STATUS);
// ... 其他特性
zabbix_log(LOG_LEVEL_INFORMATION, "**************************");
  1. 加载模块和释放配置:
  • 加载 Zabbix 模块。
  • 释放配置文件。
if (FAIL == zbx_load_modules(CONFIG_LOAD_MODULE_PATH, CONFIG_LOAD_MODULE, config_timeout, 1))
{
    // 处理错误,退出程序
}

zbx_free_config();
  1. 初始化运行时控制服务和其他初始化:
  • 初始化运行时控制服务(zbx_rtc_init)。
  • 初始化数据库缓存、代理历史锁、配置缓存等。
  • 初始化自监控、VMware 缓存、Vault 等。
  • 初始化并获取数据库凭证。
if (SUCCEED != zbx_rtc_init(&rtc, &error))
{
    // 处理错误,退出程序
}

if (SUCCEED != init_database_cache(&error))
{
    // 处理错误,退出程序
}

// ... 其他初始化

if (0 != CONFIG_FORKS[ZBX_PROCESS_TYPE_VMWARE] && SUCCEED != zbx_vmware_init(&error))
{
    // 处理错误,退出程序
}

if (SUCCEED != zbx_vault_token_from_env_get(&(zbx_config_vault.token), &error))
{
    // 处理错误,退出程序
}

// ... 其他初始化

proxy_db_init();
  1. 注册统计信息和禁用核心转储:
  • 注册统计信息函数。
  • 注册统计信息扩展函数。
  • 注册进程信息函数。
  • 初始化诊断。
zabbix_log(LOG_LEVEL_INFORMATION, "using configuration file: %s", config_file);

#if defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
if (SUCCEED != zbx_coredump_disable())
{
    // 处理错误,退出程序
}
#endif

zbx_register_stats_data_func(zbx_preproc_stats_ext_get, NULL);
// ... 其他注册统计信息

zbx_diag_init(diag_add_section_info);
  1. 启动子进程:
  • 根据配置启动不同的子进程,如配置同步器、传送程序、数据发送器、轮询器等。
  • 为每个子进程启动一个线程。
for (i = 0; i < threads_num; i++)
{
    // 获取进程信息
    if (FAIL == get_process_info_by_thread(i + 1, &thread_args.info.process_type,
            &thread_args.info.process_num))
    {
        // 处理错误,退出程序
    }

    // 设置线程信息
    thread_args.info.server_num = i + 1;
    thread_args.args = NULL;

    // 启动不同类型的子进程
    switch (thread_args.info.process_type)
    {
        case ZBX_PROCESS_TYPE_CONFSYNCER:
            // ... 启动配置同步器线程
            break;
        case ZBX_PROCESS_TYPE_TRAPPER:
            // ... 启动传送程序线程
            break;
        // ... 其他子进程类型
    }
}
  1. 主循环:
  • 在主循环中,等待 IPC 消息,根据消息调用运行时控制服务处理函数。
  • 检查子进程状态,如果子进程退出,则设置服务端退出标志。
while (ZBX_IS_RUNNING())
{
    zbx_ipc_client_t    *client;
    zbx_ipc_message_t   *message;

    (void)zbx_ipc_service_recv(&rtc.service, &rtc_timeout, &client, &message);

    if (NULL != message)
    {
        zbx_rtc_dispatch(&rtc, client, message, rtc_process_request_func);
        zbx_ipc_message_free(message);
    }

    if (NULL != client)
        zbx_ipc_client_release(client);

    if (0 < (ret = waitpid((pid_t)-1, &i, WNOHANG)))
    {
        zbx_set_exiting_with_fail();
        break;
    }

    if (-1 == ret && EINTR != errno)
    {
        zabbix_log(LOG_LEVEL_ERR, "failed to wait on child processes: %s", zbx_strerror(errno));
        zbx_set_exiting_with_fail();
        break;
    }
}
  1. 程序退出:
  • 在主循环结束后,记录退出信号,并在合适的时机进行清理和退出。
out:
zbx_log_exit_signal();

if (SUCCEED == ZBX_EXIT_STATUS())
    zbx_rtc_shutdown_subs(&rtc);

zbx_on_exit(ZBX_EXIT_STATUS());

return SUCCEED;

总体来说,这个主函数完成了 Zabbix Proxy 的初始化、配置加载、模块加载、子进程启动和主循环等一系列操作,保证了代理的正常运行。

zabbix_web

主要就是利用Php编写的网站界面和逻辑代码。位于源码的ui目录下。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
存储 监控 数据可视化
【Zabbix_6.x 第一章】概述、功能、术语、架构
【Zabbix_6.x 第一章】概述、功能、术语、架构
121 0
|
运维 监控 前端开发
Zabbix监控系统架构原理(一)
zabbix架构及部署 我们这次先安装再进行介绍zabbix 1.什么是监控 监控:监视,控制 随着用户的增量,服务随时可能被系统oom,所谓oom就是out of memory,当系统的负载到达一定程度,内存使用率使用殆尽,就会触发这种情况,触发oom后系统会kill掉内存使用率最高的进程,服务随之崩溃,omm会触发kernel,kernel为了保障服务器正常运行,会把使用最高的进程kill
388 0
Zabbix监控系统架构原理(一)
|
存储 监控
3000台服务器,Zabbix监控的配置和架构应该是怎么样的?
主备环境 基于master-node-client架构,按照不同域间可追加多个代理,基本系统要求如下:  1.31数据库方面两台MySQLl都可读写,互为主备,可使用一台MySQLl1负责数据的读取,MySQLl2用于写数据; MySQLl1是MySQLl2的主库,MySQLl2又是MySQLl.
2260 0
|
监控 Unix 数据库
|
6月前
|
存储 SQL 监控
修改Zabbix源码实现监控数据双写,满足业务需求!
虽然对接Elasticsearch后有诸多好处,但是它不往数据库写历史数据了,同时还不再计算趋势数据了。有这么一个场景...
修改Zabbix源码实现监控数据双写,满足业务需求!
|
6月前
|
数据采集 监控 数据库
OceanBase社区版可以通过Zabbix监控
OceanBase社区版可以通过Zabbix监控
269 4
|
3月前
|
监控 安全 Linux
在Linux中,zabbix如何监控脑裂?
在Linux中,zabbix如何监控脑裂?
|
16天前
|
SQL 监控 数据库
OceanBase社区版可以通过Zabbix监控
OceanBase社区版可以通过Zabbix监控
54 7

推荐镜像

更多