0%
2.6k 字 10 分钟

Ganglia 笔记(1)

前言

最近接到一个新任务,使用ganglia去监控Hadoop各个组件的指标。
调研发现,hdfs,hbase,spark这三个,可以通过设置,源生支持ganglia。然后其他的组件,比如storm,hive之类的,由于都是运行在JVM上的,可以使用JMX获取其监控指标。
在实际的生产过程,使用HttpClient获取JMX的json串,然后再进行解析,可以获取其内容。但是编码量比较大,而且都是重复工作,于是发现了jmxtrans这个工具,可以通过JSON配置文件的方式,获取JMX的监控指标,并将其发给ganglia。从而完成整个监控。

Ganglia

Ganglia 简介

Ganglia是UCBerkeley发起的一个开源集群监视项目。它主要是用来监控系统性能,如:CPU、Memory、硬盘利用率,I/O负载、网络流量情况等。Ganglia通过图形化的方式展示每个节点的状态信息,这对合理调整、分配系统资源,提高系统整体性能起到重要作用。Ganglia包含三个核心组件:GangliaMonitoring Daemon(gmond)、GangliaMeta Daemon(gmetad)以及GangliaPHP Web Frontend。

Ganglia 总体架构

Gmond组件

Gmond组件部署于集群中各个被监控的节点。其主要功能是从操作系统或指定的主机收集状态信息。其收集主机状态信息的方式灵活,状态信息均以XML格式进行传输。Gmond组件可以级联形成层次结构,这种层次结构使得Ganglia拥有良好的可扩展性。另外,Gmond组件带来的系统负载非常少,对用户的影响非常小。Gmond组件的工作模式有两种:单播和多播。单播模式下,Gmond组件发送其收集的主机状态信息到指定的一个或多个节点,可以跨网段;多播模式下,Gmond组件发送其监控的主机状态信息到同一网段内的所有节点,同时还接收同一网段内其他节点发送的状态信息。

Gmetad组件

Gmetad组件可以部署于集群中的某一节点,也可以部署于集群外的某一专门服务器,其主要功能是周期性地从指定的Gmond组件或其他Gmetad组件拉取数据,并将拉取的数据存储在本地数据库。这些存储的状态信息供Ganglia-Web组件使用。

Ganglia-Web组件

Ganlgia-Web组件和Gmetad组件须部署于同一节点,它通过数据库轮询的方式从Gmetad组件中获取状态信息,并以web形式图形化地展示各个节点的状态信息。

工作原理

Ganglia包括如下几个程序,他们之间通过XDL(xml的压缩格式)或者XML格式传递监控数据,达到监控效果。集群内的节点,通过运行gmond收集发布节点状态信息,然后gmetad周期性的轮询gmond收集到的信息,然后存入rrd数据库,通过web服务器可以对其进行查询展示。

Gmetad 这个程序负责周期性的到各个datasource收集各个cluster的数据,并更新到rrd数据库中。可以把它理解为服务端。

Gmond 收集本机的监控数据,发送到其他机器上,收集其他机器的监控数据,gmond之间通过udp通信,传递文件格式为xdl。收集的数据供Gmetad读取,默认监听端口8649,监听到gmetad请求后发送xml格式的文件。可以把它理解为客户端。

web front-end 一个基于web的监控界面,通常和Gmetad安装在同一个节点上,它从Gmetad取数据,并且读取rrd数据库,生成图片,显示出来。

gmetad周期性的去gmond节点或者gmetad节点poll数据。一个gmetad可以设置多个datasource,每个datasource可以有多个备份,一个失败还可以去其他host取数据。

muticast模式

如果是muticast模式的话,gmond之间还会通过多播来相互传递数据。Gmond本身具有udpsend和recv通道,还有一个tcprecv通道。其中udp通道用于向其他gmond节点发送或接受数据,tcp则用来exportxml文件,主要接受来自gmetad的请求。Gmetad只有tcp通道,一方面它向datasource发送请求,另一方面会使用一个tcp端口,发布自身收集的xml文件,默认使用8651端口。所以gmetad即可以从gmond也可以从其他的gmetad得到xml数据。

Gmond节点内部模块图如下所示:

如上图所示,主要由三个模块组成,collect and publish模块,该模块周期性的调用一些内部指令获得metricdata,然后将这些数据通过udp通道发布给其他gmond节点。ListenThreads,监听其他gmond节点的发送的udp数据,然后将数据存放到内存中。XMLexport thread负责将数据以xml格式发布出去,比如交给gmetad。

unicast模式

unicast模式下ganglia系统内的数据流。

如上图所示,多个gmond节点通过udp向单播的目标host的gmond发送数据,gmetad然后向该目标host的gmond请求xml文件,然后存入rrdtool数据库。在unicast模式中,图中方框内的组件通常是位于集群内的同一个节点。该节点负责收集存储显示被监控的各节点的状态信息。

自定义metrics

向ganglia加入自定义metric有两种方法,一种是通过命令行的方式运行gmetric,另一种是通过ganglia提供的面向c和python的扩展模块,加入自定义的模块支持。

更多python模块,可以参考:
https://github.com/ganglia/gmond_python_modules

单播与组播

