- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 1 章 Linux 服务器安全运维
- 第 2 章 Linux 网络安全运维
- 第 3 章 数据安全工具 DRBD、extundelete
- 第二部分 运维故障排查篇
- 第 4 章 Linux 系统运维故障排查思路
- 第 5 章 Linux 故障排查案例实战
- 第三部分 自动化运维篇
- 第 6 章 轻量级运维利器 pssh、pdsh 和 mussh
- 第 7 章 分布式监控系统 Ganglia
- 第 8 章 基于 nagios 的分布式监控报警平台 Centreon
- 第 9 章 通过 Ganglia 与 Centreon 构建智能化监控报警平台
- 第四部分 集群架构篇
- 第 10 章 高性能 Web 服务器 Nginx
- 第 11 章 高性能集群软件 Keepalived
- 第 12 章 千万级高并发负载均衡软件 HAProxy
- 第 13 章 构建高性能的 MySQL 集群系统
- 第 14 章 高性能负载均衡集群软件 HAProxy
9.4 Ganglia 与 Centreon 的无缝整合
通过前面的介绍,确定了以 Ganglia 作为数据收集模块,Centreon 作为监控报警模块的方案,这样,一个智能监控报警平台两大主要功能模块已经基本实现了。但现在的问题是,如何将收集到的数据传送给监控报警模块呢?这就是数据提取模块要完成的功能。
数据提取模块要完成的功能是:从数据收集模块中定时采集指定的数据,然后将采集到的数据与指定的报警阈值进行比较,如果发现采集到的数据大于或小于指定的报警阈值,那么就通过监控报警模块设置的报警方式进行故障通知。在这个过程中,只有采集数据在数据收集模块中完成,其他操作,例如:采集数据时间间隔、报警阈值设置、报警方式设置、报警联系人设置等都在监控报警模块中完成。
从数据提取模块完成的功能可以看出,此模块主要用来衔接数据收集模块和监控报警模块,进而实现 Ganglia 和 Centreon 的无缝整合。要实现数据提取模块的功能,方法有很多,最简单、最直接的方法就是编写监控脚本,这里提供几个常用的数据提取脚本,然后将脚本添加到 Centreon 中,下面介绍具体的操作过程。
9.4.1 数据提取脚本
这里提供两个数据提取脚本,一个是基于 Python 编写的,一个是基于 PHP 编写的,下面分别进行介绍。
(1)基于 Python 编写的脚本
这个脚本的原理是通过 Ganglia 提供的数据汇总端口来获取数据,然后将获取到的数据与指定的阈值进行对比,以判断服务是否异常。脚本内容如下:
#!/usr/bin/env python import sys import getopt import socket import xml.parsers.expat class GParser: def __init__(self, host, metric): self.inhost =0 self.inmetric = 0 self.value = None self.host = host self.metric = metric def parse(self, file): p = xml.parsers.expat.ParserCreate() p.StartElementHandler = parser.start_element p.EndElementHandler = parser.end_element p.ParseFile(file) if self.value == None: raise Exception('Host/value not found') return float(self.value) def start_element(self, name, attrs): if name == "HOST": if attrs["NAME"]==self.host: self.inhost=1 elif self.inhost==1 and name == "METRIC" and attrs["NAME"]==self.metric: self.value=attrs["VAL"] def end_element(self, name): if name == "HOST" and self.inhost==1: self.inhost=0 def usage(): print """Usage: check_ganglia_metric \ -h|--host= -m|--metric= -w|--warning= \ -c|--critical= """ sys.exit(3) if __name__ == "__main__": ################################################################################ ganglia_host = '127.0.0.1' ganglia_port = 8651 host = None metric = None warning = None critical = None try: options, args = getopt.getopt(sys.argv[1:], "h:m:w:c:s:p:", ["host=", "metric=", "warning=", "critical=", "server=", "port="], ) except getopt.GetoptError, err: print "check_gmond:", str(err) usage() sys.exit(3) for o, a in options: if o in ("-h", "--host"): host = a elif o in ("-m", "--metric"): metric = a elif o in ("-w", "--warning"): warning = float(a) elif o in ("-c", "--critical"): critical = float(a) elif o in ("-p", "--port"): ganglia_port = int(a) elif o in ("-s", "--server"): ganglia_host = a if critical == None or warning == None or metric == None or host == None: usage() sys.exit(3) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ganglia_host,ganglia_port)) parser = GParser(host, metric) value = parser.parse(s.makefile("r")) s.close() except Exception, err: print "CHECKGANGLIA UNKNOWN: Error while getting value \"%s\"" % (err) sys.exit(3) if critical > warning: if value >= critical: print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) sys.exit(2) elif value >= warning: print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) sys.exit(1) else: print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) sys.exit(0) else: if critical >= value: print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) sys.exit(2) elif warning >= value: print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) sys.exit(1) else: print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) sys.exit(0)
在这个脚本中,需要修改的地方有两个,分别是 ganglia_host 和 ganglia_port。ganglia_host 表示 gmetad 服务所在服务器的 IP 地址,Ganglia 可以和 Centreon 安装到一起,也可以分开部署,当 Ganglia 和 Centreon 安装在一起时,这个值就是“127.0.0.1”。ganglia_port 表示 gmetad 收集数据汇总的交互端口,默认是 8651。
将此脚本命名为 check_ganglia_metric.py,然后放到 Centreon 存放 nagios 插件的目录下,默认为/usr/lib64/nagios/plugins,并授予可执行权限。接着介绍此脚本的用法。
在命令行直接执行 check_ganglia_metric.py 脚本,即可获得使用帮助:
[root@centreonserver plugins]# python check_ganglia_metric.py Usage: check_ganglia_metric -h|--host= -m|--metric= -w|--warning= -c|--critical=
下面分别介绍其中各个参数的意义。
- -h:表示从哪台主机上提取数据,后跟主机名或 IP 地址。这里需要注意的是,Ganglia 默认将收集的数据存放在 gmetad 配置文件中“rrd_rootdir”参数指定的目录下,如果被监控的主机没有主机名或主机名没有进行 DNS 解析,那么 Ganglia 就会用此主机的 IP 地址作为目录名来存储收集的数据,反之,就会以主机名作为存储数据的目录名称。因此,这里的“-h”参数就要以 Ganglia 存储 rrd 数据的目录名称为准。下面是 Ganglia 收集到的 rrd 数据的存储结构:
[root@centreonserver bestjob]# pwd /data/rrdsdata/rrds/bestjob [root@centreonserver bestjob]# ls 192.168.11.188 host0080.bestjob.com host0078.bestjob.com 192.168.16.10 host0022.bestjob.com host0065.bestjob.com [root@centreonserver bestjob]# cd 192.168.11.188 [root@centreonserver 192.168.11.188]# ls cpu_num.rrd cpu_system.rrd disk_free.rrd load_five.rrd mem_cached.rrd mem_total.rrd cpu_speed.rrd cpu_user.rrd disk_total.rrd load_one.rrd mem_free.rrd part_max_used.rrd
- -m:表示要收集的指标值,例如 cpu_num、disk_free、cpu_user、disk_total、load_one、part_max_used 等,这些指标值可以在 Ganglia 存储 rrd 数据的目录中找到,也可以在 Ganglia 的 Web 界面中查找到。
- -w:表示警告的阈值,当此脚本收集的指标值低于或者高于指定的警告阈值时,此脚本就会发出报警通知,同时此脚本返回状态值 1。
- -c:表示故障阈值,当此脚本收集到的指标值低于或者高于指定的故障阈值时,此脚本就会发出故障通知,同时此脚本返回状态值 2。
下面演示一下此脚本的用法,这里以检测 host0080.bestjob.com 主机的磁盘剩余空间为例,其他指标值以此类推:
[root@centreonserver plugins]# ./check_ganglia_metric.py \ > -h host0080.bestjob.com -m disk_free -w 1000 -c 500 CHECKGANGLIA OK: disk_free is 3045.75 [root@centreonserver plugins]# echo $? 0 [root@centreonserver plugins]# ./check_ganglia_metric.py \ > -h host0080.bestjob.com -m disk_free -w 3045 -c 3000 CHECKGANGLIA WARNING: disk_free is 3043.68 [root@centreonserver nagios]# echo $? 1 [root@centreonserver plugins]# ./check_ganglia_metric.py \ > -h host0080.bestjob.com -m disk_free -w 3050 -c 3045 CHECKGANGLIA CRITICAL: disk_free is 3044.55 [root@centreonserver plugins]# echo $? 2 [root@centreonserver plugins]# ./check_ganglia_metric.py \ > -h host0080.bestjob.com -m part_max_used -w 90 -c 95 CHECKGANGLIA OK: part_max_used is 81.70
前三个例子主要用来检测磁盘的剩余空间。在检测磁盘剩余空间时使用的是“disk_free”这个指标,这个“disk_free”是 host0080.bestjob.com 主机所有磁盘剩余空间的总和,指标单位为 GB。脚本的执行过程为:如果剩余磁盘空间正常,将输出 OK 字样,同时输出剩余磁盘空间量,并返回状态值 0;如果检测磁盘处于 WARNING 状态,将返回状态值 1;如果检测磁盘处于 CRITICAL 状态,将返回状态值 2。这其实就是 nagios 下状态检测脚本的基本写法,nagios 就是通过脚本的返回状态值来判断服务处于何种状态。
接着看最后一个例子,这个例子用到了“part_max_used”这个指标。这个指标表示磁盘分区的最大使用率,单位是百分比,它用来输出系统中磁盘分区使用率的最大值。这个指标非常有用,经常用来判断系统中某个磁盘分区是否已满。在这个例子中,指定 WARNING 状态的阈值是 90%,CRITICAL 状态的阈值是 95%,也就是当系统磁盘最大使用率达到 95%时将发出 CRITICAL 报警。
最后,登录 Ganglia 的 Web 界面,查看 host0080.bestjob.com 主机的“disk_free”和“part_max_used”状态图,检查一下通过 Python 脚本输出的值是否和 Ganglia 生成的状态图一致,如图 9-3 所示。
从图 9-3 可以看出,通过 Python 提取到的数值和 Ganglia 生成的状态图基本一致,如果要查看更详细的统计,可以单击上图进入详细统计页面。在这个详细页面中,可以查看每小时、每天、每周的磁盘状态统计图。另外,通过图 9-3 还可以发现,统计的指标值“disk_free”和“part_max_used”就在状态图的左上角,并配有指标含义解释。
图 9-3 Ganglia 生成的磁盘状态图
(2)基于 PHP 编写的脚本
这个脚本的原理是通过调用 Ganglia 的 Ganglia Web 页面来获取信息,因此它的功能十分强大,几乎可以获取 Ganglia 收集的任何数据。脚本内容如下:
#!/usr/bin/php <?php ################################################################################ $GANGLIA_WEB="/var/www/html/ganglia"; ################################################################################ define("CACHEDATA", 1); define("CACHEFILE", "/tmp/nagios/ganglia_metrics"); define("CACHETIME", 45); // How long to cache the data in seconds if ( $argc !=5 ) { echo( "Usage: $argv[0] <hostname> <metric> <less|more|equal|notequal> <critical_value> ie. $argv[0] server1 disk_free less 10 less, more and equal specify whether we mark metric critical if it is less, more or equal than critical value Exiting ....\n"); exit(3); } # To turn on debug set to 1 $debug = 0; $host = $argv[1]; $metric_name = $argv[2]; $operator = $argv[3]; $critical_value = $argv[4]; global $metrics; if(CACHEDATA == 1 && file_exists(CACHEFILE)){ // check for the cached file // snag it and return it if it is still fresh $time_diff = time() - filemtime(CACHEFILE); $expires_in = CACHETIME - $time_diff; if( $time_diff < CACHETIME){ if ( $debug == 1 ) { echo("DEBUG: Fetching data from cache. Expires in " . $expires_in . " seconds.\n"); } $metrics = unserialize(file_get_contents(CACHEFILE)); } } if ( ! is_array( $metrics ) ) { if ( $debug == 1 ) { echo("DEBUG: Querying GMond for new data\n"); } include_once "$GANGLIA_WEB/conf.php"; # Set up for cluster summary $context = "cluster"; include_once "$GANGLIA_WEB/functions.php"; include_once "$GANGLIA_WEB/ganglia.php"; include_once "$GANGLIA_WEB/get_ganglia.php"; # Put the serialized metrics into a file file_put_contents(CACHEFILE, serialize($metrics)); } # Get a list of all hosts $ganglia_hosts_array = array_keys($metrics); $host_found = 0; # Find a FQDN of a supplied server name. for ( $i = 0 ; $i < sizeof($ganglia_hosts_array) ; $i++ ) { if ( strpos( $ganglia_hosts_array[$i], $host ) !== false ) { $fqdn = $ganglia_hosts_array[$i]; $host_found = 1; break; } } # Host has been found in the Ganglia tree if ( $host_found == 1 ) { # Check for the existence of a metric if ( isset($metrics[$fqdn][$metric_name]['VAL']) ) { $metric_value = $metrics[$fqdn][$metric_name]['VAL']; } else { echo($metric_name . " UNKNOWN - Invalid metric request for this host. Please check metric exists."); exit(3); } $ganglia_units = $metrics[$fqdn][$metric_name]['UNITS']; if ( ($operator == "less" && $metric_value > $critical_value) || ( $operator == "more" && $metric_value < $critical_value ) || ( $operator == "equal" && trim($metric_value) != trim($critical_value) ) || ( $operator == "notequal" && trim($metric_value) == trim($critical_value) ) ) { print $metric_name . " OK - Value = " . $metric_value . " " . $ganglia_units; exit (0); } else { print $metric_name . " CRITICAL - Value = ". $metric_value . " " . $ganglia_units; exit (2); } } else { echo($metric_name . " UNKNOWN - Hostname info not available. Likely invalid hostname"); exit(3); } ?>
在这个脚本中,需要修改的是“$GANGLIA_WEB”变量的值,此变量用来指定 Ganglia Web 的程序路径,这里是/var/www/html/ganglia,可根据环境进行修改。另外,此脚本调用了 Ganglia Web 程序中的 functions.php、ganglia.php、get_ganglia.php、conf.php 四个 PHP 文件,要确保这四个文件的路径正确。
将此脚本命名为 check_ganglia_metric.php,然后放到 Centreon 中存放 nagios 插件的目录下,默认为/usr/lib64/nagios/plugins,并授予可执行权限。接下来介绍此脚本的用法。
在命令行直接执行 check_ganglia_metric.php 脚本,即可获得使用帮助:
[root@centreonserver plugins]# ./check_ganglia_metric.php Usage: check_ganglia_metric.php <hostname> <metric> <less|more|equal|notequal> <critical_value>
下面分别介绍其中各个参数的含义。
- hostname:表示从哪台主机上提取数据,与 check_ganglia_metric.py 脚本的“-h”参数含义相同,这里不再解释。
- metric:表示要收集的指标值,与 check_ganglia_metric.py 脚本的“-m”参数含义相同,也不再说明。
- less|more|equal|notequal:表示判断的标准,分别表示小于、大于、等于、不等于,是与指定阈值对比的一个条件。
- critical_value:表示故障阈值,当满足指定的阈值条件时,将进行 CRITICAL 状态的报警。
下面演示一下此脚本的用法,这里以检测 host0080.bestjob.com 主机的磁盘、内存信息为例,操作过程如下:
[root@centreonserver plugins]# ./check_ganglia_metric.php \ > host0080.bestjob.com disk_free less 10 disk_free OK - Value = 2610.908 GB [root@centreonserver plugins]# ./check_ganglia_metric.php \ > host0080.bestjob.com part_max_used more 95 part_max_used OK - Value = 84.6 % [root@centreonserver plugins]# ./check_ganglia_metric.php \ > host0080.bestjob.com mem_free less 100000 mem_free OK - Value = 668912 KB
首先看第一个例子,利用 disk_free 这个指标检测主机 host0080.bestjob.com 主机剩余的磁盘空间,其中的告警阈值为 10,单位是 GB,表示磁盘剩余空间低于 10GB 时将发出报警通知。从输出结果发现此主机的磁盘剩余空间还有 2610.908GB,因此检测结果为 OK 状态。从这个例子可以看出,这个 PHP 脚本在输出结果的同时还输出了结果对应的单位,这个功能非常有用。
其次看第二个例子,通过 part_max_used 这个指标检测主机 host0080.bestjob.com 磁盘分区的最大使用率,其中告警阈值 95 是个百分比,意思是当磁盘占用率超过 95%时将发出报警。而通过检测结果发现此主机最大磁盘占用率为 84.6%,因此,检测结果为 OK 状态。
最后看第三个例子,通过 mem_free 指标检测 host0080.bestjob.com 空闲的物理内存量,从输出结果可知,此主机剩余内存高于指定的告警阈值。
9.4.2 实现 Ganglia 与 Centreon 完美整合
上面介绍了两个常用的数据抽取脚本及其用法,这两个脚本各有优缺点,在实际应用中可以配合使用。要实现对主机的监控报警,最简单的方法是将上面例子中的操作命令写到一个脚本中,然后将这个脚本放到系统守护进程中,定期执行脚本检测即可,但是这种方法不够灵活,无法设定详细的联系人和联系人组,并且维护也不方便。
由于 Centreon 底层调用的是 nagios,因此将这些脚本作为 nagios 的插件,即可实现灵活的报警设置和便捷的管理。接下来以 check_ganglia_metric.php 脚本为例,演示如何将此脚本集成到 Centreon 平台中,将其他脚本集成到 Centreon 的方法与此完全相同。
Ganglia 和 Centreon 可以分开独立部署在两台服务器上,也可以部署在一台服务器上,这里设定 Ganglia 和 Centreon 部署在一台服务器上。结合前面介绍的 Centreon 知识,在监控服务器的 Centreon Web 界面,选择“Configuration→Commands→Checks”,然后单击“Add”新建一个 Command,如图 9-4 所示。
图 9-4 创建一个名为 check_ganglia_php 的 Command
在图 9-4 中,创建了一个名为 check_ganglia_php 的 Command,选择“Command Type”为“Check”。接着重点看“Command Line”的内容,其中,“$USER1$”就是 Centreon 服务器上 nagios 监控插件的路径,默认是“/usr/lib64/nagios/plugins”,前面已经把这个监控脚本放到了此路径下,这里直接引用即可。在这个脚本对应的参数中定义了三个参数变量“$ARG1$”、“$ARG2$”和“$ARG3$”,分别用于指定 Ganglia metric、警告条件和 CRITICAL 阈值。这里建议将每个参数变量的作用都在“Argument Descriptions”选项中做个描述,以保证在添加服务时不容易出错。
这样,就将 check_ganglia_metric.php 脚本作为一个命令集成到 Centreon 中了。接下来演示如何通过这个脚本检测一批主机的磁盘空间最大占用率。首先在 Centreon Web 界面选择“Configuration→Services→Services by host group”,单击“Add”添加一个主机组服务,如图 9-5 所示。
图 9-5 添加一个名为 check_disk_group 的主机组服务
这里先看一下“Service Configuration”标签中的几个选项:“Description”就是监控服务的名称,这里定义为“check_disk_group”;“Service Template”是指定服务的模板,这里仍然选择“generic-service”;“Check Command”选项用来指定服务检查的命令,从下拉菜单中选择刚才创建的命令“check_ganglia_php”即可;最后一个选项“Args”就是刚才创建 check_ganglia_php 命令时指定的三个变量,根据每个变量的含义,依次填写 Ganglia metric、警告条件和 CRITICAL 阈值。
接下来看报警通知的设置,如图 9-6 所示。
在图 9-6 中,“Notification Enabled”选项表示是否启用报警通知,这里选择“Yes”。“Implied Contacts”选项表示指定报警联系人,如果某些服务仅需要通知很少的人员,可以在这里指定对应的报警联系人。如果报警联系人很多,一个一个添加就显得非常麻烦,后续的增加、删除报警联系人都非常繁琐,此时可以使用“Implied Contact Groups”选项,将不同类型的联系人分组,然后指定需要接收报警信息的联系人组即可,这样整个联系人组下的所有人员都能收到报警邮件了。
图 9-6 check_disk_group 服务中报警通知的设置
此外,“Notification Interval”选项用来设置发送报警通知的时间间隔,这个值应该大于或等于图 9-5 中为“Normal Check Interval”选择的值。“Notification Period”表示报警周期,建议选择 7×24 的生成环境。“Notification Type”表示发送什么类型的报警通知,经常选择的有 Warning、Critical、Recovery 等,可以根据具体环境来选择。最后一个选项“First notification delay”表示发生故障后推迟多久发送报警通知,如果输入 0,那么表示故障发生后立刻发送报警通知,可根据情况进行设置。
下面继续看“Relations”标签,如图 9-7 所示。
图 9-7 指定需要监控的主机组
如果需要监控很多主机的同一个服务时,向主机一个一个添加服务就变得十分烦琐,此时通过添加主机组的方式,一次性完成主机组下所有主机的监控,简单而灵活。
“Relations”标签可以用来指定要监控的主机组,在图 9-7 左边的主机组列表中选择要监控的主机组即可,这里选择 bestjob.com 主机组。在完成所有设置后,单击“Save”保存退出,check_disk_group 服务添加完成。
至此,已经完成 check_ganglia_metric.php 脚本和 Centreon 的集成,其实也就是 Ganglia 和 Centreon 的集成,而这个脚本就是两者集成的桥梁而已。
在完成所有配置后,需要重启 Centreon 服务,这样所有的配置和修改才能生效。在重启 Centreon 服务后,查看 check_disk_group 服务的运行状态,如图 9-8 所示。
从图 9-8 中可以看出,bestjob.com 主机组中包含了四台主机,每台主机的磁盘最大占用率都处于正常状态,并且输出了目前磁盘最大占用率的比值。由此可知,check_ganglia_metric.php 脚本集成到 Centreon 后工作正常,完美实现了从 Ganglia 采集数据,在 Centreon 中设置报警规则的监控、报警一体化过程。
图 9-8 check_disk_group 服务运行状态
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论