分布式监控数据采集系统Ganglia实战

1、什么是Ganglia

对于这个工具,你们可能比较陌生,可是它功能很是强大,若是咱们想收集全部服务器、网络设备的数据,那么ganglia绝对是首选,在深刻学习以前,仍是先从基础概念了解起吧!php

Ganglia是一款为HPC(高性能计算)集群而设计的可扩展的分布式监控系统,它能够监视和显示集群中的节点的各类状态信息,它由运行在各个节点上的gmond守护进程来采集CPU 、内存、硬盘利用率、I/O负载、网络流量状况等方面的数据,而后汇总到gmetad守护进程下,使用rrdtool存储数据,最后将历史数据以曲线方式经过PHP页面呈现。css

Ganglia的特色以下:html

 良好的扩展性,分层架构设计可以适应大规模服务器集群的须要
 负载开销低,支持高并发
 普遍支持各类操做系统(UNIX等)和cpu架构,支持虚拟机node

2、Ganglia的组成

Ganglia监控系统有三部分组成,分别是gmond、gmetad、webfrontend,做用以下。python

 gmond: 即为ganglia monitoring daemon,是一个守护进程,运行在每个须要监测的节点上,用于收集本节点的信息并发送到其余节点,同时也接收其余节点发过了的数据,默认的监听端口为8649。
 gmetad: 即为ganglia meta daemon,是一个守护进程,运行在一个数据汇聚节点上,按期检查每一个监测节点的gmond进程并从那里获取数据,而后将数据指标存储在本地RRD存储引擎中。
 webfrontend: 是一个基于web的图形化监控界面,须要和Gmetad安装在同一个节点上,它从gmetad取数据,而且读取RRD数据库,经过rrdtool生成图表,用于前台展现,界面美观、丰富,功能强大。nginx

下图是一个简单的Ganglia监控系统结构图。web

从图中能够看出,一个Ganglia监控系统是由多个gmond进程和一个主gmetad进程组成,全部gmond进程将收集到的监控数据汇总到gmetad管理端,而gmetad将数据存储到RRD数据库中,最后经过PHP程序在Web界面进行展现。shell

这是最简单的Ganglia运行结构图,在复杂的网络环境下,还有更复杂的Gnaglia监控架构。下图是Ganglia的另外一种分布式监控架构图。数据库

从这个图中能够看出,gmond能够等待gmetad将监控数据收集走,也能够将监控数据交给其它gmond,进而让其余gmond将数据最终交付给gmetad,同时,gmetad也能够收集其余gmetad的数据.好比,对于上图中的Cluster1和Cluster2集群,Cluster2就是一个gmetad,它将自身收集到的数据又一次的传输给了Cluster1集群;而Cluster1将全部集群的数据进行汇总,而后经过Web进行统一展示。apache

3、Ganglia的工做原理

在介绍Ganglia的工做原理以前,须要介绍一下在Ganglia中常常用到的几个名词,这些是了解Ganglia分布式构架的基础。在Ganglia分布式结构中,常常提到的几个名词有node、cluster和grid,这三部分构成了Ganglia分布式监控系统。

 node: Ganglia监控系统中的最小单位,即被监控的单台服务器。
 cluster:表示一个服务器集群,由多台服务器组成,是具备相同监控属性的一组服务器的集合。
 grid: 表示一个网格。grid由多个服务器集群组成,即多个cluster组成一个grid。
从上面介绍能够看出这三者之间的关系:
 一个grid对应一个gmetad,在gmetad配置文件中能够指定多个cluster。
 一个node对应一个gmond,gmond负责采集其所在机器的数据,同时gmond还能够接收来自其余gmond的数据,而gmetad定时去每一个node上收集监控数据。

一、Ganglia数据流向分析

在Ganglia分布式监控系统中,gmond和gmetad之间是如何传输数据呢?接下来介绍一下Ganglia是如何实现数据的传输和收集的。下图是Ganglia的数据流向图,也是Ganglia的内部工做原理。

下面简述下Ganglia基本运做流程。

1) gmond收集本机的监控数据,发送到其余机器上,并收集其余机器的监控数据,gmond之间经过udp通讯,传递文件格式为XDL。
2) gmond节点间的数据传输方式支持单播点对点传送外,还支持多播传送。
3) gmetad周期性的到gmond节点或gmetad节点上获取(poll)数据,gmetad只有tcp通道,所以gmond与gmetad之间的数据都以XML格式传输。
4) gmetad既能够从gmond也能够从其余的gmetad获得XML数据。
5) gmetad将获取到的数据更新到rrds数据库中。
6) 经过web监控界面,从gmetad取数据,而且读取rrds数据库,生成图片显示出来。

