- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 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
7.7 Ganglia 监控扩展实现机制
在默认情况下,Ganglia 通过 gmond 守护进程收集 CPU、内存、磁盘、IO、进程、网络 6 大方面的数据,然后汇总到 gmetad 守护进程下,使用 rrdtools 存储数据,最后将历史数据以曲线方式通过 PHP 页面呈现。但是很多时候这些基础数据还不足以满足我们的监控需要,我们还要根据应用的不同,扩展 Ganglia 的监控范围。下面我们就介绍通过开发 Ganglia 插件扩展 Ganglia 监控功能的实现方法。
7.7.1 扩展 Ganglia 监控功能的方法
默认安装完成的 Ganglia 仅向我们提供基础的系统监控信息,通过 Ganglia 插件可以实现两种扩展 Ganglia 监控功能的方法。
1)添加带内(in-band)插件,主要是通过 gmetric 命令来实现。
这是通常使用的一种方法,主要是通过 crontab 方法并调用 Ganglia 的 gmetric 命令来向 gmond 输入数据,进而实现统一监控。这种方法简单,对于少量的监控可以采用,但是对于大规模自定义监控时,监控数据难以统一管理。
2)添加一些其他来源的带外(out-of-band)插件,主要是通过 C 或者 Python 接口来实现。
在 Ganglia3.1.x 版本以后,增加了 C 或 Python 接口,通过这个接口可以自定义数据收集模块,并且可以将这些模块直接插入 gmond 中以监控用户自定义的应用。
7.7.2 通过 gmetric 接口扩展 Ganglia 监控
gmetric 是 Ganglia 的一个命令行工具,它可以将数据直接发送到负责收集数据的 gmond 节点,或者广播给所有 gmond 节点。由此可见,采集数据的不一定全部都是 gmond 这个服务,也可以直接通过应用程序调用 Ganglia 提供的 gmetric 工具将数据直接写入 gmond 中,这就很容易地实现了 ganglia 监控的扩展。因此,我们可以利用 shell、Perl、Python 等语言工具,通过调用 gmetric 将我们想要监控的数据直接写入 gmond 中,简单而快速地实现了 Ganglia 的监控扩展。
在 Ganglia 安装完成后,会在 bin 目录下生成 gmetric 命令。下面通过一个实例介绍一下 gmetric 的使用方法:
[root@cloud1 ~]# /opt/app/ganglia/bin/gmetric\ >-n disk_used -v 40 -t int32 -u '% test' -d 50 -S '8.8.8.8:cloud1'
其中:
- -n,表示要监控的指标名。
- -v,表示写入的监控指标值。
- -t,表示写入监控数据的类型。
- -u,表示监控数据的单位。
- -d,表示监控指标的存活时间。
- -c,用于指定 Ganglia 配置文件的位置。
- -S,表示伪装客户端信息,8.8.8.8 代表伪装的客户端地址,cloud1 代表被监控主机的主机名。
通过不断地执行 gmetric 命令写入数据,Ganglia Web 的监控报表已经形成,如图 7-5 所示。

