企业级开源监控软件Ganglia 安装与配置

一、所需要软件
二、安装过程
1、Ganglia运行平台的安装
2、Ganglia依赖库的安装
3、RRDTool的安装
4、Ganglia的安装 (包括使用yum方式安装)
三、简单配置
四、启动与访问
五、被监控节点上安装Ganglia (包括使用yum方式安装)
六、Apache密码验证
七、遇到的问题,及解决办法
八、其它

流行的开源服务器集群监控工具有很多,例如Nagios、Cacti、Ganglia、Zenoss、Clumon,它们在底层都利用了RRDTool。国内最常用的就是Cacti+Nagios,但是Ganglia其实也很不错,Ganglia+Nagios的组合也很强大。
Ganglia是一个可伸缩的监控系统,尤其适合用来监计算机集群、网格等。
Ganglia是一个监控服务器,集群的开源软件,能够用曲线图表现最近一个小时,最近一天,最近一周,最近一月,最近一年的服务器或者集群的cpu负载,内存,网络,硬盘等指标。
Ganglia的强大在于:ganglia服务端能够通过一台客户端收集到同一个网段的所有客户端的数据,ganglia集群服务端能够通过一台服务端收集到它下属的所有客户端数据。这个体系设计表示一台服务器能够通过不同的分层能够管理上万台机器。这个功能是其他mrtg,nagios,cacti所不能比拟。
Ganglia的扩展插件非常好写,无论用何种语言(shell,php,pyton)都可以写,只要把最终结果传给gmetric就可以,这样在web上就可以看到对应的数据。

Ganglia监控系统的组成部分包括:两个独立的daemon,一个基于PHP的web前端,和一些其它的应用程序。
gmond(Ganglia Monitoring Daemon):运行于节点上的daemon,收集本机的监控数据,发送到其他机器上。收集其他机器的监控数据,供Gmetad读取。默认监听端口8649
gmetad(Ganglia Meta Daemon):服务器端的daemon,这个程序负责收集各个cluster的数据,并更新到rrd数据库中。
Ganglia PHP Web Frontend:基于PHP的web前端监控界面,需要和Gmetad安装在同一个节点上,从Gmetad取数据,并且读取rrd数据库,生成图片,显示出来。

Ganglia官网:http://ganglia.info/
Ganglia Wiki:http://sourceforge.net/apps/trac/ganglia
官方网站:http://ganglia.info
Ganglia的下载地址 http://sourceforge.net/projects/ganglia
Windows版Windows客户端版和Ganglia 源包:
http://www.sajinet.com.pe/ganglia/
http://sourceforge.net/project/showfiles.php?group_id=43021&package_id=35280
文档帮助: http://ganglia.sourceforge.net/docs/

一、所需软件:
平台:linux+apache+php
依赖库:
apr-devel
apr-util
check-devel
cairo-devel
pango-devel
libxml2-devel
rpmbuild
glib2-devel
dbus-devel
freetype-devel
fontconfig-devel
gcc-c++
expat-devel
python-devel
libXrender-devel
libconfuse(它无法通过yum安装)
pcre(无法通过yum安装)

RRDTool:rrdtool-1.4.5.tar.gz (Round Robin Database Tool),rrdtool是一个数据库软件。它是一个主要用于进行监控的数据库,与其它的数据库相比,具有以下三个特点:
1)除了存储数据之外,它具有可以创建图形的工具;
2)它的数据库文件大小是固定的,新的数据添加到已有数据的后面,当到了文件末尾的时候就开始从文件开始写数据,Round Robin就是指这个意思;
3)一般的数据库只能存储数据本身,而rrd可以存储相对与以前的数据的变动;
4)一般的数据库是在提供数据的时候才更新,而RRD是在每一个预先设好的时间间隔都会更新,每次更新的时候,time stamp也会存储进去。

Ganglia:ganglia-3.1.7.tar.gz

二、安装过程
编译安装比较麻烦,所以这里使用yum安装方式,只是Ganglia版本稍微低一些。Yum安装方式很简单,首先要安装epel源 (什么是epel ?自行google一下 ),然后运行:

yum install rrdtool httpd php ganglia*   以ganglia开头的几个软件都要安装

三、Ganglia的简单配置:
1)服务器端配置文件/etc/ganglia/gmetad.conf,主要是配置data_source参数。它设定了被监控端服务器的地址及端口,将集群名称改为你自己的,host1 host2是gmetad用来得到集群信息的xml文件的数据源,如果没有写端口,则采用默认的8649端口,gmetad默认每隔15秒通过tcp连接去该主机下载xml文件。所以他们可以是gmond的8649端口,也可以是gmetad的8651端口,它们都可以提供集群信息的xml格式的数据下载。可以指定多个被监控端服务器:

data_source “hadoop” host1 host2

