######################################################################################################

一、服务器分布

######################################################################################################

1、服务器角色

服务器角色

172.24.18.65

172.18.35.29

(namenode1)

172.18.35.30

(namenode2)

172.18.34.232

(datanode1)

172.18.24.136

(datanode2)

NameNode

NO

YES

YES

NO

NO

DataNode

NO

NO

NO

YES

YES

Gmetad

YES

NO

NO

NO

NO

Gmond

NO

YES

YES

YES

YES

Ganglia-web

YES

NO

NO

NO

NO


2Ganglia总体架构

wKioL1MV9EGS37itAAH9Gcl8EpQ513.jpg


3、系统环境

CentOS 6.2 x86_64


######################################################################################################

二、Ganglia分布式监控系统简介

######################################################################################################

1、简介

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


(1)Gmond组件

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


(2)Gmetad组件

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


(3)Ganglia-Web组件

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


=========================================================================================

2、工作原理

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


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

wKiom1MV9JGDSgHAAAEPvjTFZ2c115.jpg


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


下面重点介绍下unicast模式下ganglia系统内的数据流。

wKiom1MV9KjBgYghAAEd9vXRVrM462.jpg

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


=========================================================================================

3、自定义metrics

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


更多python模块,可以参考:

https://github.com/ganglia/gmond_python_modules


=========================================================================================

4、单播与组播

在进行Ganglia集群配置之前,首先要搞清楚单播和组播。

单播:可以跨网段传播,只将信息发送给指定的机器。要配置成为单播你应该指定一个(或者多个)接受的主机。

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


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


【注意】

以上文字内容皆为收集与总结而来。


######################################################################################################

三、基础环境部署

######################################################################################################

1、基础组件编译安装【所有节点】

http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz

# tar xvzf Python-2.7.6.tgz

# cd Python-2.7.6

# ./configure --prefix=/usr/local --enable-shared

# make && make install


-----------------------------------------------------------------------------------------------------------------------------------------------

http://nchc.dl.sourceforge.net/project/pcre/pcre/8.32/pcre-8.32.tar.gz

# tar xvzf pcre-8.32.tar.gz

# cd pcre-8.32

# ./configure --prefix=/usr/local

# make && make install


-----------------------------------------------------------------------------------------------------------------------------------------------

http://savannah.nongnu.org/download/confuse/confuse-2.7.tar.gz

# tar xvzf confuse-2.7.tar.gz

# cd confuse-2.7

# CFLAGS=-fPIC ./configure --prefix=/usr/local --disable-nls

# make CFLAGS=-fPIC

# make CFLAGS=-fPIC install


-----------------------------------------------------------------------------------------------------------------------------------------------

http://nchc.dl.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz

# tar -xvzf expat-2.1.0.tar.gz

# cd expat-2.1.0

# ./configure --prefix=/usr/local

# make && make install


-----------------------------------------------------------------------------------------------------------------------------------------------

http://zlib.net/zlib-1.2.8.tar.gz

# tar xvzf zlib-1.2.8.tar.gz

# cd zlib-1.2.8

# CFLAGS=-fPIC ./configure --prefix=/usr/local

# make CFLAGS=-fPIC

# make CFLAGS=-fPIC install


ftp://xmlsoft.org/libxml2/libxml2-2.7.8.tar.gz

# tar xvzf libxml2-2.7.8.tar.gz

# cd libxml2-2.7.8

# ./configure --prefix=/usr/local --with-zlib=/usr/local

# make && make install


-----------------------------------------------------------------------------------------------------------------------------------------------

# yum -y install *glib* dejavu*


http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.8.tar.gz

# tar xvzf rrdtool-1.4.8.tar.gz

# cd rrdtool-1.4.8

# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

# ./configure --prefix=/usr/local

# make && make install


-----------------------------------------------------------------------------------------------------------------------------------------------

http://mirrors.cnnic.cn/apache//apr/apr-1.5.0.tar.gz

# tar xvzf apr-1.5.0.tar.gz

# cd apr-1.5.0

# ./configure --prefix=/usr/local

# make && make install


http://mirrors.cnnic.cn/apache//apr/apr-util-1.5.3.tar.gz

# tar xvzf apr-util-1.5.3.tar.gz

# cd apr-util-1.5.3

# ./configure --prefix=/usr/local --with-apr=/usr/local

# make && make install


# cp -a /usr/local/include/apr-1/*/usr/local/include/


-----------------------------------------------------------------------------------------------------------------------------------------------

http://cznic.dl.sourceforge.net/project/ganglia/ganglia%20monitoring%20core/3.6.0/ganglia-3.6.0.tar.gz

# tar xvzf ganglia-3.6.0.tar.gz

# cd ganglia-3.6.0

# ./configure --prefix=/usr/local/ganglia \

--with-gmetad \

--sysconfdir=/etc/ganglia \

--enable-gexec \

--with-libconfuse=/usr/local \

--with-libexpat=/usr/local \

--with-python=/usr/local \

--with-librrd=/usr/local \

--with-libapr=/usr/local


# make && make install


=========================================================================================

2Gmetad节点配置【172.24.18.65

# cp -a gmetad/gmetad.init /etc/init.d/gmetad

# chkconfig --add gmetad

# chkconfig --level 345 gmetad on


# ln -s /usr/local/ganglia/sbin/gmetad /usr/sbin/gmetad


# mkdir -p /data/ganglia/rrds

# chown nobody:nogroup /data/ganglia/rrds


# vim /etc/ganglia/gmetad.conf

