Nagios对集群主机和集群服务的监控

 

1. 介绍

有些人咨询有关集群主机和集群服务的监控,因而写本文档来解释如何来做,希望这些简单明瞭。

首先来解释一下“集群”。用例子来说明较容易理解。有5台主机来提供DNS解析服务,如果一台宕机,这不算什么,因为仍旧有几台机器在提供DNS服务。如果需要监控这个DNS服务,那么就有5个DNS服务器,这种情况下,这个DNS服务被认为是一个集群服务,它有5个独立的DNS服务构成。虽然需要各自独立地对服务进行监控,但更关心的是整体的DNS服务集群能否正常工作,而不是某个独立的服务工作情况。

如果你有一个主机群来提供高可靠性服务(集群)解决方案,这种情况被认为是一个集群主机。如果一台主机宕机,另一个将接管全部失效主机的工作。一个提示,如果想配置一个Linux集群系统,可以访问高可靠性Linux集群项目

2. Plan of Attack

有几步来监控集群服务和集群主机。下面将尽可能简单地说明。监控集群主机和集群服务有两步要做:

  1. 监控集群内的元件
  2. 监控一个集合体

监控集群中的主机与服务元件比较容易。事实上可能你已经做过到了。对于集群服务,只要确保已经实现了对集群服务中的每个服务都已经处于监控状态,如果是一个5台DNS服务组成的集群,要保证定义出了5台域名解析服务对象(可能会用到check_dns插件)。对于集群主机,要确保对集群主机中的每一台都有对象定义(同样必须要给每个主机至少要绑定一个服务)。

重要

可能要关闭集群主机或集群服务里每个元件的报警通知功能。虽然每个元件没有独立送出通知,但仍旧可以在当前状态CGI模块里独立地查看每个集群元件状态显示。这样可能有助于查找集群服务的故障根源。

监控集群整体可以使用对集群每个元件检测的缓存检测结果。虽然也可以在集群检测的时候对全部元件进行再检测,但有缓存结果的情况下为什么要再次浪费带宽和资源来再做一遍呢?缓存结果在哪里?在状态文件中保存了集群中的每个元件的缓存检测结果(假定已经对每个元件进行监控)。那个check_cluster插件被设计为在状态文件中取出缓存检测结果来完成对集群检测。

重要

虽然没有对集群每个元件使能通知功能,但仍旧可以完成对集群整体的检测。

3. 使用集群检测check_cluster插件

那个check_cluster插件被设计为从集群中每个独立的集群元件状态结果中提供状态信息来生成集群整体状态。

check_cluster插件可以在Nagios插件软件包(http://sourceforge.net/projects/nagiosplug/)的发行目录中找到。

4. 监控服务集群

假定要对一个由3台DNS服务组成的了冗余域名解析服务群进行监控。首先,在做为一个集群监控之前,已经可以各自独立地完成对三个域名解析服务的监控,假定是3台DNS主机分别叫host1、host2和host3,它们上面绑定有名为"DNS Service"的服务。

为了完成对集群监控,需要创建一个"集群"服务对象。然而,在此之前,需要先定义一个对集群服务检测命令配置。假定这个叫做check_service_cluster命令是这样定义的:

define command{
command_name check_service_cluster
command_line /usr/local/nagios/libexec/check_cluster --service -l $ARG1$ -w $ARG2$ -c $ARG3$ -d $ARG4$
}

现在就可以创建一个叫"cluster"的集群服务对象了,里面用刚刚定义的check_service_cluster命令来做检测。下面例子将示意如何来做。例子中给出了如果有2个或2个以上的服务处于非正常状态时将会产生一个紧急状态,如果只有1个服务处于非正常状态时将产生告警状态,如果全部正常将返回一个集群服务处于"正常"的状态。

define service{
...
check_command check_service_cluster!"DNS Cluster"!1!2!$SERVICESTATEID:host1:DNS Service$,$SERVICESTATEID:host2:DNS Service$,$SERVICESTATEID:host3:DNS Service$
...
}

很重要的一点是,要注意在集群检测命令里的第4个命令参数宏$ARG4$里使用了一个逗号分隔的按需服务状态列表,这个非常重要!Nagios将当前集群中的每个服务状态ID来填充这些按需宏的状态值(用数值而不是字符串),有关按需主机与服务宏的信息可以查阅这篇文档。

5. 主机集群的监控

对集群主机的监控与集群服务相类似,当然最主要的不同的组成集群的是主机而非服务。为完成对集群主机的监控,必须定义一个使用check_cluster插件的服务对象。该服务将不属于集群中的任何一个主机,因为绑定在某个主机上时,当它宕机时会使得集群主机的通知无法送出。把这个集群服务绑定在Nagios运行主机上是个好主意。毕竟如果Nagios运行可以对集群检查,如果宕掉,也就无法进行监控了(除非你设置了冗余监控主机)...

不管如何,假定有一个命令check_host_cluster的定义是这样的:

define command{
command_name check_host_cluster
command_line /usr/local/nagios/libexec/check_cluster --host -l $ARG1$ -w $ARG2$ -c $ARG3$ -d $ARG4$
}

假设是个3台主机(分别命名为"host1"、"host2"和"host3")组成的集群主机。如果想让Nagios在发现有1台没有运行时送出告警报警,在2台或2台以上时送出紧急报警,那么集群主机的监控会这样来定义:

define service{
...
check_command check_host_cluster!"Super Host Cluster"!1!2!$HOSTSTATEID:host1$,$HOSTSTATEID:host2$,$HOSTSTATEID:host3$
...
}

很重要的一点是,要注意在集群检测命令里的第4个参数$ARG4$是传递了一个逗号分隔的按需主机状态列表。这个很重要!Nagios将会用集群里当前各个主机状态的ID值(数值而不是字符串)来填充按需状态宏。

就 这么多。Nagios将定期地检测集群主机的状态并在状态变换时(假定已经使能了该服务的通知功能)送给你通知。注意对于集群里的每个主机成员,可能需要 关闭主机宕机等的通知功能。记住,对于一个集群来说,你真正关心的一是某台主机的状态而是集群整体状态。你或许想在主机对象定义里去掉有关不可达通知的功 能,这取决于你的网络层情况以及如何现构建集群。