host1 host2是or的关系,如果host1无法下载,则才会尝试去host2下载,所以它们应该都是同一个集群的节点,保存着同样的数据。采用multicast模式时,每台gmond节点都有本cluster内节点机器的所有监控数据,因此不需要把所有节点写入data_source中。建议写入不低于2个,在host1节点死机的时候,会自动找host2节点取数据。

3)被监控节点配置文件/etc/ganglia/gmond.conf:
gmond.conf包括了几个部分:globals、cluster、udp_send_channel、udp_recv_channel等,如果只是想要Ganglia简单地运行,一个操作就可以了,在cluster配置段中进行修改:
命名你的集群:
命名一个cluster名称,名称与gmetad.conf中的data_source保持一致。我的命名:name = "hadoop"
把这个gmond.conf配置文件分发到每个被监控的节点服务器上,重启监控端的gmetad和gmond,以及节点端的gmond,即可对节点进行监控。

在gmond.conf中主要修改广播主机及端口部分,代码段如下:

单播实例

udp_send_channel {
# mcast_join = 239.2.11.71
#port = 8649
#ttl = 1
host = 10.10.79.196
port = 8681
}

/* You can specify as many udp_recv_channels as you like as well. */
udp_recv_channel {
#mcast_join = 239.2.11.71
#port = 8649
port = 8681
#bind = 239.2.11.71
}

多播实例为注释部分

4)修改web前端配置文件/etc/ganglia/conf.php,指定gmetad中存储rrd图形的目录,以及rrdtool的位置:(通过yum安装不用修改)

$gmetad_root = "/var/lib/ganglia";
$rrds = "$gmetad_root/rrds";

define("RRDTOOL", "/usr/bin/rrdtool");

四、启动ganglia,并访问其web页面:
service gmond start
service gmetad start
service httpd restart

测试
# 命令行打印当前活动client
gstat -a

ganglia-web默认安装在/usr/share/ganglia,需要在Apache的虚拟机中做相应设置,或直接拷贝整个文件夹到网站目录下
访问: http://192.168.9.45/ganglia
默认情况下,web前端每300秒(5分钟)刷新一次,可以修改刷新间隔时间,通过修改config.php文件实现,它里面包括有所有的Ganglia Web参数。

五、被监控节点上安装Ganglia:
根据IBM网站上的文章所述,只需要拷贝几个文件到节点机器,即可使用Ganglia对这些机器进行监控。但是我们一般都不允许以root帐户连接远程服务器,所以也比较烦琐,还不如直接安装。
被监控节点服务器不需要安装RRDTOOL,php等,只需要gmond。编译安装方式跟监控节点一样,但configure时要简单一些,下面一条命令即可:

./configure --sysconfdir=/etc/ganglia

被监控节点上安装ganglia-gmond完毕后,从监控节点复制gmond.conf文件到被监控节点,然后启动/重启gmond,然后刷新监控web页面即可。
最好重启一下监控节点的gmetad。

然后把被监控端的gmond添加系统为系统服务,前面已经讲过了。略过。

被监控节点也可以使用yum方式安装,也是首先安装epel源,然后只需要运行下面命令:

yum install ganglia-gmond

六、Apache密码验证
通过web方式访问ganglia不需要密码,所以我们通过apache设置密码达到安全目的。(Google即可)

七、安装过程中遇到的错误及解决办法:
1)Ganglia访问失败:
There was an error collecting ganglia data (127.0.0.1:8652): fsockopen error: Permission denied
解决:
需要关闭selinux:vi /etc/selinux/config,把SELINUX=enforcing改成SELINUX=disable;需要重启机器。
可以使用命令setenforce 0来关闭selinux而不需要重启,刷新页面,即可访问!但此方法只是一权宜之计。要想永久修改selinux设置,还是要使用第一种方法。
2)访问web出现图片画不出来的原因:
a、rrdtool没有安装,或者conf.php里没有配置
b、gemtad没有启动
c、没有客户端数据
d、Selinux限制apache执行rrdtool

八、其它
实际应用中,需要监控的机器往往在不同的网段内,这个时候,就不能用gmond默认的多播方式(用于同一个网段内)来传送数据,必须使用单播的方法。
a、ganglia的工作原理。

ganglia data flow

从这幅图上来看,似乎是gmetad会去每个gmond节点取数据。但在实际 应用中,gmond可以配置成为一个cluster,这些gmond节点之间相互发送各自的监控数据。所以每个gmond节点上实际上都会有 cluster内的所有节点的监控数据。gmetad只需要去某一个节点获取数据就可以了。从下面这幅图我们可以看出gmetad如何从gmond节点组成的cluster上获取数据。

gmetad

Ganglia:分布式监控系统 - 星星 - 银河里的星星

                                                                              图 1  Ganglia整体结构图

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节点内部模块图如下所示:

Ganglia:分布式监控系统 - 星星 - 银河里的星星

                                                                         图 2  Gmond节点模块结构图

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

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