二、Ganglia工做模式

Ganglia的收集数据工做能够在单播(unicast)或多播(multicast)模式下进行,默认为多播模式。

单播:每一个被监控节点发送本身收集到的本机数据到指定的一台或几台机器上。单播模式能够跨越不一样的网段。若是是多个网段的网络环境,就能够采用单播模式采集数据。

多播:每一个被监控节点发送本身收集到的本机数据到同一网段内全部的机器上,同时也接收同一网段内的全部机器发送过来的监控数据。由于是以广播包的形式发送,所以这种模式须要全部主机在同一网段内。但在同一网段内,又能够定义不一样的发送通道。

4、Ganglia的安装

在介绍安装以前,首先说明一下安装环境,这里采用CentOS7.5的Linux发行版本,其余版本的安装过程基本相同。

Ganglia的安装很简单,能够经过源码包和yum源两种方式进行安装。yum源方式安装方便,能够自动安装依赖关系,可是版本每每不是最新的,而经过源码方式,能够安装最新版的Ganglia。下面具体介绍一下这两种安装方式。

4.一、yum源安装方式

CentOS系统中默认的yum源并无包含Ganglia,因此咱们必须安装扩展的yum源。从下面这个地址下载Linux附加软件包(EPEL),而后安装扩展yum源:

[root@node1 ~]#wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm [root@node1 ~]# rpm -ivh epel-release-latest-7.noarch.rpm

完成yum源安装,就能够直接经过yum方式安装Ganglia了。

Ganglia的安装分为两个部分,分别是gmetad和gmond,gmetad安装在监控管理端,gmond安装在须要监控的客户端主机,对应的yum包名称分别为ganglia-gmetad和ganglia-gmond。

下面介绍经过yum方式安装Ganglia的过程。

如下操做是在监控管理端进行的,首先经过yum命令查看下可用的Ganglia安装信息:

[root@monitor ~]#yum list ganglia* 可安装的软件包 ganglia.x86_64 3.7.2-2.el7 epel ganglia-devel.x86_64 3.7.2-2.el7 epel ganglia-gmetad.x86_64 3.7.2-2.el7 epel ganglia-gmond.x86_64 3.7.2-2.el7 epel ganglia-gmond.x86_64 3.7.2-2.el7 epel ganglia-gmond-python.x86_64 3.7.2-2.el7 epel ganglia-web.x86_64 3.7.1-2.el7 epel

从输出可知,经过yum安装的Ganglia版本为ganglia-3.7.2,。接着开始安装ganglia-gmetad:

[root@monitor ~]# yum -y install ganglia-gmetad.x86_64

安装gmetad须要rrdtool的支持,而经过yum方式,会自动查找gmetad依赖的安装包,自动完成安装,这也是yum方式安装的优点。

最后在须要监控的全部客户端主机上安装gmond服务:

[root@node1 ~]# yum -y install ganglia-gmond.x86_64

这样,Ganglia监控系统就安装完成了。经过yum方式安装的Ganglia默认配置文件位于/etc/ganglia中。

4.二、源码方式

经过源码方式安装Ganglia稍微有必定的复杂性,可是可使用最新的版本,这也是咱们推荐的安装方式。源码方式安装Ganglia也分为监控管理端的安装和客户端的安装,这里咱们安装使用的是Ganglia最新稳定版本ganglia-3.7.2,安装的路径是/opt/app/ganglia。首先在监控管理端经过yum命令安装Ganglia的基础依赖包,操做以下:

[root@monitor ~]#yum install -y expat expat-devel pcre pcre-devel zlib cairo-devel libxml2-devel pango-devel pango libpng-devel libpng freetype freetype-devel libart_lgpl-devel apr-devel rrdtool rrdtool-devel

接着安装ganglia的依赖程序,首选是apr,可从http://apr.apache.org/download.cgi 网站下载,编译安装以下:

[root@monitor ~]#tar zxvf apr-1.6.3.tar.gz [root@monitor ~]#cd apr-1.6.3 [root@monitor apr-1.6.3]#./configure [root@monitor apr-1.6.3]#make [root@monitor apr-1.6.3]#make install

