Ganglia 部署与配置

  • 简介

ganglia是一个不错的用来监控集群的开源软件。依托于RRDTools,它可以方便的生成metrics graph,对metrics进行聚合等。ganglia自带的客户端可以搜集集群节点CPU,memory,network的负载。也可以方便的通过编程发送UDP包来将程序的metrics发给ganglia。

单独的metrics graph:


Ganglia 部署与配置_第1张图片
 

几个metrics聚合后的metrics graph:


Ganglia 部署与配置_第2张图片
 

本文包括对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下面:

cp -rf /usr/local/apr/include/apr-1/* /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的数据流向图如下:


Ganglia 部署与配置_第3张图片
 

 

(图片来自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的数量还会更多。

你可能感兴趣的:(ganglia,hadoop)