Ganglia:分布式监控系统 - 星星 - 银河里的星星

                                                            图 3单播状况下集群节点间的数据流

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

单播与多播模式的区别,在多播模式下,加入该多播组的节点都会收到组内所有其他节点的数据,所以每个相当于一个备份。单播模式下,只是点到点的发送数据,数据只会发向特定的那个host,这种模式下通常具有一个中央收集节点。

cluster {
name = "Cluster1"     #本节点属于哪个cluster
owner = "chifeng"     #谁是该节点的所有者
latlong = "unspecified"   #在地球上的坐标,经度、纬度?
url = "unspecified"
}

udp_send_channel {       #udp包的发送通道
mcast_join = 239.2.11.71   #多播,工作在239.2.11.71通道下。如果使用单播模式,则要写host = host1(接受数据的目标主机),单播模式下也可以配置多个udp_send_channel
port = 8649            #监听端口
ttl = 1
}

udp_recv_channel {           #接收udp包配置
mcast_join = 239.2.11.71   #同样工作在239.2.11.71通道下,如果使用单播模式,则要写host = localip,就是必须是本机的ip
port = 8649                #监听端口
bind = 239.2.11.71         #绑定
}

tcp_accept_channel {
port = 8649   #通过tcp协议监听的端口,远端可以通过链接8649端口得到监控数据,gmetad就是通过该端口得到xml数据
}

b、可能存在的问题及瓶颈
1、开销估计:网络 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 网络压力就很大,因此这个节点至少应该是个空闲的而且能力比较强的节点。

2、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。

3、使用的服务及端口以及依赖的库
Ganglia的gmond进程使用了udp进行单播,默认端口8649,同时还有负责tcp监控的端口8651 8652 8650也会被使用,这些端口需要在集群内部打开,这些使用的端口可以进行配置。另外apache也需要一个端口提供服务,这个端口会被从外部访问,默认是80。

4、同一个host的不同进程的相同Metirc可能混淆
由于ganglia本身是根据host+metric_name来区分不同的状态参数的,也就是它无法区分同一host内的不同进程相同的名称的状态变量。但是对于单纯的一个状态量,虽然可能是多个进程的状态,但对它来说只能看到一个名称,所以当多个进程同时向它报告具有同一个名称的状态的value时,它无法区分出进程间的不同。如果要区分它们,就需要加入一个命名机制区分它们。

程序运行完毕,该程序对应的自定义的那些metric不会消失,这意味着虽然程序运行结束,但我们依然可以查看其历史记录。但另一方面这样也会带来新的问题,由于我们采用的针对metric的命名机制,会导致metric积累到很多,这样会导致xml变得越来越大,增加中央节点解析该文件时的压力,也不方面查阅。目前有一个可行的方法就是修改gmetad的配置文件,减少数据的保存时间的设置。

c、如果是多宿主计算机,则需要进行该步骤,否则略过
#如在集群中,eth0 是系统的公共 IP 地址。但是,监视服务器将通过 eth1 与私有集群网络中的节点进行通信。需要确保 Ganglia 使用的多点传送将与 eth1 绑定在一起。这可以通过 创建 /etc/sysconfig/network-scripts/route-eth1 文件来完成。添加 239.2.11.71 dev eth1 内容-根据实际情况填写广播IP。

这个要根据实际情况,如果网卡为em1,则建立文件route-em1 ,内容为239.2.11.71 dev em1

#然后您可以使用 service network restart 重新启动网络并确保路由器显示此 IP 通过 eth1。注:您应当使用 239.2.11.71,因为这是 ganglia 的默认多点传送通道。如果使用其他通道或者增加更多通道,请更改它。
touch /etc/sysconfig/network-scripts/route-eth1
echo "239.2.11.71 dev eth1">>/etc/sysconfig/network-scripts/route-eth1
service network restart

d、关于端口:

xml_port 8651 #可以telnet到该端口,得到gmetad的xml文件

interactive_port 8652 #php页面数据交互使用的端口

演示地址 伯克利大学的集群监控(1000多台服务器):
http://monitor.millennium.berkeley.edu/

参考资料:
linux下ganglia监控系统搭建:http://www.howtocn.org/ganglia_how_to
Ganglia分布式集群监控系统安装手册:http://blog.csdn.net/zhiwsun/article/details/7919384
Ganglia3.1.7安装与配置:http://share.blog.51cto.com/278008/577554
ganglia 3.4安装配置简述:http://share.blog.51cto.com/278008/1054385
Ganglia分组监控:http://www.linuxidc.com/Linux/2012-11/74118.htm
ganglia安装配置初体验(二):http://blog.csdn.net/skyboy_man/article/details/5607256
Ganglia文档(一):http://blog.chinaunix.net/uid-25837154-id-321727.html

发表评论?

1 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据