zz1999

导航

 

Ganglia监控扩展实现机制

默认安装完成的Ganglia仅向我们提供基础的系统监控信息,通过Ganglia插件可以实现两种扩展Ganglia监控功能的方法。
1、添加带内(in-band)插件,主要是通过gmetric命令来实现。
这是通常使用的一种方法,主要是通过crontab方法并调用Ganglia的gmetric命令来向gmond输入数据,进而实现统一监控。
这种方法简单,对于少量的监控可以采用,但是对于大规模自定义监控时,监控数据难以统一管理。

2、添加一些其他来源的带外(out-of-band)插件,主要是通过C或者Python接口来实现,通过gmetric接口扩展Ganglia监控。
在Ganglia3.1.x版本以后,增加了C或Python接口,通过这个接口可以自定义数据收集模块,并且可以将这些模块直接插入到gmond中以监控用户自定义的应用。

gmetric是Ganglia的一个命令行工具,它可以将数据直接发送到负责收集数据的gmond节点,或者广播给所有gmond节点。由此可见,采集数据的不一定全部都是gmond这个服务,
也可以直接通过应用程序调用Ganglia 提供的gmetric工具将数据直接写入gmond中,这就很容易的实现了ganglia监控的扩展。
因此,我们可以通过shell、perl、python等语言工具,通过调用gmetric将我们想要监控的数据直接写入gmond中,简单而快速的实现了Ganglia的监控扩展。

 

通过Python插件扩展Ganglia监控



一 要通过Python插件扩展Ganglia监控,必须满足如下条件:
1 Ganglia 3.1.x以后版本,
2 Python2.6.6或更高版本,
3 Python开发头文件(通常在python-devel这个软件包中)
4 在安装Ganglia客户端(gmond)的时候,需要加上“--with-python”参数
这样在安装完成后,会生成modpython.so文件,这个文件是Ganglia调用Python的动态链接库,要通过Python接口开发Ganglia插件,必须要编译安装此Python模块。

操作步骤:
ganglia的安装版本是ganglia3.7.2,安装目录是/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服务,搭建完Python接口环境

3 搭建完Python接口环境,只是实现Ganglia监控扩展的第一步,接下来还要编写基于Python的Ganglia监控插件。
网上有很多已经编写好的各种应用服务的监控插件,我们只需要拿来使用即可 ,https://github.com/ganglia/gmond_python_modules 下载各种需要的Ganglia扩展监控插件
gmond_python_modules 文件目录介绍,例如:nginx_stauts的目录结构
conf.d目录下放的是配置文件nginx_status.pyconf,
python_modules目录下放的是Python插件的主程序nginx_status.py,
graph.d目录下放的是用于绘图的php程序

示例:ganglia配置nginx_status python接口插件

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

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文件需要做一些修改,修改后的文件内容如下:
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'
}
}
}

....# 其他部分不需要修改

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,完成上面的所有步骤后,重启Ganglia客户端gmond服务,在客户端通过“gmond–m”命令可以查看支持的模板,最后就可以在Ganglia web界面查看Nginx的运行状态。

 

Ganglia在实际应用中要考虑的问题

1、 网络IO可能存在瓶颈

在Ganglia分布式监控系统中,运行在被监控节点上的gmond进程消耗的网络资源是非常小的,通常在1~2MB之间,而gmond将收集到的数据仅保存在内存中,因此gmond消耗的网络资源基本可以忽略不记。但有一种情况,就是在采用单播模式下,所有gmond进程都会向一个gmond中央节点发送数据,而这个gmond中央节点可能存在网络开销,如果单播传输的节点过多,那么在中央节点上就会存在网络IO瓶颈。

另外,gmetad管理节点会收集所有gmond节点上的监控数据,同时Ganglia-Web也运行在gmetad所在的节点上,因此,gmetad所在节点的网络IO也会很大,可能存在网络IO瓶颈。

2、 CPU可能存在瓶颈

对于gmetad管理节点,它将收集所有gmond节点收集到的UDP数据包,如果一个节点每秒发送10个数据包,300个节点每秒将会发送3000个,假如每个数据包300字节,那么每秒就有近1MB的数据,这么多数据包需要的CPU处理能力也会增加。

