-
简介
ganglia是一个不错的用来监控集群的开源软件。依托于RRDTools,它可以方便的生成metrics graph,对metrics进行聚合等。ganglia自带的客户端可以搜集集群节点CPU,memory,network的负载。也可以方便的通过编程发送UDP包来将程序的metrics发给ganglia。
单独的metrics graph:
几个metrics聚合后的metrics graph:
本文包括对ganglia以及ganglia依赖的安装和配置。包括加ganglia的高级配置,包括multi datasource,rrd cache等。
安装和基础配置
版本和依赖
yum中的版本比较老旧。ganglia的以来可以选择手动安装。ganglia安装阶段依赖的所有软件以及版本如下:
apr-1.5.0.tar.gz
apr-util-1.5.3.tar.gz
confuse-2.7.tar.gz
expat-2.1.0.tar.gz
rrdtool-1.4.8.tar.gz
ganglia-3.6.0.tar.gz
ganglia-web-3.5.10.tar.gz
安装ganglia的依赖以及ganglia
所有自己编译的软件,本文都选择安装在路径/usr/local/下
安装expat
expat用来解析xml。ganglia使用xml格式交互数据。解压expat,进入源码目录执行
./configure --prefix=/usr/local/expat
make
make install
对于64位操作系统,需要手动的拷贝下动态链接库到lib64下
cp -rf /usr/local/expat/lib /usr/local/expat/lib64
安装apr
解压apr,在源码目录下执行以下命令:
./configure --prefix=/usr/local/apr
make
make install
解压apr-util,在源码目录执行以下命令:
./configure --with-apr=/usr/local/apr --with-expat=/usr/local/expat
make
make install
然后也为64位系统拷贝lib:
cp -rf /usr/local/apr/lib /usr/local/apr/lib64
apr还需要将头文件拷贝到/usr/local/apr/include下面:
安装confuse
confuse用来解析配置文件。解压并在源文件目录执行
./configure CFLAGS=-fPIC --disable-nls --prefix=/usr/local/confuse
make
make install
然后拷贝lib
cp -rf /usr/local/confuse/lib /usr/local/confuse/lib64
安装rrdtools
这个是ganglia最重要的依赖。ganglia用rrdtools操作rrd数据库。
解压rrdtools并执行
./configure --prefix=/usr/local/rrdtool
make
make install
然后软链到/usr/bin下方便使用:
sudo ln -s /usr/local/rrdtool/bin/rrdtool /usr/bin/rrdtool
安装web端软件和依赖
ganglia使用php做前端,同时用apache提供http服务。安装php和apache可以使用yum:
sudo yum install php-common php-cli php php-gd httpd
sudo yum install httpd-devel openssl openssl-devel pcre-devel libxml2-devel bzip2-devel curl-devel gmp-devel aspell-devel
php版本
ganglia需要php版本5.2x以上。如果yum安装的版本过低,需要自己编译安装。一个编译的config参考如下:
./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --target=x86_64-redhat-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --cache-file=../config.cache --with-libdir=lib64 --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --disable-debug --with-pic --disable-rpath --without-pear --with-bz2 --with-curl --with-exec-dir=/usr/bin --with-freetype-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --without-gdbm --with-gettext --with-gmp --with-iconv --with-jpeg-dir=/usr --with-openssl --with-png --with-pspell --with-expat-dir=/usr --with-pcre-regex=/usr --with-zlib --with-layout=GNU --enable-exif --enable-ftp --enable-magic-quotes --enable-sockets --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-track-vars --enable-trans-sid --enable-yp --enable-wddx --with-kerberos --enable-ucd-snmp-hack --with-unixODBC=shared,/usr --enable-memory-limit --enable-shmop --enable-calendar --enable-dbx --enable-dio --with-mime-magic=/usr/share/file/magic.mime --without-sqlite --with-libxml-dir=/usr --with-xml --with-system-tzdata --with-apxs2=/usr/sbin/apxs --without-mysql --without-gd --without-odbc --disable-dom --disable-dba --without-unixODBC --disable-pdo --disable-xmlreader --disable-xmlwriter
如果安装过程出现依赖缺失就安装,可以参考
http://lyp.cn/350_how-to-fix-php-compile-errors
编译ganglia
下面开始编译ganglia
解压ganglia,进入源码执行以下命令:
./configure --prefix=/usr/local/ganglia --with-librrd=/usr/local/rrdtool --with-libapr=/usr/local/apr --with-libexpat=/usr/local/expat --with-libconfuse=/usr/local/confuse --with-gmetad --enable-gexec --enable-status --sysconfdir=/etc/ganglia
命令主要指定了我们安装的依赖的位置已经ganglia的安装位置(/usr/local/ganglia),ganglia配置文件的位置(/etc/ganglia)。ganglia默认安装只会安装gmond,既单个的agent。需要gmetad则需要添加 --with-gmetad。 如果没有pcre,就添加--with-libpcre=no。
configure如果过了就可以执行make && make install完成安装。
ganglia安装的后续步骤
为了注册gmond和gmetad为service,为了让gmond和gmeta使用更方便,先进入ganglia源码目录,执行:
cp -f gmond/gmond.init /etc/init.d/gmond
cp -f /usr/local/ganglia/sbin/gmond /usr/sbin/gmond
cp -f gmetad/gmetad.init /etc/init.d/gmetad
cp -f /usr/local/ganglia/sbin/gmetad /usr/sbin/gmetad
chkconfig --add gmetad
chkconfig --add gmond
配置ganglia
ganglia系统中分三个角色,gmond,gmeta,ganglia-web。启动顺序也应该是这样。gmond接收外部数据,等待gmetad搜集。gmetad搜集了gmond的数据后,写入rrd数据库,供ganglia-web使用。所以配置我们也是按照这个顺序来。
配置gmond(ganglia agent)
gmond的配置是最复杂的。gmond可以生成一个默认的配置:
gmond -t > /etc/ganglia/gmond.conf
然后修改/etc/ganglia/gmond.conf,一些需要注意的配置如下:
global部分
globals {
daemonize = yes
setuid = yes
user = nobody // 这个可以不用修改
debug_level = 0 // 如果有问题,可以尝试将这个值修改到10看启动的信息
.........
}
cluster部分
cluster {
name = "hdfs-cluster-test-source" //这个值需要记住,一般需要修改成一个和自己集群符合的名字。这个值对应到gmeta配置中的datasource名字,也就是说,gmetad会根据自己的datasource配置收割数据,当且仅当gmond的这个值和gmetad中的ds配置的名字相同时,gmetad才会要这个数据
owner = "apache" // 所有者,最好跟gmetad中的setuid一样吧,我们的环境都是apache。注意这个跟global中的setuid和user不用一样。那个只是gmond进程的。
latlong = "unspecified"
url = "unspecified"
}
host部分
host {
location = "hadoop-test-fuquan" // 显示,没有什么映射关系。可以起一个描述机器位置的信息
}
udp send 部分
/* Feel free to specify as many udp_send_channels as you like. Gmond
used to only support having a single channel */
udp_send_channel {
#bind_hostname = yes # Highly recommended, soon to be default.
# This option tells gmond to use a source address
# that resolves to the machine's hostname. Without
# this, the metrics may appear to come from any
# interface and the DNS names associated with
# those IPs will be used to create the RRDs.
# mcast_join = 239.2.11.71 // 注释掉,我们不用mcast
host = 192.168.81.176 // 增加这个,我们就是定点发,定点收。
port = 8649
ttl = 1
}
后面的内容是ganglia一些默认的系统监控配置,可以先不用动。
拷贝分发gmond
都配置完毕后,可以将gmond拷贝分发到所有节点上。
拷贝所有上文中涉及的自己编译出来的软件,配置文件,链接等到所有目标机器。分发完后执行sudo service gmond start启动
trouble shooting
如果发现service gmond start有问题,启动失败。可以尝试修改gmond.conf中的debug_level = 10,然后启动看具体的出错信息。
可以通过nc 127.0.0.1 8649查看gmond搜集的metrics数据,格式为xml
配置gmetad(ganglia server)
gmetad的配置相对简单一些。
创建rrd数据库文件夹
首先gmetad的任务就是搜集gmond的数据并写入rrd数据库。所以首先需要创建出来rrd数据的目录。这个目录默认位置是/var/lib/ganglia/rrds。这个位置可以在gmetad的配置文件中修改。现在先按照默认的来
mkdir -p /var/lib/ganglia/rrds
chown apache:apache /var/lib/ganglia/rrds
这里需要将文件夹目录所有者修改为apache。因为这些文件以后是要供apache server内的ganglia-web使用的。
修改gmetad配置文件
gmetad的配置文件在编译安装的时候就给放好了,位置在/etc/ganglia/gmetad.conf。
data source 配置
首先找到data_source这个配置。和上文配置gmond说的一样,这个配置是最重要的,gmetad的data_source要和gmond的cluster的name匹配起来。后面的就是端口号+机器名。端口号可以省略,机器名就是gmond的机器名。(如果跟着多个机器名,gmetad会随便选一个取数据。这个是针对mcast的配置,我们disable了这个配置,就没得配置了。这个原理是,如果mcast,那么多台机器上的多个gmond的数据是一样的,相当于一个冗余。如果一个挂了,gmetad还能找别的)
data_source "hdfs-cluster-test-source" SVR2368HP360
gridname 配置
gridname是在多级环境下区分grid的好办法,现在我们还没这么复杂,就直接gridname "hadoop-test"。如果我们现在有多个grid,每个grid有一个gmetad,然后这三个gmetad又汇聚数据到顶级的gmetad,那么下面三个gmetad的gridname就要好好配置一下,能更清晰的区分不同的grid
setuid_username
setuid_username "apache",这个是我们之前说过的一个配置。gmetad将以apache的用户名启动。这样rrd数据库文件夹也是apache,可以保证对数据的读写没问题。
case_sensitive_hostnames
gmetad的这个配置需要跟下面介绍的ganglia-web的case_sensitive_hostnames配置的值相同($conf['case_sensitive_hostnames'] = false;)。但是默认值两者不匹配,既gmetad的默认值是false,ganglia-web的默认值是1。根据最新的默认值,我们设置它weifalse。所以要记得修改ganglia-web中的case_sensitive_hostnames
trouble shooting
同样也有debug_level可以设置。启动后如果没有问题,在/var/lib/ganglia/rrds/下面会生成俩文件夹,一个叫做hdfs-cluster-test-source,一个叫做__SummaryInfo__。里面会有各个metrics的名字的文件。
同时执行nc 127.0.0.1 8651,可以看到xml格式的metrics输出。
安装配置ganglia-web
解压进入源文件目录,安装配置可以查看MakeFile。包含的安装目录(/var/www/html/ganglia),rrds目录,apache user等。没问题就直接make install就好了。
安装好后,查看/var/www/html/ganglia/conf_default.php里的$conf['rrdtool']是不是指向了正确的位置。
同时记得修改$conf['case_sensitive_hostnames'] = false;
启动之后没问题就可以直接sudo service httpd start
trouble shooting
如果有问题可以查看/var/log/httpd/error_log,/var/log/message
Ganglia 高级配置
rrdcached和ganglia的整合配置
rrdcached可以大幅减少对rrd数据的io。没有rrdcached时,每个metric对于rrdtool来说都要打开文件,写入数据,关闭文件。在集群大的时候,会造成很大的io压力。rrdcached就是用来解决这个问题的。
安装rrdcached
首先,安装好rrdtool1.4.x之后,就已经有了rrdcached了。执行下面的操作将rrdcached安装为服务
cp -f /root/rrdtool-1.4.8/etc/rrdcached-init /etc/init.d/rrdcached
cp -f /root/rrdtool-1.4.8/etc/rrdcached-default /etc/default/rrdcached
cp -f /usr/local/rrdtool/bin/rrdcached /usr/sbin/
chkconfig --add rrdcached
然后对rrdcached进行配置,修改 /etc/default/rrdcached:
RUN_RRDCACHED=1
RRDCACHED_USER="apache"
OPTS="-s apache -m 640 -b /var/lib/ganglia/rrds/ -B -w 300 -z 300 -f 3600"
PIDFILE="/var/run/rrdcached/rrdcached.pid"
SOCKFILE="/tmp/rrdcached.socket"
SOCKPERMS=0640
具体rrdcached的参数可以参考文章http://linux.die.net/man/1/rrdcached。
配置好后就可以执行service rrdcached start启动rrdcached了。
配置gmetad
修改/etc/init.d/gmetad,找到
export RRDCACHED_ADDRESS=unix:/tmp/rrdcached.socket
这个变量的值就是rrdcached对应的socket文件,也就是上面对rrdcached进行的配置中指定的sockfile的值。下面ganglia-web的也是一样的。
配置ganglia-web
修改/var/www/html/ganglia/conf_default.php:
$conf['rrdcached_socket'] = "unix:/tmp/rrdcached.socket";
配置好后,一定要注意启动顺序。rrdcached一定要在gmetad和ganglia-web之前。
trouble shooting
如果gmetad写入数据有问题,调整gmetad的debug。如果ganglia-web有问题,查看/var/log/message。这段配置也参考了http://sourceforge.net/apps/trac/ganglia/wiki/rrdcached_integration
多datasource配置
ganglia数据流向简介
ganglia的数据流向图如下:
(图片来自http://www.slideshare.net/schubertzhang/ganglia-13626483#btnNext,这个ppt也不错)
简单来说就是,gmond之间的数据是通过UDP分发的。gmond有ismute和isdeaf的配置。默认都是false。这种情况下,每个节点都拥有集群所有gmond传来的数据。gmond之间可以UDP广播,也可以循环一个个发。这个也是在设置里做的。
然后gmetad会定期从datasource的配置中指定的gmond拉数据,这个是走TCP端口的。gmeta也可以有层次关系。这个我们现在没有用到。
gmetad会把数据落地到rrd数据库(也可能是rrdcached)。最后由ganglia-web通过rrdtool(或者rrdcached)读取。
多datasource配置
只要理解了ganglia的数据流向,多datasource配置其实很简单。每个gmond都可以作为一个gmetad中的datasource。展示的结构就是cluster/datasource/node。
外部发送端配置
我们现在的多datasource主要是为了区分不同的组件的metrics,比如说,hdfs,hbase,系统这三个不同的perspective,我们想放在不同的datasource的视图中查看。比如176负责搜集hdfs的,177负责搜集hbase的等。那么hdfs和hbase的配置大致就应该是这样:
hdfs的hadoop-metrics2.properties:
namenode.sink.ganglia.servers=192.168.81.176:8649
datanode.sink.ganglia.servers=192.168.81.176:8649
nodemanager.sink.ganglia.servers=192.168.81.176:8649
resourcemanager.sink.ganglia.servers=192.168.81.176:8649
hbase的hadoop-metrics.properties:
*.servers=SVR2369HP360:8649
配置好之后需要重启相应服务,如果修改的是hdfs, mapred需要重启hadoop服务,如果是hbase需要重启hbase。
gmond配置
然后是gmond的配置。对于只搜集本机系统metic,然后发给别的gmond,但是不被gmetad认为是datasource的gmond,可以将其global中的deaf设置为true。
因为hbase和hdfs跑在同一个机器上,共享同一个gmond。虽然hbase和hdfs本身的metrics分开展示,但是对于系统的metrics,还是需要hbase和hdfs都有才好。这样就需要在每个gmond上配置多个udp_send_channel。每个udp_send_channel可以用来负责一个方面。
udp_send_channel {
#bind_hostname = yes # Highly recommended, soon to be default.
# This option tells gmond to use a source address
# that resolves to the machine's hostname. Without
# this, the metrics may appear to come from any
# interface and the DNS names associated with
# those IPs will be used to create the RRDs.
# mcast_join = 239.2.11.71
host = 192.168.81.176
port = 8649
ttl = 1
}
udp_send_channel {
#bind_hostname = yes # Highly recommended, soon to be default.
# This option tells gmond to use a source address
# that resolves to the machine's hostname. Without
# this, the metrics may appear to come from any
# interface and the DNS names associated with
# those IPs will be used to create the RRDs.
# mcast_join = 239.2.11.71
host = 192.168.81.177
port = 8649
ttl = 1
}
这样配置好之后,gmond就会将自己搜集的本机的系统metric发送到每个udp_send_channel上。
gmetad配置
最后就是gmetad的配置,这个最简单,只要增加如下配置就好了
data_source "hdfs-cluster-test-source" SVR2368HP360
data_source "hbase-cluster-test-source" SVR2369HP360
这两个配置就是两个不同的datasource,gmetad会定期去这俩datasource配置的机器上拉数据(现在我们只配了一个机器,可以配置多个,这样如果有一个down了,gmetad会去另外的机器拉数据,注意gmetad不会同时去多个gmond上拉数据)
Touble Shooting
gmetad和gmond开debug,这个就不再多说了。
还有一个问题是,在这种情况下,cluster的状态是不准的。以test环境为例,cluster的状态显示的cpu个数是实际个数的两倍,因为其实我们的两个datasource是相同的机器,而不是不同的机器,ganglia把两个datasource的cpu数量加起来,就翻倍了。如果再配置更多的datasource,cpu的数量还会更多。