Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点。每台计算机都运行一个收集和发送度量数据(如处理器速度、内存使用量等)的名为 gmond 的守护进程。它将从操作系统和指定主机中收集。接收所有度量数据的主机可以显示这些数据并且可以将这些数据的精简表单传递到层次结构中。正因为有这种层次 结构模式,才使得 Ganglia 可以实现良好的扩展。gmond 带来的系统负载非常少,这使得它成为在集群中各台计算机上运行的一段代码,而不会影响用户性能。
Hadoop原生的支持ganglia监控,并且可以自己配置metric。
安装rhel 5.7 64位。目前hadoop和大数据使用的机群redhat均为此版本。
vi /etc/yum.repos.d//rhel-debuginfo.repo,将文件内容改为以下内容,目的是能使用国防科大的centos源进行yum更新操作。
######################
[base]
name=CentOS-5 - Base
repo=os
baseurl=http://centos.ustc.edu.cn/centos/5/os/$basearch/
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
[update]
name=CentOS-5 - Updates
baseurl=http://centos.ustc.edu.cn/centos/5/updates/$basearch/
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
[addons]
name=CentOS-5 - Addons
baseurl=http://centos.ustc.edu.cn/centos/5/addons/$basearch/
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
[extras]
name=CentOS-5 - Extras
baseurl=http://centos.ustc.edu.cn/centos/5/extras/$basearch/
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
[centosplus]
name=CentOS-5 - Plus
baseurl=http://centos.ustc.edu.cn/centos/5/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
[contrib]
name=CentOS-5 - Contrib
baseurl=http://centos.ustc.edu.cn/centos/5/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
###################
保存退出后执行命令
yum makecache
如果没有错误发生,说明该源可以使用。如果遇到错误,请尝试其它源(网易 sohu等)或检查配置。具体方法请自行Google Redhat使用centos源。
说明:以下安装过程所有命令默认使用root用户,拥有最高可执行权限。
先安装一些必须的库。
yum -y install apr-devel apr-util check-devel cairo-devel libxml2-devel rpmbuild glib2-devel dbus-devel freetype-devel fontconfig-devel gcc-c++ expat-devel python-devel libXrender-devel libXext-devel libXft-devel
然后下载pango的rpm安装包。
wget ftp://rpmfind.net/linux/centos/5.9/os/x86_64/CentOS/pango-devel-1.14.9-8.el5.centos.3.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/5.9/os/x86_64/CentOS/pango-1.14.9-8.el5.centos.3.x86_64.rpm
依次安装之
rpm -ivh pango-1.14.9-8.el5.centos.3.x86_64.rpm
rpm -ivh pango-devel-1.14.9-8.el5.centos.3.x86_64.rpm
可能碰到的问题:
安装pango的时候可能会提示已经安装了更新版本的包,这里由于还要安装pango-devel,我们下载的两个包是配套的,因此需要将新版本的pango先卸载掉。
rpm -qa | grep pango (假如输出如下)
pango-1.14.9-8.el5_6.2
pango-1.14.9-8.el5_6.2
rpm -e --allmatches --nodeps pango-1.14.9-8.el5_6.2
卸载成功以后即可通过上面的命令安装pango。
RRDtool (Round Robin Database Tool)就是一个强大的绘图的引擎,很多工具例如MRTG都可以调用rrdtool绘图。RRDtool是指Round Robin Database 工具(环状数据库)。Round robin是一种处理定量数据、以及当前元素指针的技术。
ganglia使用rrdtool来存储数据并绘图。
cd /opt/
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.3.1.tar.gz
tar -zxvf rrdtool-1.3.1.tar.gz
cd rrdtools
export PKG_CONFIG_PATH=/usr/lib/pkgconfig/
./configure
make
make install
cd /usr/local/
ln -s rrdtool-1.3.1/ rrdtool
cd rrdtool
ls –l
cd ..
rm rrdtool-1.3.1.tar.gz
验证rrdtool是否安装成功。
您可以到/usr/local/rrdtool/share/rrdtool/examples/ directory 下运行它们去查看你是否成功安装了RRDTool。
#cd /usr/local/rrdtool/share/rrdtool/examples/
#./stripes.pl
#ls -l
#cp stripes.png /var/www/html/ (这一步骤的前提是你本机是个WWW服务器器)
在浏览器中输入http://your-domain.com/stripes.png ,看看自己的图形。
或者直接把stripes.png拷贝到windows机器上用相应的软件打开查看。
ganglia分为服务器端和客户端,编译后文件名是gmetad和gmond,其中gmetad是服务器端,gmond是客户端,服务器端只有一个,而 被监控服务器均安装客户端。很有意思的是,Ganglia采用Internet IPv4 类D地址中的的组播进行数据请求。我猜可能主要是为了实现一对多节省带宽的需要。其实现原理应该是gmetad发送一个请求到一个组播地址,由于是组播地 址,所以gmetad只需发送一次请求包即可完成对所有gmond的轮询。(如果是单播,则Ganglia需要向每台服务器均发送一次轮询请求,这样的 话,集群数量多了,主服务器光发送就会占用不小的带宽。而Ganglia本身是为大规模集群所做的HPC而生的,如果占用很高的带宽和占用很大量的CPU 资源去处理网络数据就不符合其设计理念了。)然后gmond通过这个请求将采集到的数据返回给gmetad,gmetad将数据保存在rrd数据库中,然 后通过web界面绘图展示。
本部分内容介绍服务端的编译和安装。前面部分所做的工作都是为服务端编译准备条件。只有服务端需要rrdtool。服务端只需要在一台机器上安装。
yum install -y expat expat-devel pcre pcre-devel
cd /opt/
wget http://download.savannah.gnu.org/releases/confuse/confuse-2.7.tar.gz
tar zxf confuse-2.7.tar.gz
cd confuse-2.7
./configure CFLAGS=-fPIC --disable-nls ;make;make install
cd /opt/
wget http://downloads.sourceforge.net/project/ganglia/ganglia%20monitoring%20core/3.3.1/ganglia-3.3.1.tar.gz
tar zxf ganglia-3.3.1.tar.gz
cd ganglia-3.3.1
./configure --prefix=/opt/modules/ganglia --with-static-modules --enable-gexec --enable-status --with-gmetad --with-python=/usr --with-librrd=/usr/local/rrdtool-1.3.1 --with-libexpat=/usr --with-libconfuse=/usr --with-libpcre=/usr
make; make install
cd gmetad
cp gmetad.conf /opt/modules/ganglia/etc/
cp gmetad.init /etc/init.d/gmetad
sed -i "s/^GMETAD=\/usr\/sbin\/gmetad/GMETAD=\/opt\/modules\/ganglia\/sbin\/gmetad/g" /etc/init.d/gmetad
chkconfig --add gmetad
ip route add 239.2.11.71 dev eth0
service gmetad start
其中239.2.11.71是ganglia使用的多播工作通道,需要将其指向本地网卡上。上面使用了ip route命令进行路由指定。
ganglia使用一个web前端服务来展示监控信息。该服务是使用php编写的。因此需要配置php运行环境。
yum install httpd
yum install php
service httpd start
在/var/www/html/下面建立一个文件info.php,内容如下:
<?
phpinfo();
?>
在浏览器中输入http://your-domain.com/info.php,看看是否能正常工作。
如果看到以上内容,说明你的php环境已经正常工作了。
将/opt/ganglia/web目录拷贝到/var/www/html目录下,然后在web目录下执行以下命令
cp conf_default.php.in conf_default.php
cp version.php.in version.php
使用vi编辑conf_default.php,按照以下内容修改相关设置
[root@ganglia ganglia]# diff conf_default.php conf_default.php.in
29,30c29,30
< $conf['gmetad_root'] = "/var/lib/ganglia/rrds";
< $conf['rrds'] = "/var/lib/ganglia/rrds";
---
> $conf['gmetad_root'] = "@varstatedir@/ganglia";
> $conf['rrds'] = "${conf['gmetad_root']}/rrds";
46c46
< $conf['rrdtool'] = "/usr/local/rrdtool/bin/rrdtool";
---
> $conf['rrdtool'] = "/usr/bin/rrdtool";
在浏览器中输入http://yourserver/ganglia,看是否有内容输出。
如果页面空白或者提示有php错误发生,请到/var/log/httpd/下面tail error_log,根据相关错误信息进行修改。
注意检查/var/lib/ganglia及以下目录是否存在,且这些目录的所有者要属于nobody:nobody用户,并且nobody拥有读写权限,这里我索性将目录权限设置为777。这里许多目录都是要自己手动创建,比如conf 、dwoo,只需根据错误提示修改即可。
如果报错There was an error collecting ganglia data (127.0.0.1:8652): fsockopen error: Connection refused,然后gmetad status显示gmetad 已死,但是 subsys 被锁,这需要改一下目录的权限 chown nobody:nobody /var/lib/ganglia/rrds即可解决。
客户端需要在多台机器上安装。将以下脚本分发到各个机器上分别执行安装就可以了。安装过程中注意观察是否有错误发生。
这是redhat安装方法
#!/bin/sh
yum install -y expat expat-devel pcre pcre-devel
wget http://mirror.bit.edu.cn/apache/apr/apr-1.4.6.tar.gz
tar zxf apr-1.4.6.tar.gz
cd apr-1.4.6
./configure;make;make install
cd ..
wget http://download.savannah.gnu.org/releases/confuse/confuse-2.7.tar.gz
tar zxf confuse-2.7.tar.gz
cd confuse-2.7
./configure CFLAGS=-fPIC --disable-nls ;make;make install
cd ..
wget http://downloads.sourceforge.net/project/ganglia/ganglia%20monitoring%20core/3.3.1/ganglia-3.3.1.tar.gz
tar zxf ganglia-3.3.1.tar.gz
cd ganglia-3.3.1
#server
#./configure --prefix=/opt/modules/ganglia --with-static-modules --enable-gexec --enable-status --with-gmetad --with-python=/usr --with-librrd=/opt/rrdtool-1.4.5 --with-libexpat=/usr --with-libconfuse=/usr/local --with-libpcre=/usr/local
#client
./configure --prefix=/opt/modules/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
make; make install
cd gmond
./gmond -t > /opt/modules/ganglia/etc/gmond.conf
cp gmond.init /etc/init.d/gmond
sed -i "s/^GMOND=\/usr\/sbin\/gmond/GMOND=\/opt\/modules\/ganglia\/sbin\/gmond/g" /etc/init.d/gmond
chkconfig --add gmond
ip route add 239.2.11.71 dev eth0
service gmond start
如果gmond服务正常启动则说明安装成功。
对于ubuntu。Ubuntu ganglia配置文件位于/etc/ganglia/gmond.conf
apt-get install ganglia-monitor
useradd ganglia -g ganglia
/etc/init.d/ganglia-monitor restart
ganglia默认使用多播方式传输数据,但也支持单播。多播要求所有机器都在一个网段内部,但有时要监控的机器位于不同的网段,这时候只能使用单播方式。
多播方式配置比较简单。
服务端配置文件 /opt/modules/ganglia/etc/gmetad.conf (注:gmeta daemon)
注:cluster_name一定要与要监控的配置中的cluster name相同。gmond_node1-n指的要监控的机器名
data_source "cluster_name" gmond_node1 gmond_node2 ... gmond_noden
说明:cluster_name是监控机群名称。可以配置多个,也就是分组。比如将zookeeper集群作为一个监控分组,hdfs集群作为一个分组,hbase作为一个分组(如果hbase和hdfs分别部署在不同的节点上)。ganglia默认使用端口8649,因此如果你只有一个集群的话,可以使用不写端口号;如果你是监控多个分组的话,就需要以gmond_node1:port的形式列出gmond客户端。例如
data_source "hdfs" localhost 192.168.0.101:8649
data_source "zookeeper" 210.51.44.102:8650
在多播方式下,所有的gmond节点通过多播的形式发送各自的数据,也就是每一个gmond节点上面都完整的存了一份所有gmond节点的监控数据,gmetad只需要向其中的一个gmond索取数据即可,这里gmetad首先到第一个查询,如果失败,查询第二个,以此类推。
监控客户端配置文件/opt/modules/ganglia/etc/gmond.conf (注:gmonitor daemon)
globals段:gmond的全局配置,一般不需要修改
cluster段:这一段是重要的一段,至少需要定义name变量,所有name相同的节点将认为在同一个集群(监控分组)里,其他变量是对该集群的说明。
host段:只有一个变量,location,是对这个节点的一些说明,一般不用修改。
udp_send_channel段:这也是很重要的一段,可以定义多个这样的段,不过如果在同一局域网内,只有一个集群的环境下,这一段保持默认也可以工作的很好。ganglia默认采用多播发送监控数据,mcast_join变量指定多播组。port 指定端口号,根据当前节点所在的分组,与gmetad.conf中的端口对应起来,ttl指定跳数一般为1,如果需要经过gmond中转,需要修改这个跳数。
udp_recv_channel段:对应于udp_send_channel段,也可以设置多个。
tcp_accept_channel段:指定一个端口,可以通过TCP的的方式,从这个端口读取XML格式的监控数据
总结一下,如果只是完成最简单的监控任务:整个配置文件只需要修改一个地方,就是cluster的name变量
如果监控的集群跨网段,就需要使用单播方式。单播其实就是所有的gmond节点指定一台机器来存储大家的监控数据。要使用单播方式,gmetad.conf不需要修改。只需要修改gmond.conf。
udp_send_channel段,使用host变量来指定接受数据的机器。值得注意的是,mcast_join和host不能同时出现在一个channel里。
udp_recv_channel段使用bind变量指出的ip,该ip必须所有其他gmond可以访问到。事实上,可以使用0.0.0.0。这里我发现直接将bind注释掉也可以正常工作。
多播方式:
单播方式:
前面已经简单介绍了分组的设置,其实就是根据端口好的不同来确定机器的不同分组。举例如下
如果是使用单播,参照以上所述修改配置即可。
最后附上一张监控图。
总体来说编译配置ganglia是比较复杂的。主要有两个地方:一是编译rrdtool,二是web环境配置。ganglia配置文件这里我耽误了不少时间,不过有了上面的解释,相信你会很容成功的。总之,事在人为,相信自己,不要放弃,你一定会成功的!
[参考资料]
Ganglia汇总监控搭建和配置详解 作者:easyhadoop 项磊
用ganglia监控集群
等等。。。。