data_source"hadoop_namenode" 10 172.18.35.29:8649 172.18.35.30:8649

data_source"hadoop_datanode" 10 172.18.34.232:8650 172.18.24.136:8650

setuid_username"nobody"

rrd_rootdir"/data/ganglia/rrds"

gridname"hadoop_cluster"


# service gmetad start


=========================================================================================

3Gmond节点配置【172.18.35.29172.18.35.30

# cp -a gmond/gmond.init /etc/init.d/gmond

# chkconfig --add gmond

# chkconfig --level 345 gmond on


# ln -s /usr/local/ganglia/sbin/gmond /usr/sbin/gmond

# gmond -t | tee /etc/ganglia/gmond.conf


# vim /etc/ganglia/gmond.conf

globals {

      ......

      send_metadata_interval = 15

}


cluster {

      name = "hadoop_namenode"

      owner = "nobody"

      ......

}


udp_send_channel {

      ......

      #mcast_join = 239.2.11.71

      host = 172.18.35.29

      port = 8649

      ......

}


udp_recv_channel {

      #mcast_join = 239.2.11.71

      port = 8649

      #bind = 239.2.11.71

      #retry_bind = true

      ......

}


tcp_accept_channel {

     port= 8649

      ……

}


# service gmond start


=========================================================================================

4Gmond节点配置【172.18.34.232172.18.24.136

# cp -a gmond/gmond.init /etc/init.d/gmond

# chkconfig --add gmond

# chkconfig --level 345 gmond on


# ln -s /usr/local/ganglia/sbin/gmond /usr/sbin/gmond

# gmond -t | tee /etc/ganglia/gmond.conf


# vim /etc/ganglia/gmond.conf

globals {

      ......

      send_metadata_interval = 15

}


cluster {

      name = "hadoop_datanode"

      owner = "nobody"

      ......

}


udp_send_channel {

      ......

      #mcast_join = 239.2.11.71

      host = 172.18.34.232

      port = 8650

      ......

}


udp_recv_channel {

      #mcast_join = 239.2.11.71

      port = 8650

      #bind = 239.2.11.71

      #retry_bind = true

      ......

}


tcp_accept_channel {

     port= 8650

      ……

}


=========================================================================================

5Hadoop集群监控参数设置

NameNodeDataNode节点上:

# vim /usr/local/hadoop/etc/hadoop/hadoop-metrics2.properties

*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31

*.sink.ganglia.period=10


*.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both

*.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40


namenode.sink.ganglia.servers=namenode1:8649

resourcemanager.sink.ganglia.servers=namenode1:8649


datanode.sink.ganglia.servers=datanode1:8650

nodemanager.sink.ganglia.servers=datanode1:8650


maptask.sink.ganglia.servers=namenode1:8649

reducetask.sink.ganglia.servers=namenode1:8649


在主NameNode节点上执行:

# cd /usr/local/hadoop && sbin/stop-dfs.sh

# cd /usr/local/hadoop && sbin/start-dfs.sh


# cd /usr/local/hadoop && sbin/stop-yarn.sh

# cd /usr/local/hadoop && sbin/start-yarn.sh


在所有Gmond节点上执行:

# service gmond restart


=========================================================================================

6、简单测试

# telnet 172.24.18.65 8652

wKiom1MV9QfCcjfXAADDgzixUyo349.jpg


# telnet 172.18.35.29 8649

wKiom1MV9SqTdNXUAAH68NDocqU731.jpg


# telnet 172.18.34.232 8650

wKioL1MV9S2DdQgxAAJKmf7qEGw387.jpg


检查NameNodeDataNode节点上的gmond进程,如果出现XML信息就OK了。


######################################################################################################

四、Ganglia-web配置

######################################################################################################

1LAMP环境部署

可以参考其他内容,在此略过。


=========================================================================================

2Ganglia-web环境部署

http://cznic.dl.sourceforge.net/project/ganglia/ganglia-web/3.5.12/ganglia-web-3.5.12.tar.gz

# tar xvzf ganglia-web-3.5.12.tar.gz -C /data/web/data

# chmod -R 755 /data/web/data


# cd /data/web/data

# mv ganglia-web-3.5.12 ganglia-web


# mkdir -p /data/web/data/ganglia-web/dwoo/{compiled,cache}

# chmod 777 /data/web/data/ganglia-web/dwoo/{compiled,cache}

# chown -R nobody:nogroup /data/web/data


=========================================================================================

3Ganglia-web配置

# cd /data/web/data/ganglia-web

# cp conf_default.php conf.php

# vim conf.php

$conf['gweb_root'] ="/data/web/data/ganglia-web";

$conf['gweb_confdir'] ="/data/web/data/ganglia-web";


$conf['gmetad_root'] ="/data/ganglia";

$conf['rrdtool'] ="/usr/local/bin/rrdtool";


$conf['external_location'] =http://localhost/ganglia;

$conf['case_sensitive_hostnames'] =false;


# vim /data/web/conf/ganglia-web.conf

<VirtualHost *:80>

     ServerAdmin rocketzhang@qq.com

     DocumentRoot /data/web/data/ganglia-web

     ServerName 172.24.18.65

     DirectoryIndex index.php

     AddDefaultCharset UTF-8


    <Directory />

          AllowOverride ALL

    </Directory>

</VirtualHost>


# service httpd restart


=========================================================================================

4、效果展示

wKioL1MV9Uzi8iQVAAbJEQBy5Gk680.jpg



wKioL1MV9WWyI_2JAANmBREQAd0376.jpg