gmetad在默认情况下每15秒到gmond取一次数据,同时gmetad请求完数据后还要汇总到xml文件,还需要对xml文件进行解析,如果监控的节点较多,比如1000个节点,那么收集到的xml文件可能有10~20MB左右。如果按照默认情况每隔15秒去解析一个20MB左右的xml文件,那么CPU将面临很大压力,而gmetad还要将数据写入rrd数据库,同时还要处理来自Web客户端的解析请求进而读rrd数据库,这些都会加重CPU的负载,因此在监控的节点比较多时,gmetad节点应该选取性能比较好的服务器,特别是CPU性能。

3、gmetad rrd数据写入可能存在瓶颈

gmetad进程在收集完成客户端的监控数据后,会通过rrdtool工具将数据写入到rrd数据库的存储目录。由于rrd拥有独特的存储方式,它将每个metric作为一个文件来存储,并且如果配置了数据采集的频率,gmetad还会为每个采集频率保存一个单独的文件,这就意味着,gmetad将metric值保存到rrd数据库的操作将是针对大量小文件的IO操作。假设集群有500个节点,每个节点有50个metric,那么gmetad将会存储25000个metric,如果这些metric都是每一秒更新一次,这将意味着每秒有25000个随机写入操作,而对于这种写入操作,一般的硬盘是无法支撑的。

4、ganglia使用过程中可能出现的问题

1、访问http://ip/ganglia/, 如果报下面的错误:

 

这是因为,没有修改默认的ganglia web配置文件conf_default.php里面“$conf['gweb_confdir']”的值,这个变量是指定ganglia web程序的安装目录,默认是“/var/lib/ganglia-web”,如果你不是放在这个目录下,那么就要修改这个值,这里我是将ganglia web程序放到了/var/www/html目录下了,所以要修改“$conf['gweb_confdir']”的值为“/var/www/html/ganglia”即可。

修改完成后,重新访问http://ip/ganglia/, 可能还会出现如下错误:

 

这个是因为没有写权限导致的,根据提示,首先创建这两个目录,然后做授权即可,操作如下:
[root@localhost ~]# mkdir -p /var/www/html/ganglia/dwoo/{compiled,cache}
[root@localhost ~]# chown -R apache:apache /var/www/html/ganglia/dwoo/{compiled,cache}
注意,这里将compiled和cache目录授权给了apache用户,这个用户是启动httpd服务的用户,如果是lamp架构,那么就看启动apache的是哪个用户,如果是lnmp架构,那么就看启动php-fpm的是哪个用户。

2、故障现象:

There was an error collecting ganglia data (127.0.0.1:8652): fsockopen error: Connection refused

查看message日志:

 localhost /usr/sbin/gmetad[14747]: RRD_create: creating '/var/lib/ganglia/rrds/__SummaryInfo__/diskstat_vda_writes.rrd': Permission denied
 localhost /usr/sbin/gmetad[14747]: Unable to write meta data for metric diskstat_vda_writes to RRD

根据日志提示,这是没有权限写rrds元数据导致的问题,默认配置rrds数据的路径在配置文件conf_default.php里面的如下变量中:

$conf['gmetad_root'] = "/var/lib/ganglia";
$conf['rrds'] = "${conf['gmetad_root']}/rrds";

这是默认的路径,当然也可以指定自定义路径,不管指定什么路径,都要保证此路径有gmond进程的写权限,而gmond进程的启动用户在gmond.conf里面进行配置,默认是nobody用户,因此解决办法如下:

[root@localhost ~]# systemctl  status gmetad
gmetad.service - Ganglia Meta Daemon
   Loaded: loaded (/usr/lib/systemd/system/gmetad.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@localhost ~]# chown -R nobody:nobody /var/lib/ganglia/rrds
[root@localhost ~]# systemctl  start  gmetad

3、故障现象:

gmond服务启动后,节点也会出现对应图形,但是主机图里面没有曲线数值,图的下方提示:No matching metrics detected

 

针对这个问题,可能的原因有三个:

(1)、安装步骤是否正确,是否缺少相关的目录
(2)、查看message日志,是否目录权限错误,尤其是/var/lib/ganglia/rrds/是否有权限。
(3)、被监控的节点是不是开了防火墙、selinux之类的操作。

本例是因为entos7的firewalld没有关闭,下面是关闭防火墙服务后的效果图:

 

好吧,ganglia扩展监控就介绍到这里了,后面还有介绍ganglia与centreon的整合,实现更强大的分布式监控系统。

 

posted on 2019-02-27 11:34  zz1999  阅读(346)  评论(1编辑  收藏  举报