在进行Ganglia集群配置之前,首先要搞清楚单播和组播。
单播:可以跨网段传播,只将信息发送给指定的机器。要配置成为单播你应该指定一个(或者多个)接受的主机。
组播:在机器所处的网段中发送广播,发送给位于同一网段的所有机器。如果你正在使用组播传输,那么你没必要改变任何东西,因为这是Ganglia包安装默认的。唯一要做的就是把gmetad指向一个或几个运行着gmond的主机。没有必要列出每一个单个主机,因为gmond被设置为接受模式时会包含所有主机的列表以及整个集群的统计信息。

关于单播和组播更详细的介绍和相关配置请参照:Ganglia快速开始向导(翻译自官方wiki),或者直接查看官方wiki。

Ganglia 安装

Ganglia的安装,依赖包很多。如果在联网的环境下,还是比较简单的。否则的话,尽量使用源码编译安装。

依赖

安装ganglia依赖的库有:rrdtool,apr,confuse,expat,pkg-config,pcre-8.33
安装ganglia前准备:
ganglia源码包:http://sourceforge.net/projects/ganglia/files/?source=navbar,可以下载ganglia,及ganglia-web
rrdtool源码包:http://oss.oetiker.ch/rrdtool/pub/?M=D
apr的源码包:http://apr.apache.org/download.cgi
confuse的源码包:http://www.nongnu.org/confuse/
expat的源码包:http://sourceforge.net/projects/expat/files/expat/2.1.0/
pkg-config的源码包:http://pkgconfig.freedesktop.org/releases/
pcre的源码包:http://sourceforge.net/projects/pcre/files/pcre/

安装

1.安装rrd,安装前需要查看系统中是否有cairo库,glib库,libpng库,如果这些库都不存在,需要安装,如果已经存在,再去安装,会导致ganglia-web中出现不了图片
参照

rrd依赖库的源码包地址
若未找到cairo库的话,需要安装cairo库
安装cairo库时需要安装其依赖库freetype,fontconfig,在安装cairo库时可能出现
could not find libpng in /usr/lib/pkgconfig path
这时需要设置
export png_REQUIRES="libpng"
由于我的系统中已经存在这些库,所以我可以直接编译rrd-tool
./configure --prefix=/usr && make && make install

2.安装 apr-1.4.6
./configure --prefix=/usr && make &&make install

3.安装confuse-2.7
./configure --prefix=/usr CFLAGS=-fPIC --disable-nls && make && make install

4.安装 expat-2.1.0
./configure --prefix=/usr && make && make install

5.安装pkg-config-0.28
/configure --prefix=/usr --with-internal-glib && make && make install

6.安装pcre-8.33
./configure --prefix=/usr && make && make install

7.安装ganglia
./configure --prefix=/usr CFLAGS="-I/usr/include" CPPFLAGS="-I/usr/include" LDFLAGS="-L/usr/lib/pkgconfig" --with-gmetad &&make -j8 &&make install

8.配置ganglia

Server:
cp gmetad/gmetad.init /etc/init.d/gmetad
cp gmetad/gmetad.conf /etc/ganglia/gmetad.conf
chkconfig gmetad on
chkconfig --list gmetad
查看是否能够启动gmetad, service gmetad start
如果出现动态库链接失败时,执行ldconfig

Client:
cp gmond/gmond.init /etc/rc.d/init.d/gmond
mkdir /etc/ganglia
gmond --default_config > /etc/ganglia/gmond.conf
chkconfig gmond on
chkconfig --list gmond
mkdir -p /var/lib/ganglia/rrds
chown nobody:nobody /var/lib/ganglia/rrds
查看是否能够启动gmond, service gmond start
如果出现动态库链接失败时,执行ldconfig

9.修改gmetad.conf及gmond.conf的内容
vi /etc/ganglia/gmetad.conf
#修改data_source “grid” localhost (如果需要监听其他机器,将需要监听的机器添加到data_source中,需要监听的机器不需要安装gmetad)
vi /etc/ganglia/gmond.conf
#修改cluster中name = “grid”

10.安装ganglia-web
直接到ganglia-web下执行make install
然后执行 mv /var/www/html/ganglia /var/www
service httpd restart

jmxtrans 安装

1、下载jmxtrans
下载地址
2、安装jmxtrans
#判断是否已安装此软件
#rpm -qa |grep jmx
#卸载软件
#rpm -e jmxXXXXXX
#安装jmxtrans
rpm -ivh
说明:

jmxtrans安装目录:/usr/share/jmxtrans

jmxtrans配置文件 :/etc/sysconfig/jmxtrans

json文件默认目录:/var/lib/jmxtrans/

3、配置开机启动

jmxtrans配置文件增加JAVA_HOME的配置,例如:

vi /etc/sysconfig/jmxtrans
export JAVA_HOME=/opt/jdk1.7
chkconfig —add jmxtrans
chkconfig jmxtrans on
service jmxtrans start
#启动日志的文件在/var/log/jmxtrans/jmxtrans.log,大家可以通过查看日志来判断是否可以接收数据

4、监控jvm应用需要增加以下jvm启动参数

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

jmxtrans json配置

待续

结语

由于之前在研究ELK。会不由自主的拿ELK和ganglia进行比较。虽然这是不合适的。ELK是一个完整的技术栈,ganglia则相对薄弱。如果对标的话,私以为ELK中的beats + X-pack 可以实现ganglia的功能。只是ELK功能更为强大,而ganglia则更为轻量。

ref

ganglia github

ganglia 简介

基于redhat6.2下安装ganglia

jmxtrans安装

jmxtrans github