监控系统Nagios系列(三) 运行时
1. 编译安装
Nagios安装需要从源代码编译,Nagios本身对外部依赖很小(apache2, PHP, GD, GCC)。具体的安装,Nagios官方文档有step by step的介绍,本人使用的ubuntu,如果你也使用的是ubuntu,那么参考这里如何安装。
官方的文档安装的是3.2.3版本,且安装了插件,这片文章里面,安装的是4.0版本,且没有插件。不安装插件是为了更好理解。
不安装插件很简单,就是不安装xxx_plugin的包就可以。PS:没有特别说明,后续出现的Nagios都是指Nagios Core。2. 运行时全景图
Nagios Core 是不包含任何监控实现的,所有的监控实现都是由Plugin提供的,Nagios Core 只负责定义对象,执行插件,获取结果,通知状态变化。上图是 Nagios Core + 各种Plugin 的全景图。
Objects
被监控的对象,可以是通用服务器,路由器,交换机等。与这些对象交互,都是通过插件完成的,因此通过增加新的插件很容易扩展新的监控对象。图里面提到的Active Checks, PassiveChecks稍后会介绍。Status
监控数据的展示。包含状态通知,性能数据展示。状态通知也是由插件实现的,因此开发者可以定义任何形式的通知,短信,邮件,微信,都可以。Nagios
图中的Nagios 表示 Nagios Core ,Plugins 表示各种插件, Performance Data 是插件输出的性能数据。 N2RRD 是一个插件,可以将性能数据保存到 RRD 数据库中。 RRD 的全称是Round Robin Database ,是专门设计存储与时间相关的监控数据。RRD 有一个开源实现 rrdtool ,rrdtool 提供了操纵监控数据的接口,并提供将监控数据以图表输出的能力,关于 rrdtool 后面我们会单独介绍。Active Checks & Passive Checks
Nagios 定义了两种检查的类型。Active Checks 是表示由 Nagios 进程执行后获取到结果的检查;Passive Checks 表示由外部系统检查获取到结果后,将结果发送给 Nagios 处理。之所以需要 Passive Checks 是因为一些数据的获取,并不是每次主动执行获得的,典型的如SNMP Trap,这种接口,是被动接收的,所以插件需要提供一个常驻进程负责接收 SNMPTrap,然后将数据发送给 Nagios 处理。
3. 目录结构
Nagios 默认安装在 /usr/local/nagios 目录下,下面是 Nagios 根目录下的目录:
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 bindrwxrwxr-x 3 nagios nagios 4096 1月 19 20:37 etcdrwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 libexecdrwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 sbindrwxrwxr-x 10 nagios nagios 4096 1月 19 20:33 sharedrwxrwxr-x 5 nagios nagios 4096 1月 19 22:11 var
bin
可执行文件目录。包含:nagios, nagiostats 。nagios 是主文件,启动 nagios 就是这个可执行文件。
etc
所有的配置文件目录。包含全局配置文件,对象配置文件等。libexec
插件存放目录。每个插件就是一个或多个可执行文件。插件并不要求一定存放在此目录,插件可以存放在任何目录。libexec 只是约定的插件存放目录。sbin
CGI 可执行文件,处理Web展示相关逻辑。share
Web文件,包括 HTML ,PHP 等。var
运行时动态文件或临时文件目录。存放 PID 文件,log 文件等。etc 目录结构:
-rw-rw-r-- 1 nagios nagios 12015 1月 19 20:33 cgi.cfg-rw-r--r-- 1 root root 50 1月 19 20:37 htpasswd.users-rw-rw-r-- 1 nagios nagios 44475 1月 19 20:33 nagios.cfgdrwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 objects-rw-rw---- 1 nagios nagios 1312 1月 19 20:33 resource.cfg
cgi.cfg
Web相关的配置。htpasswd.users
Web登录用户名和密码。nagios.cfg
Nagios主配置文件。objects
对象文件目录。resource.cfg
用户自定义宏 (macro) 保存在此文件。var 目录结构:
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 archives-rw-r--r-- 1 nagios nagios 6 1月 19 20:45 nagios.lock-rw-r--r-- 1 nagios nagios 8842 1月 19 21:45 nagios.log-rw-r--r-- 1 nagios nagios 12660 1月 19 20:45 objects.cache-rw------- 1 nagios nagios 13474 1月 19 21:45 retention.datdrwxrwsr-x 2 nagios nagcmd 4096 1月 19 20:46 rwdrwxr-xr-x 3 root root 4096 1月 19 20:33 spool
-rw-rw-r-- 1 nagios nagios 13910 1月 19 22:33 status.dat
archives
日志 log 归档目录。nagios.lock
防止多个进程同时启动的锁文件。nagios.log日志文件。objects.cache
对象缓存文件。 Nagios 可以将对象缓存到此文件,加快访问速度。retention.dat
Nagios运行过程中dump出来的文件。 Nagios 可以将运行过程中内存中有用的信息dump到
文件,持久化。下次启动时候,会读取这个文件,继续上次未完成的工作。rw
外部程序吐数据给 Nagios 存放在此目录。还有在Web页面上用户可以指定执行的命令,也存放在此目录。spool
Nagios 执行检查时候,会将插件的输出保存到文件,默认在此目录。status.dat
对象状态信息。Nagios会定时将对象状态信息保存到此文件。Web程序读取此文件内容,展示到页面。
4. 线程
Nagios 只有一个主线程,不要惊讶。 Nagios实际上是使用多进程替代了多线程,下面会讲解进程模型。
Nagios 不使用多线程,推测有两个原因:
技术限制
Nagios 在90年代就有了,是C代码实现的。那时候还没有多线程,从线程的名字LWP(LightWeigth Process)也可以看到,线程实际上是轻量级进程。健壮性
Nagios 监控对象状态,都是通过执行插件得到返回结果,因此 Nagios 会执行数量巨大的外部命令,外部命令可能执行过程僵死,如果使用线程,那么 Nagios 进程就会存在一些线程被挂住无法继续工作,会影响 Nagios 进程的资源消耗,会影响其他插件的执行。通过进程隔离可以减少 Nagios 进程不工作的概率。
Nagios的主线程,是一个自给自足的模型,套用生产者-消费者模型,主线程即是生产者又是消费者。主线程循环检查事件队列,发现有到期的事件,则根据事件类型,处理该事件。如果是执行插件检查状态的事件,那么主线程会拼装命令,交给子进程执行。很简单!!!
5. 进程
Nagios 有一个主进程(Nagios Daemon),还有一些 Worker 进程,Worker 进程负责执行由Nagios Daemon 进程传递过来的命令。
Worker 的数量可以配置,默认四个,可以在 nagios.cfg 文件中更改此值:
nagios 10474 1 0 20:45 ? 00:00:01 ./nagios -d /usr/local/nagios/etc/nagios.cfgnagios 10475 10474 0 20:45 ? 00:00:00 /usr/local/nagios/bin/nagios --worker/usr/local/nagios/var/rw/nagios.qh
nagios 10476 10474 0 20:45 ? 00:00:00 /usr/local/nagios/bin/nagios --worker/usr/local/nagios/var/rw/nagios.qh
nagios 10477 10474 0 20:45 ? 00:00:00 /usr/local/nagios/bin/nagios --worker/usr/local/nagios/var/rw/nagios.qh
nagios 10478 10474 0 20:45 ? 00:00:00 /usr/local/nagios/bin/nagios --worker/usr/local/nagios/var/rw/nagios.qh
nagios 10481 10474 0 20:46 ? 00:00:00 ./nagios -d /usr/local/nagios/etc/nagios.cfg
Nagios 主进程与 Worker 进程之间通过Linux 的文件socket通信,这个文件就是 上面看到的nagios.qh 文件。