本帖最后由 monicazhang 于 2015-10-30 21:29 编辑
21、清理downtime数据 22、清理注释数据 23、如果是关闭信号,清理status.dat 24、如果是关闭信号,删除cmd文件
步骤比较简单,其中比较重要的有两个,一个是13,初始化循环,另一个就是17,nagios在作为daemon运行的过程中,就是在不断的执行这个循环。 执行图如下:
(二)流程详细分析1、初始化循环 nagios是个基于事件的监控系统,所有的操作都是由事件触发器触发的。 nagios安装
nagios启动的时候,会启动一个init_timing_loop函数,来进行事件循环的初始化。 init_timing_loop主要流程如下:
(1)建立scheduling_info表,表的内容有: 总service数(在时间表外的也算) 已经在表中的service数 总host数(时间表外的也算) 在列表中的host数 单个host平均service数(总service数/总host数) 列表中单个host的service数(列表中service数/列表中host数) 平均service检查时间间隔(service检查总间隔/列表中service数) service检查总间隔 平均service检查延时 host检查总间隔 平均host检查延时 (2)得到被调度的服务监测的一些信息,并填充相应的sche_info结构 (3)得到被调度的主机监测的一些信息,并填充相应的sche_info结构 开源监控软件 (4)确定服务调度参数 Scheduling_info.service_inter_check_delay Scheduling_info.service_interleave_factor (5)调度服务检测 计算每一个服务下一次检测时间 for() 并把服务的每一个检测事件插入到事件队列中区for() (6)确定主机调度参数 Scheduling_info.host_inter_check_delay (7)调度主机检测 计算每一个主机下一次检测时间 for() 并把主机的每一个检测事件插入到事件队列中区for() (8)插入其他事件(高优先级队列) Event_list_high
2、主循环(event_execution_loop)
nagios在进入守护状态以后,会一直运行一个循环event_execution_loop,nagios所有的操作全部在这个循环中得到实现。
循环会不断检查两个event队列,一个是高优先级,包括nagios的除了检查之外的所有任务,另外一个是低优先级,包括host和service的检测。循环会先检测高优先级的event队列,然后一个一个执行完毕,最后再判断下host和service的检测是不是有必要,然后再对其进行检测。在执行event队列的时候,用的函数都是一样的,名字是handle_timed_event,当每个handle_timed_event执行完以后返回,然后再执行下一个事件任务。 handle_timed_event函数的开始是个case语句,对事件进行分类处理,具体event_type如下: nagios配置 (1)event_service_check(检查service) (2)event_host_check(检查host) (3)event_command_check(检查cmd文件,被动监控,cgi发送的命令都会送到cmd文件中) (4)event_log_rotation(日志滚动) (5)event_program_shutdown(nagios关闭) (6)event_program_restart(nagios重启) (7)event_check_reaper(检查结果回收) (8)event_orphan_check(检查孤儿host和service) (9)event_retention_save(保存检查结果到retention.dat,关闭nagios不删除此文件) (10)event_status_save(保存检查结果到status.dat,关闭nagios会删除) (11)event_scheduled_downtime (12)event_sfreshness_check(检查service新鲜度?) (13)event_hfreshness_check(检查host新鲜度?) (14)event_expire_downtime (15)event_reschedule_checks(重新编排event列表,与上文说的初始化循环类似) 监控软件 (16)event_expire_comment (17)event_user_function
3、主动监测(event_service_check,event_host_check)
event_service_check调用了run_scheduled_service_check函数, 然后再调用函数run_async_service_check。 这个函数主要完成以下任务: (1)、首先从service结构体中得到命令行。Processed_command函数 (2)、给全局变量check_result_info赋值,其中output_file_fp为一临时文件,记录了check_result_info的一些信息 (3)、perl解释器运行脚本(如果没有定义的话就跳过) (4)、fork()进程,在子进程中处理具体的命令(服务监测) 》popen执行命令 》继续往check_result_info中添加内容 》move_check_result_to_queue Check_result_info记录以及输出结果生成.ok文件 nagios实施 (5)、父进程等待子进程运行结束
如果在配置文件中开启了use_large_installation_tweaks选项,那么在检查的时候,会fork两次子进程,父进程并不会等待检查进程返回结果,只要fork的进程数量不超过配置文件中设置的最大进程数量(max_service_check_spread和max_host_check_spread),就不会有问题。
4、结果回收(event_check_reaper)
event_check_reaper调用reap_check_results函数,读取所有检查结果,并且在循环中依次调用process_check_result_queue进行结果回收。 process_check_result_queue负责把保存在文件中的检查结果读出,并且插入check_result_list中,删除结果文件。 然后handle_async_service_check_result再对结果进行处理,这些处理包括了:更新检查结果到service_list链表,obsessive检查结果,event_broker,报警等等 handle_async_host_check_result_3x 用来检查host状态,和service类似。如果在reap_check_result中时间超过max_check_reaper_time,则退出循环。max_check_reaper_time的默认值为30s,在nagios.cfg中,可以通过设置max_check_result_reaper_time来进行设置。 我们得到了两个链表:host_list和service_list,里面存储了我们所有host和service的最新的检查结果。 nagios培训
5、结果输出(event_status_save)
event_status_save比较简单,就是将host_list和service_list中的数据同步到status.dat中,不过是全部同步,如果检查结果很多的话,虽然不知道具体要占用多少io,但是如果对于数据在页面上的展示没有需求的,只需要检查,处理报警(或许还需要入库)的,就没必要再来这么一步了。
|