监控系统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 ChecksPassive Checks稍后会介绍。
  • 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,这种接口,是被动接收的,所以插件需要提供一个常驻进程负责接收 SNMP Trap,然后将数据发送给 Nagios 处理。

3. 目录结构
Nagios 默认安装在 /usr/local/nagios 目录下,下面是 Nagios 根目录下的目录:
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 bin
drwxrwxr-x 3 nagios nagios 4096 1月 19 20:37 etc
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 libexec
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 sbin
drwxrwxr-x 10 nagios nagios 4096 1月 19 20:33 share
drwxrwxr-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.cfg
drwxrwxr-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.dat
drwxrwsr-x 2 nagios nagcmd 4096 1月 19 20:46 rw
drwxr-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(Light Weigth 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.cfg
nagios 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 文件。

转载请注明:运维派 » 监控系统Nagios系列(三) 运行时

0
2.7k
2
  1. 监控对象状态,都是通过执行插件得到返回结果,因此 Nagios 会执行数量巨大的外部命令,外部命令可能执行过程僵死,如果使用线程,那么 Nagios 进程就会存在一些线程被挂住无法继续工作,会影响 Nagios 进程的资源消耗,会影响其他插件的执行。通过进程隔离可以减少 Nagios 进程不工作的概率。

  2. Pingback: 《监控系统Nagios系列(五) 检查类型(active_check & passive_check)》 - 茶话汇 - TekTea's Blog