接着是confuse的安装,可从http://ftp.twaren.net/Unix/NonGNU/confuse/ 下载,操做过程以下:

[root@monitor ~]#tar zxvf confuse-2.7.tar.gz [root@monitor ~]#cd confuse-2.7 [root@monitor confuse-2.7]#./configure CFLAGS=-fPIC --disable-nls [root@monitor confuse-2.7]#make [root@monitor confuse-2.7]#make install

最后进入ganglia-gmetad的安装,过程以下:

[root@monitor ~]#tar zxvf ganglia-3.7.2.tar.gz [root@monitor ~]#cd ganglia-3.7.2 [root@monitor ganglia-3.7.2]# ./configure --prefix=/opt/app/ganglia --with-static-modules --enable-gexec --enable-status --with-gmetad --with-python=/usr --with-libexpat=/usr --with-libconfuse=/usr/local --with-libpcre=/usr/local [root@monitor ganglia-3.7.2]#make [root@monitor ganglia-3.7.2]# make install [root@monitor gmetad]# mkdir -p /opt/app/ganglia/var/run [root@monitor gmetad]# systemctl enable gmetad

至此,ganglia-gmetad安装完成。

下面介绍Ganglia客户端的安装过程,ganglig-gmond的安装与ganglia-gmetad大体相同,对于系统依赖包和基础软件包的安装彻底相同,只是ganglig-gmond不须要rrdtool的支持,所以重点讲述ganglig-gmond的编译安装过程。

[root@node1 ~]#tar zxvf ganglia-3.7.2.tar.gz [root@node1 ~]#cd ganglia-3.7.2 [root@node1 ganglia-3.7.2]#./configure --prefix=/opt/app/ganglia --enable-gexec --enable-status --with-python=/usr --with-libapr=/usr/local/apr/bin/apr-1-config --with-libconfuse=/usr/local --with-libexpat=/usr --with-libpcre=/usr [root@node1 ganglia-3.7.2]#make [root@node1 ganglia-3.7.2]#make install [root@node1 gmond]#cd gmond [root@node1 gmond]#./gmond -t > /opt/app/ganglia/etc/gmond.conf #用于生成gmond服务配置文件 [root@node1 gmond]#mkdir -p /opt/app/ganglia/var/run [root@node1 gmond]# systemctl enable gmond

到这里为止,ganglig-gmond安装完成。

5、配置一个Ganglia分布式监控系统

5.一、 Ganglia配置文件介绍

Ganglia的配置文件主要有两个,分别是监控管理端的gmetad.conf和客户端的gmond.conf文件。根据Ganglia安装方式的不一样,配置文件的路径也不相同,经过yum方式安装的Ganglia,默认的配置文件位于/etc/ganglia下,而经过源码方式安装的Ganglia,配置文件路径位于ganglia安装路径的etc目录下,例如上面经过源码方式安装的Ganglia配置文件路径为/opt/app/ganglia/etc。在监控管理端,只须要配置gmetad.conf文件便可,而在客户端也只须要配置gmond.conf文件就好了。

5.二、 Ganglia监控系统架构图

Ganglia支持多种监控架构,这是由gmetad的特性决定的,gmetad能够周期性地去多个gmond节点收集数据,这就是ganglia的两层架构。同时,gmetad不但能够从gmond收集数据,也能够从其余的gmetad获得数据,这就造成了Gnaglia的三层架构。多种架构方式也体现了Ganglia做为分布式监控系统的灵活性和扩展性。

这里介绍一个简单的Ganglia配置构架,即一个监控管理端和多个客户端的两层架构。咱们假定gmond工做在多播模式,而且有一个Cluster1的集群,其中有4台要监控的服务器,主机名从cloud0到cloud3,这4台主机在同一个网段内。

5.三、 Ganglia监控管理端配置

监控管理端的配置文件是gmetad.conf,这个配置文件内容比较多,可是须要修改的配置仅有以下几个:

data_source "Cluster1" cloud0 cloud2 gridname "TopGrid" xml_port 8651 interactive_port 8652 rrd_rootdir "/opt/app/ganglia/rrds"

 data_source:此参数定义了集群名字,以及集群中的节点。Cluster1就是这个集群的名称,cloud0和cloud2指明了从这两个节点收集数据,Cluster1后面指定的节点名能够是IP地址,也能够是主机名,因为采用了multicast模式,每一个gmond节点都有本Cluster1集群节点全部监控数据,所以不须要把全部节点都写入data_source中。可是建议写入不低于2个,这样,在cloud0节点出现故障的时候,gmetad会自动到cloud2节点采集数据,这样就保证了Ganglia监控系统的高可用性。

