Nagios 监视服务和主机群集

介绍

首先,我们需要定义“集群”的含义。理解这一点的最简单方法是举一个例子。假设您的组织有五个主机,它们为组织提供冗余的DNS服务。如果其中之一发生故障,则不会造成重大灾难,因为其余服务器将继续提供名称解析服务。如果您要监视组织对DNS服务的可用性,则需要监视五个DNS服务器。这就是我认为的服务簇。服务群集由五个要监视的单独的DNS服务组成。尽管您确实希望监视每项服务,但是您主要关心的是DNS服务群集的总体状态,而不是任何一项特定服务的可用性。

如果您的组织有一组提供高可用性(群集)解决方案的主机,那么我会将其视为主机群集。如果一台特定主机发生故障,则另一台主机将接管发生故障的服务器的所有职责。作为附带说明,请查看“高可用性Linux项目”以获取有关通过Linux提供主机和服务冗余的信息。

部署方案

有几种方法可以潜在地监视服务或主机群集。我将介绍我认为最简单的方法。监视服务或主机群集涉及两件事:

  • 监视单个群集元素
  • 监视群集作为一个集体实体

监视单个主机或服务群集元素比您想象的要容易。实际上,您可能已经在这样做了。对于服务群集,只需确保您正在监视群集的每个服务元素。如果您有一个由五个DNS服务器组成的群集,请确保具有五个单独的服务定义(可能使用check_dns插件)。对于主机群集,请确保已为群集的每个成员配置了适当的主机定义(还必须为每个主机定义至少一个要监视的服务)。

重要说明:您将要禁用针对各个群集元素(主机或服务定义)的通知。即使不会发送有关各个元素的通知,您仍然可以在状态CGI中直观地看到各个主机或服务的状态。这对于将来确定群集中的问题根源很有用。

可以通过使用以前缓存的集群元素结果来监视整个集群。尽管您可以重新检查集群的所有元素以确定集群的状态,但是为什么已经缓存了结果却又浪费带宽和资源呢?结果在哪里缓存?可以在状态文件中找到群集元素的缓存结果(假设您正在监视每个元素)。该check_cluster插件在状态文件检查缓存主机和服务状态而设计的。重要说明:尽管您没有为集群的各个元素启用通知,但是您希望为整个集群状态检查启用它们。

使用check_cluster插件

check_cluster插件旨在通过检查每个单独的主机或服务集群元素的状态信息来报告主机或服务集群的总体状态。

check_cluster插件可以在的插件目录中找到在Github上Nagios的插件项目

监控服务集群

假设您有三台DNS服务器,它们在网络上提供冗余服务。首先,您需要分别监视每个DNS服务器,然后才能将它们作为群集进行监视。我假设您已经具有与DNS主机(称为“ host1”,“ host2”和“ host3”)关联的三个单独的服务(都称为“ DNS服务”)。

为了将服务作为群集进行监视,您需要创建一个新的“群集”服务。但是,在执行此操作之前,请确保已配置服务集群检查命令。假设您有一个名为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$ 
}

现在,您需要创建“集群”服务,并将刚创建的check_service_cluster命令用作集群的check命令。下面的示例提供了有关如何执行此操作的示例。如果群集中有2个或更多服务处于非正常状态,则下面的示例将生成CRITICAL警报,如果只有一个服务处于非正常状态,则将生成警告警报。如果群集的所有单个服务成员均正常,则群集检查也将返回“正常”状态。

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

重要的是要注意,我们正在集群检查命令中将逗号分隔的按需服务状态列表传递给$ ARG4 $宏。那很重要!Nagios Core将使用集群中各个成员的当前服务状态ID(数字值,而不是文本字符串)填充这些按需宏。

监控主机群集

监视主机群集与监视服务群集非常相似。显然,主要区别在于群集成员是主机而不是服务。为了监视主机群集的状态,您必须定义一个使用check_cluster插件的服务。服务应该不会有任何集群中的主机相关联,仿佛这台主机出现故障,这将导致与通知的群集问题。一个好主意可能是将服务与运行Nagios Core的主机相关联。毕竟,如果运行Nagios Core的主机出现故障,则Nagios Core不再运行,因此就监视而言您无能为力(除非您设置了冗余监视主机))。

假设您有一个定义如下的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$ 
}

假设您在主机群集中有三个主机(分别名为“ host1”,“ host2”和“ host3”)。如果您希望Nagios Core在群集中的一台主机未启动时生成警告警报,或者在两个或多个主机未启动时生成严重警报,则您定义的用于监视主机群集的服务可能类似于以下内容:

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

重要的是要注意,我们在集群检查命令中将逗号分隔的按需主机状态列表传递到$ ARG4 $宏。那很重要!Nagios Core将使用集群中各个成员的当前主机状态ID(数字值,而不是文本字符串)填充那些按需宏。

就是这样,Nagios Core将定期检查主机群集的状态,并在其状态降级时向您发送通知(假设您已启用该服务的通知)。请注意,对于每个群集成员的主机定义,您很可能希望在主机关闭时禁用通知。请记住,您不必像对待群集的整体状态那样在乎任何单个主机的状态。根据您的网络布局和您要完成的任务,您可能希望为主机定义启用针对无法访问状态的通知。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