分布式监控数据采集系统Ganglia实战
一、什么是Ganglia
对于这个工具,大家可能比较陌生,但是它功能非常强大,如果我们想收集所有服务器、网络设备的数据,那么ganglia绝对是首选,在深入学习之前,还是先从基础概念了解起吧!
Ganglia是一款为HPC(高性能计算)集群而设计的可扩展的分布式监控系统,它可以监视和显示集群中的节点的各种状态信息,它由运行在各个节点上的gmond守护进程来采集CPU 、内存、硬盘利用率、I/O负载、网络流量情况等方面的数据,然后汇总到gmetad守护进程下,使用rrdtool存储数据,最后将历史数据以曲线方式通过PHP页面呈现。
Ganglia的特点如下:
良好的扩展性,分层架构设计能够适应大规模服务器集群的需要
负载开销低,支持高并发
广泛支持各种操作系统(UNIX等)和cpu架构,支持虚拟机
二、Ganglia的组成
Ganglia监控系统有三部分组成,分别是gmond、gmetad、webfrontend,作用如下。
gmond: 即为ganglia monitoring daemon,是一个守护进程,运行在每一个需要监测的节点上,用于收集本节点的信息并发送到其他节点,同时也接收其他节点发过了的数据,默认的监听端口为8649。
gmetad: 即为ganglia meta daemon,是一个守护进程,运行在一个数据汇聚节点上,定期检查每个监测节点的gmond进程并从那里获取数据,然后将数据指标存储在本地RRD存储引擎中。
webfrontend: 是一个基于web的图形化监控界面,需要和Gmetad安装在同一个节点上,它从gmetad取数据,并且读取RRD数据库,通过rrdtool生成图表,用于前台展示,界面美观、丰富,功能强大。
下图是一个简单的Ganglia监控系统结构图。
从图中可以看出,一个Ganglia监控系统是由多个gmond进程和一个主gmetad进程组成,所有gmond进程将收集到的监控数据汇总到gmetad管理端,而gmetad将数据存储到RRD数据库中,最后通过PHP程序在Web界面进行展示。
这是最简单的Ganglia运行结构图,在复杂的网络环境下,还有更复杂的Gnaglia监控架构。下图是Ganglia的另一种分布式监控架构图。
从这个图中可以看出,gmond可以等待gmetad将监控数据收集走,也可以将监控数据交给其它gmond,进而让其他gmond将数据最终交付给gmetad,同时,gmetad也可以收集其他gmetad的数据.比如,对于上图中的Cluster1和Cluster2集群,Cluster2就是一个gmetad,它将自身收集到的数据又一次的传输给了Cluster1集群;而Cluster1将所有集群的数据进行汇总,然后通过Web进行统一展现。
三、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上收集监控数据。
1、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数据库,生成图片显示出来。
2、Ganglia工作模式
Ganglia的收集数据工作可以在单播(unicast)或多播(multicast)模式下进行,默认为多播模式。
单播:每个被监控节点发送自己收集到的本机数据到指定的一台或几台机器上。单播模式可以跨越不同的网段。如果是多个网段的网络环境,就可以采用单播模式采集数据。
多播:每个被监控节点发送自己收集到的本机数据到同一网段内所有的机器上,同时也接收同一网段内的所有机器发送过来的监控数据。因为是以广播包的形式发送,因此这种模式需要所有主机在同一网段内。但在同一网段内,又可以定义不同的发送通道。
四、Ganglia的安装
在介绍安装之前,首先说明一下安装环境,这里采用CentOS7.5的Linux发行版本,其他版本的安装过程基本相同。
Ganglia的安装很简单,可以通过源码包和yum源两种方式进行安装。yum源方式安装方便,可以自动安装依赖关系,但是版本往往不是最新的,而通过源码方式,可以安装最新版的Ganglia。下面具体介绍一下这两种安装方式。
4.1、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.2、源码方式
通过源码方式安装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安装完成。
五、配置一个Ganglia分布式监控系统
5.1、 Ganglia配置文件介绍
Ganglia的配置文件主要有两个,分别是监控管理端的gmetad.conf和客户端的gmond.conf文件。根据Ganglia安装方式的不同,配置文件的路径也不相同,通过yum方式安装的Ganglia,默认的配置文件位于/etc/ganglia下,而通过源码方式安装的Ganglia,配置文件路径位于ganglia安装路径的etc目录下,例如上面通过源码方式安装的Ganglia配置文件路径为/opt/app/ganglia/etc。在监控管理端,只需要配置gmetad.conf文件即可,而在客户端也只需要配置gmond.conf文件就行了。
5.2、 Ganglia监控系统架构图
Ganglia支持多种监控架构,这是由gmetad的特性决定的,gmetad可以周期性地去多个gmond节点收集数据,这就是ganglia的两层架构。同时,gmetad不但可以从gmond收集数据,也可以从其他的gmetad得到数据,这就形成了Gnaglia的三层架构。多种架构方式也体现了Ganglia作为分布式监控系统的灵活性和扩展性。
这里介绍一个简单的Ganglia配置构架,即一个监控管理端和多个客户端的两层架构。我们假定gmond工作在多播模式,并且有一个Cluster1的集群,其中有4台要监控的服务器,主机名从cloud0到cloud3,这4台主机在同一个网段内。
5.3、 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.4、 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.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的配置还是比较简单的,一旦配置出错会给出提示,根据错误提示进行问题排查,一般都能找到解决方法。
六、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扩展监控做更详细的介绍。