上面经过data_source参数定义了一个服务器集群Cluster1,对于要监控多个应用系统的状况,还能够对不一样用途的主机进行分组,定义多个服务器集群,分组方式能够经过下面的方法定义:

data_source "my cluster" 10 localhost my.machine.edu:8649 1.2.3.5:8655 data_source "my grid" 50 1.3.4.7:8655 grid.org:8651 grid-backup.org:8651 data_source "another source" 1.3.4.7:8655 1.3.4.8

能够经过定义多个data_source来实现监控多个服务器集群,而每一个服务器集群在定义集群节点的时候,能够采用主机名或IP地址等形式,也能够加端口,若是不加端口,默认端口是8649,同时能够设定采集数据的频率,如上面的“10 localhost、50 1.3.4.7:8655”等,分别表示每隔10秒钟、50秒钟采集一次数据。

 gridname:此参数是定义一个网格名称。一个网格有多个服务器集群组成,每一个服务器集群由“data_source”选项来定义。

 xml_port:此参数定义了一个收集数据汇总的交互端口,若是不指定,默认是8651,能够经过telnet这个端口获得监控管理端收集到的客户端的全部数据。

 interactive_port:此参数定义了Web端获取数据的端口,这个端口在配置Ganglia的Web监控界面时须要指定。

 rrd_rootdir:此参数定义了rrd数据库的存放目录,gmetad在收集到监控数据后会将其更新到该目录下的对应的rrd数据库中。gmetad须要对此文件夹有写权限,默认gmetad是经过nobody用户运行的,所以须要受权此目录的权限为nobody。即为:chown -R nobody:nobody /opt/app/ganglia/rrds。
到这里为止,在Ganglia监控管理端的配置完成了。

5.四、 Ganglia的客户端配置

Ganglia监控客户端gmond安装完成后,配置文件位于Ganglia安装路径的etc目录下,名称为gmond.conf,这个配置文件稍微复杂,以下所示:

globals { daemonize = yes #是否后台运行,这里表示之后台的方式运行 setuid = yes #是否设置运行用户,在Windows中须要设置为false user = nobody #设置运行的用户名称,必须是操做系统已经存在的用户,默认是nobody debug_level = 0 #调试级别,默认是0,表示不输出任何日志,数字越大表示输出的日志越多 max_udp_msg_len = 1472 mute = no #是否发送监控数据到其余节点,设置为no表示本节点将再也不广播任何本身收集到的数据到网络上 deaf = no #是否接受其余节点发送过来的监控数据,设置为no表示本节点将再也不接收任何其余节点广播的数据包 allow_extra_data = yes#是否发送扩展数据 host_dmax = 0 /*secs */#是否删除一个节点,0表明永远不删除,0以外的整数表明节点的不响应时间,超过这个时间后,Ganglia就会刷新集群节点信息进而删除此节点 cleanup_threshold = 300 /*secs */ #gmond清理过时数据的时间 gexec = no #是否使用gexec来告知主机是否可用,这里不启用 send_metadata_interval = 60 #主要用在在单播环境中,若是设置为0,那么若是某个节点的gmond重启后,gmond汇聚节点将再也不接受这个节点的数据,将此值设置大于0,能够保证在gmond节点关闭或重启后,在设定的时间内,gmond汇聚节点能够从新接收此节点发送过来的信息。单位秒 } cluster { name = "Cluster1" #集群的名称,是区分此节点属于某个集群的标志,必须和监控服务端data_source中的某一项名称匹配 owner = "junfeng" #节点的拥有者,也就是节点的管理员 latlong = "unspecified" #节点的坐标,经度、纬度等,通常无需指定 url = "unspecified" #节点的URL地址,通常无需指定 } host { location = "unspecified" #节点的物理位置,通常无需指定 } udp_send_channel { #udp包的发送通道 mcast_join = 239.2.11.71 #指定发送的多播地址,其中239.2.11.71是一个D类地址。若是使用单播模式,则要写host = host1,网络环境复杂的状况下,推荐使用单播模式。在单播模式下也能够配置多个udp_send_channel port = 8649 #监听端口 ttl = 1 } udp_recv_channel { #接收udp包配置 mcast_join = 239.2.11.71 #指定接收的多播地址,一样也是239.2.11.71这个D类地址 port = 8649 #监听端口 bind = 239.2.11.71 #绑定地址 } tcp_accept_channel { port = 8649 #经过tcp协议监听的端口,在远端能够经过链接到8649端口获得监控数据 }

在一个集群内,全部客户端的配置是同样的。完成一个客户端配置后,将配置文件复制到此集群内的全部客户端主机上便可完成客户端主机的配置。

5.五、 Ganglia的Web端配置

Ganglia的web监控界面是基于PHP的,所以须要安装LAMP或LNMP环境。推荐你们使用LNMP环境,这个环境在zabbix章节中已经介绍很清楚了,这里再也不介绍,你们能够在http://sourceforge.net/projects/ganglia/files/下载ganglia-web的最新版本,而后将ganglia-web程序放到Apche Web的根目录便可,这里咱们推荐下载的版本是ganglia-web-3.7.2。

配置Ganglia的Web界面比较简单,只须要修改几个php文件便可。首先是conf_default.php,能够将conf_default.php重命名为conf.php,也能够保持不变,Ganglia的Web默认先找conf.php,找不到会继续找conf_default.php,须要修改的内容以下:

$conf['gweb_confdir'] = "/var/www/html/ganglia"; #ganglia web的根目录 $conf['gmetad_root'] = "/opt/app/ganglia"; # ganglia程序安装目录 $conf['rrds'] = "${conf['gmetad_root']}/rrds"; #ganglia web读取rrd数据库的路径,这里是/opt/app/ganglia/rrds $conf['dwoo_compiled_dir'] = "${conf['gweb_confdir']}/dwoo/compiled"; #须要“777”权限 $conf['dwoo_cache_dir'] = "${conf['gweb_confdir']}/dwoo/cache"; #须要“777”权限 $conf['rrdtool'] = "/opt/rrdtool/bin/rrdtool"; #指定rrdtool的路径 $conf['graphdir']= $conf['gweb_root'] . '/graph.d'; #生成图形模板目录 $conf['ganglia_ip'] = "125.0.0.1"; #gmetad服务所在服务器的地址 $conf['ganglia_port'] = 8652; #gmetad服务器的交互式提供监控数据端口发布

这里须要说明的是:“$conf[‘dwoo_compiled_dir’]”和“$conf[‘dwoo_cache_dir’]”指定的路径在默认状况下可能不存在,所以须要手动创建compiled和cache目录,并授予Linux下“777”的权限。另外,rrd数据库的存储目录/opt/app/ganglia/rrds必定要保证rrdtool可写,所以须要执行受权命令:

chown –R nobody:nobody /opt/app/ganglia/rrds

这样rrdtool才能正常读取rrd数据库,进而将数据经过Web界面展现出来。其实ganglia-web的配置仍是比较简单的,一旦配置出错会给出提示,根据错误提示进行问题排查,通常都能找到解决方法。

6、Ganglia监控系统的管理和维护

在Ganglia的全部配置完成以后,就能够启动Ganglia监控服务了,首先在被监控节点依次启动gmond服务,操做以下:

[root@node1 ~]#systemctl start gmond

而后经过查看系统的/var/log/messages日志信息,判断gmond是否成功启动,若是出现问题,根据日志的提示进行解决。

接着就能够启动监控管理节点的gmetad服务了,操做以下:

[root@monitor ~]#systemctl start gmetad

一样,也能够跟踪一下系统的/var/log/messages日志信息,看启动过程是否出现异常。

最后,将Apache/PHP的Web服务启动,就能够查看Ganglia收集到的全部节点的监控数据信息。下图是Ganglia Web某一时刻的运行状态图。

到这里位置,ganglia分布式监控平台已经搭建起来了,默认状况下,ganglia会对每一个监控节点的CPU、内存、磁盘、网络、IO、负载进行自动收集数据,无需作任何配置,而且收集数据的gmond进程很是轻量级,基本不会对被监控服务器上的业务形成影响。所以,经过ganglia能够监控海量主机。

ganglia 的基础本文先介绍到这里,下面会对ganglia分布式监控和分布式架构、以及ganglia扩展监控作更详细的介绍。

相关文章
相关标签/搜索