Ganglia是UC Berkeley发起的一个开源集群监视项目,设计用于测量数以千计的节点。Ganglia的核心包含gmond、gmetad以及一个Web前端。主要是用来监控系统性能,如:cpu 、mem、硬盘利用率, I/O负载、网络流量状况等,经过曲线很容易见到每一个节点的工做状态,对合理调整、分配系统资源,提升系统总体性能起到重要做用。php
每台计算机都运行一个收集和发送度量数据的名为 gmond 的守护进程。接收全部度量数据的主机能够显示这些数据而且能够将这些数据的精简表单传递到层次结构中。正由于有这种层次结构模式,才使得 Ganglia 能够实现良好的扩展。gmond 带来的系统负载很是少,这使得它成为在集群中各台计算机上运行的一段代码,而不会影响用户性能。全部这些数据屡次收集会影响节点性能。网络中的 “抖动”发生在大量小消息同时出现时,能够经过将节点时钟保持一致,来避免这个问题。html
gmetad能够部署在集群内任一台节点或者经过网络链接到集群的独立主机,它经过单播路由的方式与gmond通讯,收集区域内节点的状态信息,并以XML数据的形式,保存在数据库中。由RRDTool工具处理数据,并生成相应的的图形显示,以Web方式直观的提供给客户端。前端
ganglia又依赖于一个web服务器用来显示集群状态,用rrdtool来存储数据和生成曲线图,须要xml解析所以须要expat,配置文件解析须要libconfuse。安装apche的httpd还须要支持php4以上,同时还有一些依赖软件。node
采用源码编译安装,从http://ganglia.info网站下载最新版的ganglia,下载后解压。python
1 ./configure --with-librrd=/rrd/path --with-gmetad 2 --prefix=/usr/local/ganglia 3 make
4 make install
若是中间出现依赖软件问题,则须要安装缺乏的那个软件包。安装完毕后,须要进行配置,其配置文件通常放在/etc/ganglia目录下,名称为gmetad.conf。固然对于路径并无严格要求,由于gmetad能够在启动时指定所用的配置文件。mysql
安装ganglia后,还须要安装apache服务器,同时须要有php模块支持,不然最终的显示页面没法正常显示。推荐采用yum install –y httpd phplinux
不然若是没有配置正确,则有可能apache不能和php正确关联。web
安装完毕后能够输入http://localhost/test.php,编一个php页面测试下是否成功安装。sql
若是采用源码安装,根据前面的--prefix,ganglia会被安装到/usr/local/ganglia目录下。数据库
首先建一个目录,该目录用来存放ganglia的web页面
mkdir -p /var/www/html/ganglia/
该目录用来存放后面用来显示数据的web页面。
因为采用源码编译的,并无将gmetad和gmond加为服务,执行如下命令。
1 cp gmetad/gmetad.Init /etc/rc.d/Init.d/gmetad#拷贝gmetad服务启动脚本 2 cp gmond/gmond.Init /etc/rc.d/Init.d/gmond #拷贝gmond服务启动脚本 3 mkdir /etc/ganglia #建立配置文件主目录 4 gmond -t | tee /etc/ganglia/gmond.conf #生成gmond服务配置文件 5 cp gmetad/gmetad.conf /etc/ganglia/ #拷贝gmetad服务配置文件 6 mkdir -p /var/lib/ganglia/rrds #建立rrd文件存放目录 7 chown nobody:nobody /var/lib/ganglia/rrds #属主和属组都为nobody 8 chkconfig --add gmetad #将服务交给chkconfig管理 9 chkconfig --add gmond #同上
修改配置文件/etc/gmetad.conf一般只须要修改以下的参数:
data_source "Clustername" host1 host2
将集群名称改成你本身的,host1 host2是gmetad用来获得集群信息的xml文件的数据源,若是没有写端口,则采用默认的8649端口,gmetad默认每隔15秒经过tcp链接去该主机下载xml文件。因此他们能够是gmond的8649端口,也能够是gmetad的8651端口,它们均可以提供集群信息的xml格式的数据下载。
host1 host2是or的关系,若是host1没法下载,则才会尝试去host2下载,因此它们应该都是同一个集群的节点,保存着一样的数据。采用multicast模式时,每台gmond节点都有本cluster内节点机器的全部监控数据,所以不须要把全部节点写入data_source中。建议写入不低于2个,在host1节点死机的时候,会自动找host2节点取数据。
此外gmetad还有以下的属性设置:
RRD database storage defInition
RRAs "RRA:AVERAGE:0.5:1:244" "RRA:AVERAGE:0.5:24:244" "RRA:AVERAGE:0.5:168:244" "RRA:AVERAGE:0.5:672:244" "RRA:AVERAGE:0.5:5760:374"
RRD files location
访问控制Access control
trusted_hosts address1 address2 … DN1 DN2 …
all_trusted OFF/on
rrd保存数据的目录
1 rrd_rootdir "/var/lib/ganglia/rrds" 2 3 Network 4 5 xml_port 8651 #能够telnet到该端口,获得gmetad的xml文件 6 7 interactive_port 8652 #php页面数据交互使用的端口
须要到/var/www/html/ganglia/目录下查找
php.conf
1 gmetad_root = "/var/lib/ganglia"; #gmetad写入的rrd数据库的路径 2 rrds = "$gmetad_root/rrds"; 3 ganglia_ip = "localhost"; #gmetad服务器的地址 4 ganglia_port = 8652; #gmetad服务器的交互式提供监控数据端口
默认状况下,web前端每300秒(5分钟)刷新一次,能够修改刷新间隔时间,经过修改config.php文件实现,它里面包括有全部的Ganglia Web参数。
vi /etc/ganglia/gmond.conf
主要是三个地方须要修改,cluster name,udp_send_channel,udp_recv_channel。注意单播与多播模式的区别,在多播模式下,加入该多播组的节点都会收到组内全部其余节点的数据,因此每一个至关于一个备份。单播模式下,只是点到点的发送数据,数据只会发向特定的那个host,这种模式下一般具备一个中央收集节点。
1 cluster { 2
3 name = "Cluster1" #本节点属于哪一个cluster 4
5 owner = "chifeng" #谁是该节点的全部者 6
7 latlong = "unspecified" #在地球上的坐标,经度、纬度? 8
9 url = "unspecified"
10
11 } 12
13 udp_send_channel { #udp包的发送通道 14
15 mcast_join = 239.2.11.71 #多播,工做在239.2.11.71通道下。若是使用单播模式,则要写host = host1(接受数据的目标主机),单播模式下也能够配置多个udp_send_channel 16
17 port = 8649 #监听端口 18
19 ttl = 1
20
21 } 22
23 udp_recv_channel { #接收udp包配置 24
25 mcast_join = 239.2.11.71 #一样工做在239.2.11.71通道下,若是使用单播模式,则要写host = localip,就是必须是本机的ip 26
27 port = 8649 #监听端口 28
29 bind = 239.2.11.71 #绑定 30
31 } 32
33 tcp_accept_channel { 34
35 port = 8649 #经过tcp协议监听的端口,远端能够经过连接8649端口获得监控数据,gmetad就是经过该端口获得xml数据 36
37 }
还有其余的一些配置项,一般状况下不须要修改,其含义以下:
Collection_group section: collect_once – Specifies that the group of static metrics collect_every – Collection interval (only valid for non-static) time_threshold – Max data send interval Metric section: Name – Metric name (see “gmond –m”) Value_threshold – Metric variance threshold (send if exceeded)
实例以下:
1 collection_group { 2 collect_every = 80
3 time_threshold = 950
4 metric { 5 name = "proc_run"
6 value_threshold = "1.0"
7 } 8 metric { 9 name = "proc_total"
10 value_threshold = "1.0"
11 } 12 }
说明:命令集合,是指我在安装配置时所使用的那些命令行命令,这些能够做为自动化部署脚步的一个基础。后面能够考虑编写自动化部署的脚步。
服务端:
安装expat-2.0.1.tar.gz
1 tar xvzf expat-2.0.1.tar.gz 2 cd expat*;./configure --prefix=/usr/local/apr 3 make
4 make install
安装confuse-2.6
1 ./configure --prefix=/usr/local/confuse-2.6 CFLAGS=-fPIC --disable-nls 2 make
3 make install
安装apr
1 tar xvjf apr-1.3.2.tar.bz2 2 cd apr-1.3.2
3 ./configure --prefix=/usr/local/apr 4 make
5 make install
安装apr-util-1.3.2.tar.bz2
1 tar xvjf apr-util-1.3.2.tar.bz2 2 cd apr-util-1.3.2
3 ./configure --with-apr=/usr/local/apr --with-expat=/usr/local/expat 4 make
5 make install
6 cp /usr/local/apr-1.3.2/include/apr-1/* /usr/local/apr-1.3.2/include/目录 #由于ganglia安装时默认会去/usr/local/apr/include下寻找apr的库文件。
安装rrdtool-1.2.27.tar.gz
1 tar xvzf rrdtool-1.2.27.tar.gz 2 cd rrdtool-1.2.27
3 ./configure --prefix=/usr/local/rrdtool 4 make
5 make install
6 cp /usr/local/apr/bin/apr-1* /usr/local/bin/ #拷过这个后 OK不然会编译出问题
报错以下:
Checking for apr
checking for apr-1-config... no
configure: error: apr-1-config binary not found in pat
安装ganglia
1 ./configure --with-librrd=/opt/rrdtool-1.4.4 --with-gmetad --prefix=/usr/local/ganglia --with-libconfuse=/usr/local/confuse-2.6
2 make
3 make install
安装apache服务器和php支持
1 yum -y install httpd mysqld php-mysql php
客户端:
1 wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libconfuse-2.5-4.el5.x86_64.rpm
2 wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libconfuse
3 devel-2.5-4.el5.x86_64.rpm 4 scp apr-*.* 10.250.13.45:~/
5 scp libconfuse-*.* 10.250.13.45:~/
6 scp ganglia-*.gz 10.250.13.45:~/
7 scp ganglia-devel-*.rpm 10.250.13.45:~/
8 scp *.conf 10.250.13.45:~/
9 ssh 10.250.13.45
10 sudo su -
11 yum install expat 12 cd /home/admin 13 tar -xvf apr-1.4.*.gz 14 cd apr*
15 ./configure --prefix=/usr/local/apr 16 make
17 make install
18 cd .. 19 tar -xvf apr-util-1.3.9.*
20 cd apr-util*
21 ./configure --with-apr=/usr/local/apr 22 make
23 make install
24 cd .. 25 rpm -ivh libconfuse-2.5-4.el5.x86_64.rpm 26 rpm -ivh libconfuse-devel-2.5-4.el5.x86_64.rpm 27 tar -xvf ganglia-3.1.*.gz 28 cd ganglia*
29 cp /usr/local/apr/bin/apr-1* /usr/local/bin/
30 ./configure --with-apr=/usr/local/apr 31 find / -name "libpython2.5*"
32 cp /usr/local/lib/libpython2.5.so /usr/lib/libpython2.5.so 33 make
34 make install
35 cd .. 36 rpm -ivh ganglia-devel-3.1.1-1.x86_64.rpm --nodeps 37 cd /etc 38 mkdir ganglia 39 cp /home/admin/*.conf /etc/ganglia/ 40 cd /etc/ganglia 41 vi gmond.conf ;edit udp send and recv host. 42 vi /usr/local/etc/gmond.conf 43 gmond --debug=10 44 ps -e|grep gmond 45 kill -9 id 46 gmond 47 #若是必要须要从新修改gmond.conf 48 scp test 10.250.13.42:~/ 49 scp test 10.250.13.43:~/ 50 scp test 10.250.13.44:~/ 51 scp test 10.250.13.45:~/ 52 vi /etc/profile 53 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/usr/local/lib64/" 54 source /etc/profile
缺乏库文件,一般在make过程当中出现该错误,ld找不到对应的库好比libpython2.5.so
解决方法:find命令查找这两个文件,并ln –s 建立指向这两个文件的软连接引用。
find / -name libpython*
若是安装过程当中出现依赖错误,一般在configure时出现
解决方法:首先利用find查找,若是找到能够阅读readme,查看是否有参数支持指明该路径。不行考虑拷贝到默认目录,仍是不行则能够加入参数--nodeps,而后download该lib,一般包含在其devel包里,须要去网上查找包含该lib的文件,而后安装。
测试gmond和gmetad是否运行成功:
1 Telent localhost 8649
2 Telent localhost 8651
若是没有反应
解决方法:极可能是由于服务没有启动,或者使用的不是默认端口:
ps –e|grep gmond
查找服务是否启动。查看gmond.conf看所使用的tcp recv端口。
还找不到缘由,就能够用调试模式启动查看缘由
gmond –debug=10
若是出现udp之类的端口绑定错误,好比是已被bind,则查看是否有端口已被利用。
lsof –i:port
还多是配置文件配置不正确,好比我曾经将udp_recv_channel的host修改为与udp_send_channel相同的值,就发生了端口错误,udp_recv_channel的host必须是本机的ip(一个机子可能有多个ip)。若是是权限禁止,则考虑当前用户身份,或者换成root试下。
测试php前端支持是否成功:
php页面显示为文件或者提示下载文件
解决方法:说明apache的php模块没有安装配置好。使用yum install 或者从新下载安装php模块,并在apache的conf文件里配置好。
显示页面无图象展现
首先检查selinux是否关闭
而后查看conf.php文件里的rrdtool路径是否正确,该文件是否存在,注意该路径是rrdtool可执行文件的路径不是其安装目录。
而后查看/var/lib/ganglia/rrds是否存在,可否被写。
chown nobody:nobody /var/lib/ganglia/rrds # make sure RRDTool can write here.
查看php.conf里的gmetad的路径地址端口是否正确。
Ganglia项目是由加州大学发起的,如今已经成为一个应用很是普遍集群监控软件。能够监视和显示集群中的节点的各类状态信息,好比如:cpu 、mem、硬盘利用率, I/O负载、网络流量状况等,同时能够将历史数据以曲线方式经过php页面呈现。同时具备很好的扩展性,容许用户加入本身所要监控的状态信息。
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安装在同一个节点上(还需确认是否能够不在一个节点上,由于php的配置文件中ms可配置gmetad的地址及端口),它从Gmetad取数据,而且读取rrd数据库,生成图片,显示出来。
如上图所示,gmetad周期性的去gmond节点或者gmetad节点poll数据。一个gmetad能够设置多个datasource,每一个datasource能够有多个备份,一个失败还能够去其余host取数据。
若是是muticast模式的话,gmond之间还会经过多播来相互传递数据。Gmond自己具备udp send和recv通道,还有一个tcp recv通道。其中udp通道用于向其余gmond节点发送或接受数据,tcp则用来export xml文件,主要接受来自gmetad的请求。Gmetad只有tcp通道,一方面他向datasource发送请求,另外一方面会使用一个tcp端口,发布自身收集的xml文件,默认使用8651端口。因此gmetad便可以从gmond也能够从其余的gmetad获得xml数据。
Gmond节点内部模块图以下所示:
如上图所示,主要由三个模块组成,collect and publish模块,该模块周期性的调用一些内部指令得到metric data,而后将这些数据经过udp通道发布给其余gmond节点。Listen Threads,监听其余gmond节点的发送的udp数据,而后将数据存放到内存中。XML export thread负责将数据以xml格式发布出去,好比交给gmetad。
下面重点介绍下unicast模式下ganglia系统内的数据流。
如上图所示,多个gmond节点经过udp向单播的目标host的gmond发送数据,gmetad而后向该目标host的gmond请求xml文件,而后存入rrdtool数据库。 在unicast模式中,图中方框内的组件一般是位于集群内的同一个节点。该节点负责收集存储 显示被监控的各节点的状态信息。
向ganglia加入自定义metric有两种方法,一种是经过命令行的方式运行gmetric,另外一种是经过ganglia提供的面向c和python的扩展模块,加入自定义的模块支持。
n 自动收集数据
集群内各个节点的信息收集能够经过ganglia系统自动的收集起来,这个收集是独立进行地。其通讯性能都是通过良好设计和优化的。具体的机制是:周期性的将这些信息发送给gmond,这样信息就加入了ganglia监控系统。经过ganglia的监控机制完成监控数据的收集显示的功能。Ganglia系统的机制能够参考2.1ganglia工做原理。
n 图形界面
数据能够经过图形显示出来。经过登陆web服务器便可查看。目前能够经过该视图查看集群及单独节点的状态曲线。同时具备基本的排序机制,能够根据值降序或者升序排序。能够查看过去1小时 1天 1周 1年等时间段的状态曲线。
n 数据库rrdtool存储了历史数据
因为采用了rrd存储数据,这样咱们不单能够查看当前的状态,还能够查看以前的状态历史,同时能够将metrics随时间的变化以曲线的方式变现表现出来。而单独的向文件写日志很难保存和方便地查看以前的历史记录。并且有可能使得日志文件很大。RRDtool具备以下优势:
1)除了存储数据以外,它具备能够建立图形的工具;
2)它的数据库文件大小是固定的,新的数据添加到已有数据的后面,当到了文件末尾的时候就开始从文件开始写数据,Round Robin就是指这个意思;
3)通常的数据库只能存储数据自己,而rrd能够存储相对与之前的数据的变更
4)通常的数据库是在提供数据的时候才更新,而RRD是在每个预先设好的时间间隔都会更新,每次更新的时候,time stamp也会存储进去
n 开销估计:网络 IO CPU
只运行gmond进程的节点开销很小,一般须要1m左右内存,cpu大概1%不到,同时gmond只把数据保存在内存中,所以io开销能够忽略。同时向其余节点单播自己的信息自己的网络压力也不会很大。所以对于只运行gmond的节点来讲,开销很小。 若是采用了unicast模式,主要的开销就会在各节点的gmond进程向中央节点发送的udp数据带来的网络开销,此外gmond和gmetad的通讯,web服务也在该中央节点上进行。这样主要的瓶颈就在中央节点上,其网络 IO CPU的压力都会很大。
对于网络来讲,中央节点将收到来自其余全部节点发送的udp包,若是一个节点每秒发10个包,500个节点将会发出5000个,每一个包有200字节,就有1m字节,5000个包的处理所须要的cpu使用也会上升。
对于内存来讲每一个状态信息存储在内存大概要耗费300byte,若是一个job有10万个instance,每一个instance又有10个状态须要监控,那么将耗费10000*10*300=30m的内存,其对应的xml文件大小也应该是10m级别的。
对于IO来讲,Gmetad默认15秒向gmond取一次xml数据,若是gmond和gmetad都是在同一个节点,这样就至关于本地io请求。同时gmetad请求完xml文件后,还须要对其解析,也就是说按默认设置每15秒须要解析一个10m级别的xml文件,这样cpu的压力就会很大。同时它还有写入RRD数据库,还要处理来自web客户端的解析请求,也会读RRD数据库。这样自己的IO CPU 网络压力就很大,所以这个节点至少应该是个空闲的并且能力比较强的节点。
n Gmetad RRD写入瓶颈
须要格外注意的是gmetad守护进程使用RRDtool,会在/var/lib/ganglia/rrds/目录下的一个子目录存储这些rrd数据信息,若是集群节点超过100个,你可能应将这个目录放在RAM文件系统上,由于这个数据库的磁盘I/O将会很是高。因为RRD特有的存储方式,它会为每一个metric存放一个文件,若是配置了多个采样频率,它还会为每一个采样频率保存一个单独的文件。这就意味着gmetad将metric的值保存到rrd数据库的操做,将是针对大量小文件的IO,假设集群有300个节点,每一个节点有50个metric,那么意味着gmetad会记录15000个metric,若是这些metric都是一秒更新一次,那么意味着每秒15000的随机写入操做,一般来讲硬盘都是撑不住的。
一个可能的解决方法就是将集群内的节点划分为多个子集,为每一个子集配置一个中央收集节点。但这样会带来部署和结果查看的不方便性。另外能够经过RRDcached来缓解这个gmetad使用RRDTool的问题大量随机写入,它会缓存这些写入,批量进行更新。此外就是下降metric的采样频率,减小metrics的数目,尽可能减小这种写入请求量。若是机器具备多块磁盘,尽可能利用多个磁盘来保存RRD数据。还有就是使用上面咱们所说的将rrd目录加载为tmpfs。
n 使用的服务及端口以及依赖的库
Ganglia的gmond进程使用了udp进行单播,默认端口8649,同时还有负责tcp监控的端口8651 8652 8650也会被使用,这些端口须要在集群内部打开,这些使用的端口能够进行配置。另外apache也须要一个端口提供服务,这个端口会被从外部访问,默认是80。
n 同一个host的不一样进程的相同Metirc可能混淆
因为ganglia自己是根据host+metric_name来区分不一样的状态参数的,也就是它没法区分同一host内的不一样进程相同的名称的状态变量。可是对于单纯的一个状态量,虽然多是多个进程的状态,但对它来讲只能看到一个名称,因此当多个进程同时向它报告具备同一个名称的状态的value时,它没法区分出进程间的不一样。若是要区分它们,就须要加入一个命名机制区分它们。
程序运行完毕,该程序对应的自定义的那些metric不会消失,这意味着虽然程序运行结束,但咱们依然能够查看其历史记录。但另外一方面这样也会带来新的问题,因为咱们采用的针对metric的命名机制,会致使metric积累到不少,这样会致使xml变得愈来愈大,增长中央节点解析该文件时的压力,也不方面查阅。目前有一个可行的方法就是修改gmetad的配置文件,减小数据的保存时间的设置。
基于ganglia的监控运行时,须要各个客户端安装gangliang的客户端gmond。收集数据的那个节点还须要安装ganglia的服务端gmetad,为了能够从web显示结果,还须要安装http服务器。安装这些还有不少依赖软件。具体参见1环境安装配置。
除了使用ganglia内置的网页页面外,也能够自行获得xml文件去进行本身的分析。一般须要本身编写一个脚原本完成该任务。经过直接telnet gmond或者gmetad的tcp服务监听端口,能够直接获得xml文件,而后咱们就能够对该xml文件进行须要的处理了。在单播模式下,应该telnet那个gmond的中央节点,登陆该节点才能获得集群内全部节点的信息,不然只能获得单独节点的信息。
参考文献
http://duanple.blog.163.com/blog/static/70971767201183092413177/