一、引言
ganglia是一个优秀的分布式集群网络监控系统,起源于UC Berkeley发起的一个开源项目。该项目起初的定位就是开发出一个能监控数千计节点的监控服务系统,把各节点的状态信息汇总一起,以供使用者能够方便集中地观察集群的相关指标。在ganglia里面,采集的指标称之为度量数据。这些度量数据包含有cpu, memory,硬盘使用情况等。当然,我们也可以为ganglia写一些插件,让ganglia能够采集得到用户提供的特定数据。通过这些度量数据,你可以观察到节点的运行状况,分析集群是否存在问题。
二、ganglia安装
现在那些对集群稍有要求的公司都会用到ganglia。如果ganglia事先为你部署好了,那么你就只需要观察你想查看的数据即可。如果需要自己来安装ganglia,那么安装成功ganglia,还是需要了解ganglia的组成,这样便于ganglia来搭建。
ganglia主要包括三个大的功能:
- 采集。ganglia的采集工具是ganglia自带的工具(二进制执行文件)gmond, gmetad。
- 存储。ganglia会把数据存储在以.rrd为扩展名的rrd文件里面。因此这需要安装rrdtool包。
- 展示。ganglia自带一个分析rrd格式数据的展示工具,这个工具是用php写的。可以直接放到apache(或者用轻量级httpd,nginx)等容器的project目录中,通过它们来访问监控页面。
因此,使用ganglia,需要我们安装三个包:ganglia包,rrdtool包,WEB容器apache或者nginx包。
2.1. 安装依赖包
rrdtool包依赖许多的第三方工具,例如pango,freetype,libpng,libart_lgpl等。依赖的所有包可以参考如下页面:
http://oss.
oetiker.ch/rrdtool/pub/libs/。
如果不想一个一个的安装,也可以通过如下命令,一劳永逸。
yum install libpng apr* check-devel cairo* pango* libxml2-devel glib2* zlib libdbi dbus-devel freetype* fontconf* gcc* expat-devel python-devel libXrender-devel pcre* pkgconfig pixman libart_lgpl* perl libconfuse下面简单讲一些几个重要包的作用:
- apr:是apache基金会下的apache portable runnable项目。
- confuse:是配置文件解析器。它有强大的功能,并且接口容易理解学习。
- expat:是xml文件解析器,能够边读取xml边解析成数据。(想一想ganglia采集的数据是什么格式的?)
我在安装上述工具包时是通过源码包来安装的。
(cd expat-2.1.0 ; ./configure --prefix=/usr/local/expat-2.1.0;make;make install) && \ (cd apr-1.4.6; ./configure --prefix=/usr/local/apr-1.4.6;make;make install) && \ (cd apr-util-1.4.1; ./configure --with-apr=/usr/local/apr --with-expat=/usr/local/expat --with-apr=/usr/local/apr-1.4.6 --with-expat=/usr/local/expat-2.1.0;make;make install) && \ (cd confuse-2.7; ./configure --prefix=/usr/local/confuse-2.7;make;make install)
2.2. 安装rrdtool包和ganglia包
在安装rrdtool时,有时需要指定一些安装包的路径。在安装ganglia包之前必须先安装rrdtool, 这样--with-gmetad才会起作用,因为该命令依赖rrdtool静态库。ganglia包下面有gmond,gmetad,web三个重要目录。其中web目录下是一些php文件,用于提供给web容器来展示。我们安装的ganglia是3.0.7版本的。
(cd rrdtool-1.2.27; ./configure --prefix=/usr/local/rrdtool CFLAGS="-I/usr/local/freetype-2.1.10/include -I/usr/local/libart_lgpl-2.3.17/include" CPPFLAGS="-I/usr/local/freetype-2.1.10/include -I/usr/local/libart_lgpl-2.3.17/include" LDFLAGS="-L/usr/local/freetype-2.1.10/lib -L/usr/local/libart_lgpl-2.3.17/lib -L/usr/lib64"; make;make install) (cd ganglia-3.0.7; ./configure --prefix=/usr/local/ganglia-3.0.7 --with-libapr="/usr/local/apr-1.4.6" --with-libconfuse="/usr/local/confuse-2.7" CFLAGS="-I/usr/local/rrdtool/include" CPPFLAGS="-I/usr/local/rrdtool/include" LDFLAGS="-L/usr/local/rrdtool/lib" --with-gmetad --enable-gexec --with-librrd=/usr/local/rrdtool/ ; make;make install)
运行上述命令没有出错的话,那么ganglia基本上安装成功。接下来需要配置相关参数并使其正常运行。
2.3 配置ganglia服务器参数
1. 进入ganglia-3.0.7目录,把gmond,gmetad拷到/usr/local/sbin目录下。如果在安装ganglia时的--prefix=/usr/local,就可以略过这一步。
sudo cp gmond/gmond /usr/local/sbin sudo cp gmetad/gmetad /usr/local/sbin
2. 把它加到linux自动启动项中。
sudo cp gmetad/gmetad.init /etc/rc.d/init.d/gmetad #startup script sudo cp gmond/gmond.init /etc/rc.d/init.d/gmond chkconfig --add gmetad chkconfig --add gmond
3. 拷贝gmetad.conf和 生成gmond.conf文件
sudo cp gmetad/gmetad.conf /etc gmond -t | tee /etc/gmond.conf
4. 创建ganglia的配置目录
sudo mkdir /etc/ganglia chown -R nobody:nobody /etc/ganglia
5. 创建rrds存放总目录 (这下面存放的就是rrd文件)
sudo mkdir -p /var/lib/ganglia/rrds sudo chown nobody:nobody /var/lib/ganglia/rrds
6. 修改gmond.conf文件
如果把集群看作是一张图,那么在ganglia里面的拓扑结构会树状结构,子结点向父节点发送数据包,同时gmetad节点会去向它的子节点拉一些汇总的数据。
如果既要支持多播(大部分OS支持多播)和直连,那么可以配置多个通道,如下:
cluster { name = "hadoopCluster" # 配置集群的名字,这个名字需要与gmetad的名字一样,其实就是用来分组,给一个组的标识,以便集群管理方便 owner = "unspecified" latlong = "unspecified" url = "unspecified" } #……. /* Feel free to specify as many udp_send_channels as you like. Gmond used to only support having a single channel */ udp_send_channel { mcast_join = 239.2.11.71 #用于多播的发送channel,发送到神该树的父节点 port = 8649 ttl = 1 } /* You can specify as many udp_recv_channels as you like as well. */ udp_recv_channel { mcast_join = 239.2.11.71 #用于多播的发送通道,发送到神该树的父节点 port = 8649 bind = 239.2.11.71 } /* You can specify as many udp_recv_channels as you like as well. */ udp_recv_channel { /*mcast_join = 239.2.11.71 * #用于多播接收通道,发送到神该树的父节点 port = 8653 /*bind = 239.2.11.71 */ } /* You can specify as many tcp_accept_channels as you like to share an xml description of the state of the cluster */ tcp_accept_channel { port = 8649 # 建立tcp连接向外面提供数据,例如,当你telnet 8649端口, 就走的是这个通道 }
7.修改gmeta.conf文件
data_source标签是给出集群的标识,并且提供该集群的父节点。
data_source "hadoopCluster" localhost 192.168.0.1
2.4. 启动ganglia各节点
完成以上配置,ganglia基本上可以运行了。需要测试ganglia的可用性,可以执行命令:
gmetad -d5
gmond -d5
其中-d5参数是debug模式,让其在前台运行。
2.5. 配置ganglia web服务器
1. 进入ganglia-3.0.7目录,把web目录下的文件拷贝到/var/www/html/ganglia目录下。apache的web工程所放位置都应该放到/var/www/html/目录下。
sudo mkdir -p /var/www/html/ganglia/ sudo cp -a web/* /var/www/html/ganglia/
2. 进入/var/www/html/ganglia/目录,修改conf.php文件。
# Leave this alone if rrdtool is installed in $gmetad_root, # otherwise, change it if it is installed elsewhere (like /usr/bin) #define("RRDTOOL", "/usr/bin/rrdtool"); #注释这一行, define("RRDTOOL", "/usr/local/rrdtool/bin/rrdtool"); //指定rrdtool命令路径
2.6 开启ganglia web服务
开启ganglia web服务,即是启动apache或httpd服务。在启动服务之前,需要在httpd.conf文件中添加 php5_module.so模块,然后再启动。命令如下:
apachectl -k start
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
三、安装ganglia所遇问题
问题1:有些gmond的数据gmetad接收不到
解决方法: 从iptraf中可以看到数据在gmetad节点中已经到来了,却没有在页面上展示。最后查看问题是gmond节点是通过host直连的方式发送到gmetad节点中,而gmetad节点的配置信息是采用多播的方式。因此gmetad节点就把这部分数据过滤掉了。在gmetad.conf配置文件中,可以采用两种方式:多播和直连。多播多采用在同一个网段内的节点,直连通常采用在不同网段的节点。在配置文件中,udp_recv_channel 和 udp_send_channel可以配多个,但是不要是同一个端口。通常udp_send_channel配一个。
问题2: rrdtool始读不到粗粒度的数据
解决方法:rrdtool有一个fetch的参数,用来读取rrd文件的数据。rrd文件存有多个循环队列,这些队列都是定长的,在create时就需要设置这些参数。gmetad默认配置是15秒采集一次数据写到rrd文件中,同时rrd文件中有若干个不同时间粒度的AVERAGE循环队列:分别为1 * 15 秒,24 × 15秒 = 360秒等。通过rrdtool fetch cpu_user.rrd AVERAGE命令可以采集精度最细的度量数据,在这里就是采集15秒的数据。当要指定采集6分钟的数据,那么必须同时设置精度参数-r/--resolution和起始时间-s/--start,结束时间-e/--end参数,而且 -s/-e的值必须是-r的倍数,且起始时间和结束时间必须在RRA所存取的范围之内,否则就采集不到你想要的数据。
因此需要采集6分钟精度数据的脚本如下:
RRDRES=360 TIME=$(date +%s) rrdtool fetch $RRD_FILE_PATH AVERAGE -r $RRDRES -e $(($TIME/$RRDRES*$RRDRES)) -s e-1h