<转>ganglia之数据提取

来源:互联网 发布:flash for mac 破解版 编辑:程序博客网 时间:2024/06/13 08:04

由于chukwa现阶段仍不稳定,安装过程复杂,调试困难等缺点,**选择将其放弃(此时chukwa 

研究已经有大半年时间),改用曾经一度被看好的gangliaganglia最初因为它的分布式监控效果突出被看好,但又因为它不能对日志分析,只是单纯监控集群的工作状态,无法与Hadoop任务的监视进行有效结合被放弃。但不可否认,ganglia依旧有很多优势。

Ganglia is scalable distributed monitoring system for high-performance computing systems such as clusters and Grids. It is based on hierarchical design targeted at federations of clusters. It leverages widely used technologies such as XML for data representation, XDR for compact, portable data transport, and RRDtool for data storage and visualization. It uses carefully engineered data structures and algorithms to achieve very low per-node overheads and high concurrency. The implementation is robust, has been ported to an extensive set of operating systems and processor architectures, and is currently in use on thousands of clusters around the world. It has been used to link clusters across university campuses and around the world and can scale to handle clusters with 2000 nodes.

上述为Ganglia的官方解释,清楚明了,在此我不做过多说明。现阶段,我的任务主要是分离ganglia的数据提取功能,使之成为一个独立模块。ganglia的分布式工作由一个gmetad主节点(也可以是多个)和很多gmond节点完成,gmond根据gmetric中的各个度量,采集数据,然后以xml压缩形式将数据传播(TCP)gmetric,同时gmond也会向其他gmond节点传播自己的数据(UDP)gmetric每隔一段时间会轮询各个gmond的工作状态,便于及时发现当掉节点,收到数据后,gmetric会将xml进行解析,然后把解析后数据传给rrd数据库,该数据库的官方说明如下:

RRDtool is the OpenSource industry standard, high performance data logging and graphing system for time series data. RRDtool can be easily integrated in shell scripts, perl, python, ruby, lua or tcl applications. 

RRD在数据存储及数据显示方面有着巨大优势。它按照时间戳不断存储数据,针对每个集群节点,它都会创建一个目录,如host1,然后在目录中存储每个metric的数据库文件,如cpu_speed.rrdmem_buffers.rrd等,文件的大小是一定的,在存满后,数据会从头开始存储,这就是叫做Round Robin Database的缘由。RRD会根据命令自动产生数据图形显示,也可以显示过去1天、1周、1月甚至1年的数据情况(根据时间的延长,数据库会对数据进行稀释,如1周后,数据文件达到固定大小,就会对一些数据求出1周均值然后再存储)。我们可以访问gangliaphp页面查看ganglia工作状态。

言归正传,ganglia不同节点间的数据传播是用socket实现,默认gmetad会将它的XML(整合各个gmond后的XML)输出到8651端口,而gmond会将它自己的XML数据输出到8649端口。在gmetad节点上,通过telnet localhost 8651命令,可以获得所有节点的XML数据。小组最初的想法是建立一个socket监听8651端口,经过测试后,我发现根本接收不到任何数据,原因其实很简单,我们犯了一个低级错误,就是不同程序不能对同一个端口进行监听,此时的gmetad也在监听8651获取数据啊。其实,改源码,将gmetad解析后的数据转存是最好的选择,但短时间内,我还是没能精通ganglia的源码(实力有限,看了两天,进展不大,只是对ganglia的实现有了进一步理解)。最终,我选择利用脚本实现数据提取。编写脚本实现每隔一段时间telnet localhost 8651,然后自行解析XML数据。shell脚本比较容易上手,不到一天时间,即已实现基础功能(其实只有几行代码O(∩_∩)O~)。接下来,重点讲下XML的解析。

我们需要监视多个主机工作情况,每个主机又有多个metric。我建立如下数据结构:

typedef struct{

xmlChar *name;

xmlChar *val;

}metric,*metricPtr;

typedef struct{

int nbMetric;

xmlChar *hostname;

xmlChar *ipaddr;

metricPtr metrics[100];

}host,*hostPtr;

typedef struct{

int nbHost;

hostPtr hosts[50];//可以考虑动态实现 hostPtr *hosts;

xmlChar *report_time;

}xmldata,*xmldataPtr;

有多种方法可以解析XML文件,根据XML树状节点的特点,我利用libxml库,解析xml。读取XML文件,将其以树状结构存储到内存(自带库函数xmlParsexmlReadFile等即可实现),然后返回根节点cur,利用cur在树上不断移动即可得到各个节点的值,将得到的值存储到xmldata中,即完成了数据的解析。

将脚本与XML解析函数结合,就完成了ganglia的数据提取工作。

有一些更好的办法可以实现,如不使用脚本,用多线程实现数据提取,然后解析,并用socket将数据输出到某个指定端口,这样另一端只要建立socket监听就可以了~

大致总结如上,写得很粗糙~~算是一次简单地工作记录吧

0 0