图 7-5 通过 gmetric 生成的监控报表
从图 7-5 中可以看到刚才执行命令时设置的几个属性值在报表中都呈现出来了,例如 disk_used、“%test”、cloud1 等。同时,通过 gmetric 写入的监控数值,在报表中也很清楚地展示出来。
在上面的实例中,我们通过执行命令的方式不断写入数据,进而生成监控报表。事实上,所有的监控数据都是自动收集的,因此,要实现数据的自动收集,可以将上面的命令写成一个 shell 脚本,然后将脚本文件放入 cron 运行。
假设生成的脚本文件是/opt/ganglia/bin/ganglia.sh,运行“crontab -e”命令,将此脚本每隔 10 分钟运行一次:
*/10 * * * * /opt/ganglia/bin/ganglia.sh
最后,打开 Ganglia Web 进行浏览,即可看到通过 gmetric 命令收集到的数据报表。
7.7.3 通过 Python 插件扩展 Ganglia 监控
要通过 Python 插件扩展 Ganglia 监控,必须满足如下条件:
- Ganglia 3.1.x 以后版本
- Python2.6.6 或更高版本
- Python 开发头文件(通常在 python-devel 这个软件包中)
在安装 Ganglia 客户端(gmond)的时候,需要加上“--with-python”参数,这样在安装完成后,会生成 modpython.so 文件,这个文件是 Ganglia 调用 Python 的动态链接库,要通过 Python 接口开发 Ganglia 插件,必须编译安装此 Python 模块。
这里假定 Ganglia 的安装版本是 ganglia3.4.0,安装目录是/opt/app/ganglia,要编写一个基于 Python 的 Ganglia 插件,需要进行如下操作。
1.修改 modpython.conf 文件(Ganglia 客户端)
在 Ganglia 安装完成后,modpython.conf 文件位于/opt/app/ganglia/etc/conf.d 目录下,此文件内容如下:
modules {
module {
name = "python_module"
# python
主模块名称
path = "modpython.so"
#Ganglia
调用 Python
的动态链接库,这个文件应该在 Ganglia
的安装目录的 lib64/ganglia
下面
params = "/opt/app/ganglia/lib64/ganglia" #
指定我们编写的 Python
脚本放置路径,这个
#
路径要保证是已存在的。否则 gmond
服务无法启动
}
}
include ("/opt/app/ganglia/etc/conf.d/*.pyconf")
# Python
脚本配置文件存放路径
2.重启 gmond 服务
在客户端的所有配置修改完成后,重启 gmod 服务即可完成 Python 接口环境的搭建。
7.7.4 实战:利用 Python 接口监控 Nginx 运行状态
搭建完 Python 接口环境,这只是实现 Ganglia 监控扩展的第一步,接下来还要编写基于 Python 的 Ganglia 监控插件。不过幸运的是,网上有很多已经编写好的各种应用服务的监控插件,我们只需要拿来使用即可。读者可以从 https://github.com/ganglia/gmond_python_modules 下载需要的各种 Ganglia 扩展监控插件,这里要下载的是 nginx_status 这个 Python 插件。下载完成的 nginx_status 插件的目录结构如下:
[root@cloud1nginx_status]# ls conf.d graph.d python_modules README.mkdn
其中,conf.d 目录下存放的是配置文件 nginx_status.pyconf,python_modules 目录下放的是 Python 插件的主程序 nginx_status.py,graph.d 目录下放的是用于绘图的 PHP 程序。这几个文件接下来都会用到。
对 Nginx 的监控,需要借助 with-http_stub_status_module 模块,此模块默认不开启,所以需要指定开启,用于编译 Nginx。关于安装与编译 Nginx,这里不进行介绍。
1.配置 Nginx,开启状态监控
在 Nginx 配置文件 nginx.conf 中添加如下配置:
server {
listen 8000;
#
监听的端口
server_name IP;
#
当前机器的 IP
地址或域名
location /nginx_status {
stub_status on;
access_log off;
# allow xx.xx.xx.xx;#
允许访问的 IP
地址
# deny all;
allow all;
}
}
接着,重启 Nginx,通过 http://IP:8000/nginx_status 即可看到状态监控结果。
2.配置 Ganglia 客户端,收集 nginx_status 数据
根据前面对 modpython.conf 文件的配置,我们将 nginx_status.pyconf 文件放到/opt/app/ganglia/etc/conf.d 目录下,将 nginx_status.py 文件放到/opt/app/ganglia/lib64/ganglia 目录下。
nginx_status.py 文件无需改动,nginx_status.pyconf 文件需要做一些修改,修改后的文件内容如下:
[root@cloud1 conf.d]# morenginx_status.pyconf
modules {
module {
name = 'nginx_status' #
模块名,该文件存放于/opt/app/ganglia/lib64/ganglia
下面
language = 'python' #
声明使用 Python
语言
paramstatus_url {
value = 'http://IP:8000/nginx_status' #
这个就是查看 nginx
状态的 URL
地址,前面
#
有配置说明
}
paramnginx_bin {
value = '/usr/local/nginx/sbin/nginx' #
这里假定 Nginx
安装路径为/usr/local/nginx
}
paramrefresh_rate {
value = '15'
}
}
}
#
下面是需要收集的 metric
列表,一个模块中可以扩展任意个 metric
collection_group {
collect_once = yes
time_threshold = 20
metric {
name = 'nginx_server_version'
title = "Nginx Version"
}
}
collection_group {
collect_every = 10
time_threshold = 20 #
最大发送间隔
metric {
name = "nginx_active_connections" #metric
在模块中的名字
title = "Total Active Connections" #
图形界面上显示的标题
value_threshold = 1.0
}
metric {
name = "nginx_accepts"
title = "Total Connections Accepted"
value_threshold = 1.0
}
metric {
name = "nginx_handled"
title = "Total Connections Handled"
value_threshold = 1.0
}
metric {
name = "nginx_requests"
title = "Total Requests"
value_threshold = 1.0
}
metric {
name = "nginx_reading"
title = "Connections Reading"
value_threshold = 1.0
}
metric {
name = "nginx_writing"
title = "Connections Writing"
value_threshold = 1.0
}
metric {
name = "nginx_waiting"
title = "Connections Waiting"
value_threshold = 1.0
}
}
3.绘图展示的 PHP 文件
在完成数据收集后,还需要将数据以图表的形式展示在 Ganglia Web 界面中,所以还需要前台展示文件,将 graph.d 目录下的两个文件 nginx_accepts_ratio_report.php 和 nginx_scoreboard_report.php 放到 Ganglia Web 的绘图模板目录即可。根据上面的设定,Ganglia Web 的安装目录是/var/www/html/ganglia,因此,将上面这两个 PHP 文件放到/var/www/html/ganglia/graph.d 目录下即可。
4.nginx_status.py 输出效果图
完成前面所有步骤后,重启 Ganglia 客户端 gmond 服务,在客户端通过“gmond -m”命令可以查看支持的模板,最后就可以在 Ganglia Web 界面查看 Nginx 的运行状态,如图 7-6 所示。

图 7-6 通过 Python 插件实现 Ganglia 监控 Nginx
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论