民生银行 Zabbix源码解析之Server启动流程

举报
Zabbix中国 发表于 2021/06/15 17:43:29 2021/06/15
【摘要】 Zabbix Server是所有配置、统计和操作数据的中央存储中心,也是 Zabbix 监控系统的告警中心,负责执行数据的主动轮询和被动获取,计算触发器条件,向用户发送通知。

概述

Zabbix Server是所有配置、统计和操作数据的中央存储中心,也是 Zabbix 监控系统的告警中心,负责执行数据的主动轮询和被动获取,计算触发器条件,向用户发送通知。

Server端进程有多达二十多种(当我们在操作系统下用ps –ef命令来查看时,往往看到很多zabbix系统进程,而这些系统进程在zabbix内部称为实例。这些实例各处负责不同的工作,就形成了不同种类型的进程)。

整体启动过程

Server启动后,会先读取配置文件,接受命令行参数,然后执行一系列的初始化动作,创建负责不同工作的进程实例后, Server开始运行工作,如下:

图片

接下来我们一起分析并解读zabbix server端源代码,我们增加了注释和说明,有助于大家了解启动过程的具体实现。

main函数

源码文件server.c的main函数是zabbix server的程序入口,通过分析main函数执行过程,总结操作序列如下图所示:

图片

struct ZBX_TASK_EX

图片

该结构体用于zabbix启动时记录zabbix任务的一些信息。

•  zbxtaskt: 是一个枚举,表示任务类型,在启动时指定为:ZBX_TASK_START。如果启动时指定 --runtime-control(或-R)选项(执行管理能力),则设置t.task = ZBX_TASK_RUNTIME_CONTROL。

• flags: 代表启动时的标志。如果启动时指定--foreground(或-f)选项(在前台运行zabbix守护进程),则t.flags会多添加一个ZBX_TASK_FLAG_FOREGROUND标志。当zabbix_server作为daemon启动时,flags会作为daemon的参数传入。

•  data: 记录--runtime-control的选项信息,比如改变日志的级别或cache reload的值。比如:-R log_level_increase,-R config_cache_reload。


 struct cfg_line

图片

该结构体用于表示一个配置选项

•  parameter: zabbix_server.conf中的参数名

•  variable: 程序中参数的值

•  type: 参数类型,有TYPEINT,TYPESTRING等类型

•  mandatory: 是否是必须设定的参数

•  min: 限定参数范围,最小值

•  max: 限定参数范围,最大值

 daemon_start函数

操作序列如下图所示:


 zbx_set_common_signal_handlers函数

该函数用来设置通用的信号的handlers。



 sigaction函数

POSIX标准定义的信号处理接口是sigaction函数,其接口头文件及原型如下:


•  signum:要操作的信号。

•  act:要设置的对信号的新处理方式。

•  oldact:原来对信号的处理方式。

 struct sigaction


该结构体用来描述对信号的处理。

•  sa_handler: 函数指针,其含义是一个信号处理函数。只不过它只有一个int参数。

•  sa_sigaction: 函数指针,另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。

•  sa_mask: 用来指定在信号处理函数执行期间需要被屏蔽的信号,特别是当某个信号被处理时,它自身会被自动放入进程的信号掩码,因此在信号处理函数执行期间这个信号不会再度发生。

•  sa_flags: 用于指定信号处理的行为,它可以是以下值的“按位或”组合。

–  SA_RESTART: 使被信号打断的系统调用自动重新发起。

–  SA_NOCLDSTO: 使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。

–  SA_NOCLDWAIT: 使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程。

–  SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。

–  SA_RESETHAND: 信号处理之后重新设置为默认的处理方式。

–  SASIGINFO: 使用 sasigaction 成员而不是 sahandler 作为信号处理函数。包含了`SASIGINFO标志时,系统将使用sasigaction函数作为信号处理函数,否则使用sahandler作为信号处理函数。在某些系统中,成员sahandler与sasigaction`被放在联合体中,因此使用时不要同时设置。

 set_daemon_signal_handlers函数

该函数用来设置daemon使用的信号的handlers。


zbx_set_child_signal_handler函数

该函数用来设置子进程的信号的handlers。


MAIN_ZABBIX_ENTRY函数

操作序列如下图所示:


zabbix_open_log函数

该函数用于打开日志文件



 zbx_load_modules函数

加载可加载模块(动态链接库的形式,example中的dummy的例子)。

DBconnect函数

连接到数据库。

DCsync_configuration函数

从DB中同步配置数据

zbx_check_postinit_tasks函数

处理初始化以后的任务


 DBclose函数

关闭数据库连接。

创建子进程

下面分析创建子进程的过程。

 struct zbx_thread_args_t

该结构体保存进程参数


•  server_num:进程编号

•  process_num:此种类型的进程的序号

• processtype: 创建的子进程类型,如:ZBXPROCESSTYPEHOUSEKEEPER,ZBXPROCESSTYPE_POLLER

•  args:进程的附加参数信息

ZBX_THREAD_ENTRY宏

定义宏的目的,是为了跨平台,统一使用一个名称。


ZBX_THREAD_ENTRY定义了函数,在创建新进程时,会调用这些函数

ZBX_THREAD_ENTRY(dbconfig_thread, args)
...
ZBX_THREAD_ENTRY(poller_thread, args)
...
ZBX_THREAD_ENTRY(trapper_thread, args)
...

 创建各个子进程






zbx_thread_start函数

zbx_thread_start是一个封装函数,在其中会调用fork()函数,创建子进程。



zbx_on_exit函数

当子进程发生错误,导致主进程退出时,执行zbx_on_exit函数。



记录日志

配置文件中的配置

zabbixserver的日志的位置,级别等配置,在`zabbixserver.conf`中进行配置。



实现

1、zabbix日志的实现,头文件在:include/log.h,实现文件在src/libs/zbxlog/log.c中。

2、配置文件中的LogType指定日志文件的类型,一般记录到文本文件中,因此指定为file。对应的源码中的设置为:


3、当LogType指定为file时,需要LogFile指定记录的日志文件的名称和位置。

4、DebugLevel指定日志级别。默认为warnings。对应源码中的设置为:


5、无论日志级别设置为什么,使用LOG_LEVEL_INFORMATION级别来设置日志,总是能打印出来。所以我们在调查源码时,可以以LOG_LEVEL_INFORMATION级别来记录调试日志。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。