• Save
Ganglia轻度使用指南
Upcoming SlideShare
Loading in...5
×
 

Ganglia轻度使用指南

on

  • 5,578 views

Tips for Ganglia on Prototype, Test, and more.

Tips for Ganglia on Prototype, Test, and more.

Statistics

Views

Total Views
5,578
Views on SlideShare
5,578
Embed Views
0

Actions

Likes
23
Downloads
0
Comments
3

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • oh ......
    Are you sure you want to
    Your message goes here
    Processing…
  • could not be downloaded?
    Are you sure you want to
    Your message goes here
    Processing…
  • oh ......
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Ganglia轻度使用指南 Ganglia轻度使用指南 Document Transcript

  • Ganglia 轻度使用指南 快速集成 Ganglia 和产品原型 Schubert Zhang 2011/12/17快速安装部署 Ganglia,和产品原型进行集成;轻度定制 Ganglia,监视和管理自己的原型产品;随时使用 Ganglia,助力开发和测试。
  • 目录1 Ganglia 简介 ............................................................................................................................. 22 Ganglia 安装 ............................................................................................................................. 5 2.1 安装准备....................................................................................................................... 5 2.2 APR (Apache Potable Runtime) ..................................................................................... 6 2.3 libConfuse (Configuration File Parser Library) ........................................................ 6 2.4 expat (XML Parser) ........................................................................................................ 6 2.5 Python ........................................................................................................................... 7 2.6 PCRE (Perl Compatible Regular Expressions) ................................................................ 7 2.7 RRDtool (Round-Robin Database) ................................................................................. 7 2.8 Ganglia .......................................................................................................................... 73 Ganglia 配置和启动 ................................................................................................................. 8 3.1 Ganglia 的启动脚本和配置文件.................................................................................. 8 3.2 gmond.conf 配置 .......................................................................................................... 9 3.3 gmetad.conf 配置 ......................................................................................................... 9 3.4 启动 Ganglia 进程....................................................................................................... 10 3.5 Web Frontend ............................................................................................................. 104 Ganglia 的 Java 集成 ............................................................................................................... 11 4.1 Java JMX ...................................................................................................................... 11 4.2 JMX to Ganglia - Jmxetric ............................................................................................ 13 4.3 集成 Jmxetric .............................................................................................................. 13 4.4 直接使用 Jmxetric API ................................................................................................ 165 Ganglia 界面定制 ................................................................................................................... 17 5.1 产生报表(Report) ....................................................................................................... 17 5.2 展示报表界面............................................................................................................. 18 5.3 Logo 替换和其他页面调整 ........................................................................................ 19 5.4 多种界面风格............................................................................................................. 196 Ganglia 的 Shell Script 集成.................................................................................................... 197 深入 Ganglia ........................................................................................................................... 208 其他相关项目......................................................................................................................... 21 1
  • 1 Ganglia 简介 Ganglia 已经被广泛应用于服务器集群的状态和性能监视。它简单易用的部署和集成、优雅简洁的 Web 图形界面、方便的可定制性等特性,在分布式集群产品和服务领域,已经被证明是快速构建产品完整性和测试专业性的很好的工具。 在我们的 BigData 产品开发中,特别是产品原型开发、验证以及 Demo 中,应该充分快速地利用类似 Ganglia 这样的开源工具来构建产品的完整性,提供一定程度的可管理性。在分布式系统的系统测试中,特别是系统性能测试,以及面向用户展示产品的过程中,使用这类工具不仅会使测试数据更加易于呈现,而且更体现其专业性。 下图基本描述了 Ganglia 的组网示意图: 这是一个稍微复杂一点的图,但结构依然很清晰,所有的配置也很简单。在图中我们看到了两层结构,但作为最简单的配置和实验,我们暂时只考虑一层就可以了。如下图: 2
  • 更偏原理一些,如下图: 上图中的几个子系统的解释可见 Ganglia 主站的文档,这里简单粘贴和注释如下: The ganglia monitoring daemon (gmond) is a lightweight service that is installed on every machine youd like to monitor. This daemon uses a simple listen/announce protocol via XDR to collect monitoring state and then shares this information via XML over TCP. Gmond is portable and collects dozens of system metrics: CPU, memory, disk, network and process data. 注释:gmond gmond 是核心模块,它有三个角色: (1) 任何一个 gmond 节点都可以接收来自其他节点(根据配置,组播或单播)的 metrics 数据,所以 gmond 是个数据收集器。收集的 metrics 可能来自其他节点的 gmond(如 CPU, memory, disk, networ 等) 也可能来自其他节点的应用程序直接发送来的数据(后面的章节会提到)。 (2) gmond 可以将收集到的 metrics 数据 announce 给 gmetad(事实上是 gmetad 周期地 pull 数据, 3
  • 见 gmetad.conf 的 data_source 配置)。 (3) gmond 同时也代理采集本节点的基本 metrics(缺省有 CPU, memory, disk, network 等),并发给 负责收集数据的 gmond。用户应该也是可以添加采集的本节点项目的。 The ganglia meta daemon (gmetad) is a service that collects data from other gmetad(多级级 联) and gmond sources and stores their state to disk in indexed round-robin databases(RRD). Gmetad provides a simple query mechanism for collecting specific information about groups of machines. Gmetad supports hierarchical delegation for creating manageable monitoringgmetad domains. 注释: gmetad 是核心模块,它对我们提供服务:从配置的 data_source 的 gmond 中周期地 pull 数据,存储于 本地数据库(RRD),然后由 httpd 提供的 Web Server(PHP 代码)从 RRD 中 query 数据并展示图形界面。 The ganglia metric tool is a commandline application that you can use to inject custom made metrics about hosts that are being monitored by ganglia. It has the ability to spoof messages as coming from a different host in case you want to capture and report metrics from a device where you dont have gmond running (like a network or other embedded device). 注释: gmetric 是个命令行工具,可以带必要的参数 OPTIONS,将数据直接发送到负责收集数据的 gmond 节点 (或者广播给所有 gmond 节点)。这在一些 ad-hoc 的临时性测试,或者写个 shell script 输出采集数据到 ganglia 时非常方便,是个快捷的工具。后面讲到 Ganglia 的 Shell Script 集成的时候会举例用 script 采 集 iostat 数据输出到 ganglia 就是用这个工具。 可见,发出数据到 Ganglia 的不一定是 gmond 节点,我们是可以直接通过应用程序调用 Ganglia 提供的gmetric 编程 API 组装 ganglia 协议的消息包或直接通过 gmetric 这个命令行工具发送的。 通过运行/usr/local/ganglia/bin/gmetric --help 可以查看该命令行工具的行为和参数。 注意:ganglia-3.1.7 及以前的版本中的 gmetric 不能指定所发 metric 的 group,所以显示的界面上会看 到其 group name 为”no_group metrics”,如下图。目前的 3.2.0 版本的 ganglia 中完善了这个功能, 可以通过”--group=STRING”指定 group name。 The ganglia stat tool is a commandline application that you can use to query a gmond for metric information directly. 注释:gstat 这个工具以前一直没用到,用过运行/usr/local/ganglia/bin/gmetric --help 可以查看该命令行工具的行 为和参数。似乎只有在启用 gexec 的时候,这个工具才有意义。而 gexec 只有在我们编译安装的时候, 在./configure 中带上--enable-gexec 参数才会生效。gexec 是 gagnlia 的一个补充,可以将工作和资源 4
  • 分布在多个节点,解决单个节点上资源限制问题,具体还不清楚。 The ganglia web frontend expresses the data stored by gmetad in a graphical web interface using PHP.web 注释: 这就是展示界面的 PHP 和页面代码。后续章节我们将探讨如何简单依葫芦画瓢地修改这些界面以展示我们 想要的内容。 我们先将 gmond、gmetad 和 web 了解清楚即可,而 gmetric 和 gstat 用到时再去了解它们。 上述几张图都来自 Internet,目的是只要尽快地将问题说清楚即可。而本文也并不深入Ganglia 的细节,而是基于最简单地使用 Ganglia 的出发点来让新手可以快速地将 Ganglia 使用起来,起到一个引入作用。后续的细节和深度集成和定制,需要产品开发工程师和集成测试工程师去深入研究和开发。请到 http://ganglia.info 去寻找细节的资料。2 Ganglia 安装 Ganglia 的安装非常简单,但其中也有一些小小的 tricks,这里写出来,目的是让大家加快安装使用的速度。为了让大家在开发过程中能经常使用 Ganglia,建议大家也在自己调试的虚拟机上安装使用它。 下面所述的安装过程都是在 CentOS Linux 或 RedHat Linux 的 x86_64 系统上安装的,如果你的 OS 版本不同,自行调整。以安装 ganglia-3.1.7 为例,其他验证过好用的版本包括 3.1.2和 3.2.0。其中 3.2.0 由于是最新版本,内部改动有点多,我们的一些集成工具和界面 PHP代码还未跟上一同调整,所以本文没有以 3.2.0 为例介绍。但根据测试和实验,3.2.0 的对外gmond 协议接口和 3.1.x 是一致的,而且界面代码基本不用大的调整就可以使用,因此下面讲的基本上也适用于 3.2.0,只是界面部分的 PHP 代码稍微有点差别。另外 3.2.0 针对 3.1.x有写改进对我们还是很有价值的,比如前面提到的 gmetric 工具可以带 group 的功能,web界面可以查询展示历史某段时间(起止时间)的数据和图形(如下图)。2.1 安装准备 将安装包解压到/usr/local/src/ganglia-3.1.7 (我习惯将所有源代码安装包放在这里编译),简单看一下 INSTALL 文件,发现 Ganglia 依赖下列 lib 和工具。我们须一一检查是否可用。 5
  • 2.2 APR (Apache Potable Runtime) Ganglia 使用这个 lib 来隔离平台相关性,见 http://apr.apache.org/。 用 rpm -qa|grep apr 检查,系统须安装了下列包(版本可不同): 如果缺少则须安装。一般情况下,你的 Linux 光盘或 ISO 文件中会有这些包的 RPM,直接找到它安装即可,例如我缺少了 apr-devel,就这样安装: rpm -ivh apr-devel-1.3.9-3.el6.x86_64.rpm2.3 libConfuse (Configuration File Parser Library) Ganglia 使用这个 lib 来解析配置文件(所以配置文件 gmond.conf/gmetad.conf 的格式都是符合 libConfuse 规范的格式),见 http://www.nongnu.org/confuse/。 因为没有 RPM 可用,须下载源代码包,编译安装,下载最新的 2.7 版,解压到/usr/local/src/confuse-2.7(习惯),然后编译: ./configure CFLAGS=-fPIC --enable-shared --prefix=/usr/local/confuse-2.7 make intall 一般顺利,如果编译是遇到问题,偶尔遇到的问题常常和--disable-nls 选项有关。 ln -s /usr/local/confuse-2.7 /usr/local/confuse (习惯) echo "/usr/local/confuse/lib" >> /etc/ld.so.conf.d/my-lib.conf ldconfig (方便其他程序使用该库进行 ld 链接时好找) 顺便为了完整性,也把 pkgconfig 也配好,方便以后其他程序使用该库: ln -s /usr/local/confuse/lib/pkgconfig/libconfuse.pc /usr/lib64/pkgconfig/libconfuse.pc 用 pkg-config --cflags --libs libconfuse 检查可见下列打印信息: -I/usr/local/confuse-2.7/include -L/usr/local/confuse-2.7/lib -lconfuse2.4 expat (XML Parser) Ganglia 使用 expat 做内部 XML 数据的解析,见 http://expat.sourceforge.net/。须安装下 6
  • 列包,如缺,到 Linux ISO 或光盘中找到安装,不再多说。2.5 Python 我们目前使用 python 还比较少,但以后会逐渐多起来,特别是集成、测试和 Solution验证等工作,python 是必须熟练掌握的语言和工具。一般我们安装的 Linux 都会安装 python。这里就不多讲。如果没有,到 python 主站下载安装即可,如果用不到,在后面编译 ganglia的时候也可以选择--disable-python。2.6 PCRE (Perl Compatible Regular Expressions) 见 www.pcre.org。须安装下列包,如缺,到 Linux ISO 或光盘中找到安装,不再多说。2.7 RRDtool (Round-Robin Database) Ganglia 的 gmetad 用 RRD 来存储采集到的 metrics 数据, http://oss.oetiker.ch/rrdtool/。 见我们可以采用 RPM 或 src 安装。如果你的 Linux 已经安装了 RRDtool 和 RRDtool-devel,就不必再安装。这里介绍用 src 安装。 下载最新的 1.4.5 版到/usr/local/src/rrdtool-1.4.5 (习惯),编译安装: . /configure --prefix=/usr/local/rrdtool-1.4.5 make install ln -s /usr/local/rrdtool-1.4.5 /usr/local/rrdtool (习惯) ln -s /usr/local/rrdtool/lib/pkgconfig/rrdtool.pc /usr/local/rrdtool/lib/pkgconfig/librrd.pc echo "/usr/local/rrdtool/lib" >> /etc/ld.so.conf.d/my-lib.conf ldconfig2.8 Ganglia 至此,可以编译 Ganglia 了。下载 ganglia-3.1.7 到/usr/local/src/ganglia-3.1.7 (习惯),编译安装: GANGLIA_ACK_SYSCONFDIR=1 ./configure --prefix=/usr/local/ganglia-3.1.7 --enable-gexec--enable-status --with-gmetad --with-librrd=/usr/local/rrdtool--with-libconfuse=/usr/local/confuse make install 7
  • ln -s /usr/local/ganglia-3.1.7 /usr/local/ganglia (习惯) echo "/usr/local/ganglia/lib64" >> /etc/ld.so.conf.d/my-lib.conf ldconfig 注释:GANGLIA_ACK_SYSCONFDIR=1 这个环境变量是只有 ganglia-3.1.7 才需要的。因为以前老的 3.1.2 的配置文件是必须放在/etc/ganglia 下面的,3.1.7 的时候感觉这样不太好,就改在 Ganglia 安装目录下的 etc 了(我们这里是/usr/local/ganglia/etc),但为了后向兼容缺省还是用/etc/ganglia,除非我们设置了 GANGLIA_ACK_SYSCONFDIR=1。在 3.2.0 中完全放弃了/etc/ganglia。 复制源文件中 web 目录至 httpd 的工作目录(/var/www/html/ganglia) 。 注:这里的 web 文件是 ganglia 原始的 web 文件,在产品包装中,我们可以根据我们的需要替换成我们修改过的 web 文件。3 Ganglia 配置和启动3.1 Ganglia 的启动脚本和配置文件从 ganglia 源文件(/usr/local/src/ganglia-3.1.7)和安装目录(/usr/local/ganglia)复制必要文件到 Linux 系统目录: 在源文件目录下运行: cp gmond/gmond.init /etc/init.d/gmond,并修改 GMOND=/usr/local/ganglia/sbin/gmond。 cp gmetad/gmetad.init /etc/init.d/gmetad,并修改 GMETAD=/usr/local/ganglia/sbin/gmetad。生成缺省的 gmond.conf,在安装目录下运行: sbin/gmond --default_config > /usr/local/ganglia/etc/gmond.conf 8
  • 3.2 gmond.conf 配置 只需这几项配置即可: (1) cluster name:自己起个名字。 (2) gmond 发送数据的目的 IP 地址(组播或单播),gmond 接收数据的本地地址和端口。 注意因为上图中的 gmond 节点既发数据也收数据,所以收发地址是一样的,如果是 其他节点,那么需要将 recv 地址写成自己的,目的地址还是上述的。 因为 gmond 发送和接收数据可以是组播(缺省)或单播,这里推荐单播(一是避免不必要的组播包,而是当你有两个网卡, 而分别是不同网段是, 有时组播带来不必要的麻烦须调试)。 每一台机器的 gmond 都可以是这样类似的配置。3.3 gmetad.conf 配置 注意这几项配置: data_source "BigData" 192.168.247.130 配置数据采集的数据源。如果 gmond 配置的是组播,则可以从任何一台 gmond 上 采集(因为每台都能收到整个 cluster 的数据);如果是单播,则只有 gmond.conf 中 配置的目的地(udp_recv_channel)的那个地址才可以作为数据源。 gridname "Cloud" 自 己 起 个 全 局 的 名 字 。 注 意 gridname 下 面 是 Cluster Name , 我 们 这 里 是 Cloud->BigData。如果你有多个 Cluster 要管理,则起名时要讲究点。 all_trusted on 因为是实验环境,所以不考虑安全问题。 setuid_username "root" 9
  • 这个虽不是必须的,但这样配置会少很多权限问题的麻烦,否则因为 gmetad 进程 的 uid 是 nobody,而 gmetad 进程又要读写一些目录或文件(特别是/var/lib/ ganglia/rrds 等),权限问题很麻烦。 case_sensitive_hostnames 0 按照注释要求,对>=3.2 的 ganglia 应该配置为 0。但文件中缺省却是 1,有点不应该。3.4 启动 Ganglia 进程(1) gmond 集群的所有节点上启动 gmond 服务: /etc/init.d/gmond start 并将 gmond 作为系统服务在开机时自动启动: chkconfig --level 345 gmond on 一般 gmond 的启动不会遇到什么问题,看看 gmond 进程是否真的起来了。(2) gmetad 在某个节点上启动 gmetad 服务: /etc/init.d/gmetad start 并将 gmetad 作为系统服务在开机时自动启动: chkconfig --level 345 gmetad on 一般 gmetad 的启动不是很顺利,虽然报告启动 OK,但看不到 gemtad 进程。这一般需要手动创建 rrd 的数据库目录:mkdir –p /var/lib/ganglia/rrds。因为我们前面已经将 gmetad 的 uid 设置为 root,所以权限问题应该不存在了。3.5 Web Frontend 首先须简单修改一下 Web Frontend 的 PHP 程序中的一些参数: cd /var/www/html/ganglia 打开 conf.php 和 conf.php.in,修改其中的 rrdtool 的路径: define("RRDTOOL", "/usr/local/rrdtool/bin/rrdtool"); 在 gmetad 节点上启动 Apache httpd 服务: /etc/init.d/httpd start 通过访问:http://192.168.247.130/ganglia 访问其 web 界面。 10
  • 对 3.2.0,有时会遇到无法打开页面,并提示无法访问 /var/lib/ganglia/dwoo,这是 3.2.0 新 引 入 的 ( 没 有 去 研 究 它 ), 我 们 姑 且 手 工 创 建 该 目 录 : mkdir –p /var/lib/ganglia/dwoo。并且因为 httpd 进程的 uid 不是 root,还是无权访问, 我们姑且简单地将该目录的权限设置为 777 就可以了。 然后,通过 http://192.168.247.130/ganglia 就可以访问 Ganglia 界面了。4 Ganglia 的 Java 集成4.1 Java JMX 我们写的 Java 程序,可以用 eclipse 本地调试,也可以用 eclipse 远程连接到 remote 的 JVM调试。如果要做一些基本的监视和控制(监控), 比较常用的方法是使用 JMX 编程框架和规范。 JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX 是一套标准的代理和服务,实际上,用户可以在任何 Java 应用程序中使用这些代理和服务实现管理功能。JDK 也为我们提供了充分的 API 可用。我们这里不深入讲 JMX(请参考其他资料),而是假设你的程序已经使用或即将使用 JMX 做一些监控管理工作。 其实我们常常使用的 jconsole 就是通过连接本地或远端的 JVM 上的 JMX 接口,来监控程序的,JVM 已经为我们实现了一些基本的监控 MBean。 例如我们打开 HBase 的下列配置项: 就可以用 jconsole 远程图形工具连接(HostName or IP:10101)到 HMaster 进程的 JMX,对它进行监控,如下图,这些缺省的数据其实就是 JVM 帮我们实现的 MBean。 11
  • HBase 自己实现的 MBean 如下图: 但 jconsole 毕竟是调试级的工具,而不是产品级的。它能看到所有繁杂的 MBean,而且呈现的数据图形化程度不高。特别是它只能连接一个独立的 JVM,不具备分布式管理能力。 但 JMX 是 Java 程序管理的基础,我们编写的程序,首先要设计 JMX MBean,把要统计的 metrics、要呈现的 status、允许用户命令控制的接口等先以 JMX MBean 的形式对外提供访问的接口,后面的管理才能获得这些数据或命令接口。 和 JMX 相 关 的 好 的 例 子 , 大 家 可 以 参 考 我 为 大 家 共 享 的 DaStor 或 开 源 的Cassandra(http://cassandra.apache.org/)的代码中的实现,特别是这两个项目中的 MBean 和CLI 工具的实现可以作为好的参考。 另外,我曾经用过一个基于 Web 的 JMX 服务器: jmanage(http://www.jmanage.org/),它是一个 Web Server,也可以叫做一个 JMX Proxy Server,通过简单的在线配置,将其他机器的 JMX 源通过 HTTP 给 export 出来,方便远程管理和调试。我曾经在公司的集群上安装过,因为我们是做了 HTTP 端口映射的,从家里可以访问某台实验室服务器,但不能访问全部,所以,我们可以通过这个 JMX Proxy Server 来看其他服务器的 metrics,用浏览器看,也没有 12
  • 防火墙问题,很方便。4.2 JMX to Ganglia - Jmxetric 我们需要将 JMX 开放出来的 metrics 呈现到 Ganglia, 就需要将这些 metrics 发送到 Ganglia的 gmond 收集节点。而 Ganglia 没有提供现成的 Java API(只有 C 和 Python),即使有 API还得学习这些 API 并编程实现数据的采集和发送,比较麻烦。 在以往的开发中我们发现有人已经为我们实现了一个开源的比较简单好用的“JMX toGanglia”工具 Jmxetric (http://code.google.com/p/jmxetric/)。感谢 Anty 在做 Cassandra 和 DaStor的产品包装时找到这个好用的小工具。目前在其他产品中都在使用,比如 Terry 将其引入oNest/oHive 产品中。Jmxetric 由全 java 编写,并且只依赖一个第三方 lib(oncrpc-1.0.7.jar),配置非常简单,所以非常轻便好用。 Jmxetric 的原理很简单, 它借用了 javaagent 这个简单的机制 (可以 man java 或参考 JDK6的文档简单了解一下 javaagent) 。javaagent 定义了一套机制,用户可以通过 javaagent 定义的 jar 中的提供的 premain()方法(注意这个 premain()方法和我们普通的 main()方法类似,都是程序的入口),在用户主程序 main()之前开始执行。可以将这个 javaagent 指定的程序理解为一个运行在你启动的 JVM 中的一个线程。Jmxetric 定义的 javaagent 程序 periodically pollsMBean attributes and reports their values to Ganglia。 在 GitHub 上,我们维护了一个修改过的 jmxetric,它对原始的版本做了很小的改动,使其更方便配置和使用:https://github.com/schubertzhang/jmxetric,下面的介绍都是基于这个修改过的 jmxetric 的。虽然未做这些修改的版本也可以使用,但它可能对你造成不少调试上的困挠和麻烦,所以建议大家使用这个版本。4.3 集成 Jmxetric Jmxetric 的使用非常简单,所有的使用说明都在 README 文件中,首先简单读一下就知道如何配置了。下面以一个 DaStor 产品来介绍如何使用它。(1) 准备 jmxetric 的 jar 和配置文件 可直接到上述 Github 库中下载 jmxetric-0.0.6.jar 和/src/main/lib 下的 oncrpc-1.0.7.jar,将 这两个 jar 放在自己的 classpath 中。下载/etc/jmxetric.xml 这个配置文件放在自己的 classpath 中作为自己的配置文件,后面须修改它来将 JMX 和 Ganglia 集成起来。 13
  • (2) jmxetric.xml 的配置 jmxetric.xml 中包含下列配置项目(注意文件中的详细注释): 14
  • <!DOCTYPE jmxetric-config [ … ]>部分是固定格式,不要做任何修改。 在我们的演示中,Ganglia 采用的是 unicast,因此配置应该是:<ganglia hostname="192.168.247.130" port="8649" mode="unicast" wireformat31x="true"/> Sample 的采样点须和 MBean 的一一对应, 我们一般选择几个需要展示的 MBean 展示在 Ganglia 上。上图中的 MBean ”java.lang:type=Memory”是 JVM 自动提供的,而其他的是 DaStor 系统程序提供的。例如: “com.bigdata.dastor.service:type=StorageProxy”对应的 MBean 接口代码如下:(3) 程序启动脚本修改 需要在 DaStor 的启动脚本的 java options 中加上-javaagent 相关参数才能将 jmxetric 和 DaStor 的 JVM hook 上,具体的参数应该如下(这个格式是 java 规定的):export DASTOR_JMXETRIC= "-javaagent:$DASTOR_HOME/lib/jmxetric-0.0.6.jar=config=$DASTOR_CONF_DIR/jmxetric.xml" 在启动 DaStor 的服务程序时,只需将上述参数加到启动脚本中即可,如:java $JAVA_HEAP_MIN $JAVA_HEAP_MAX $DASTOR_OPTS $DASTOR_JMXETRIC -classpath"$CLASSPATH" com.bigdata.dastor.thrift.server.DastorMain "$@" 注意 :虽 然 jmxetric 的代码 所提供 的 API 较清晰, 用户可以自己 实现类 似 classganglia.gmetric.GMetric.JMXetricAgent 中的代码来实现自己的数据周期采集和发送 metrics,但我们不建议这样做。原因是(1)这样的集成过于紧密,不便于 jmxetric 代码的维护,如果jmxetric 修改了代码,产品的代码可能也要修改;(2)没必要重新做重复的工作。(4) 检查界面展示 15
  • 至此,我们每个节点的 DaStor 所特有的 metrics 已经可以输出到 Ganglia 了(注意会 delay 几分钟才能看到)。见下图:4.4 直接使用 Jmxetric API Jmxetric 提供的 API 也可以直接使用,向收集数据的 gmond 发送数据,这特别适用于我们写测试程序时使用,可以快速地将测试的性能数据吐到 Ganglia 上进行汇聚和查看。 例如,在我使用的一个 Benchmark 测试程序中,会统计很多测试数据,特别是一些性能指标(如:每秒钟的读写次数)。将这些数据写到 log 中事后分析当然是一种方法,但在测试过程中就看不到结果了,特别是有好多台机器的测试的时候,数据的收集汇总很麻烦。用Ganglia 是个很好的办法。Jmxetric 提供现成的 API 可借用一下,省了很多事。 这里主要涉及两个类: (1) class GMetricPublisher:它封装了 Ganglia 的协议接口,直接调用其 publish 方法即可 发送 metric 数据: (2) class GMetric:是定义 Ganglia 的配置参数的,所以也要首先根据 Ganglia 的配置情 况初始化一个 GMetric 对象. 16
  • new GMetric(gHost, gPort, gMode, gV31x)。 // 这几个配置参数和前面讲的类似,例如:<ganglia hostname="192.168.247.130" port="8649" mode="unicast" wireformat31x="true"/> 经过测试发现目前的 jmxetric 版本和 ganglia-3.2.0 何以成功集成,jmxetric 的配置上要配置 wireformat31x="true",因为其 gmond 的消息包协议是一致的。 然后自己的测试程序就可以周期地(例如 60 秒一次),将要输出的指标数据都发给 Ganglia,再配合修改一些 report 代码和静态界面代码,就可以展示了。 当然,上述方法还需要自己实现周期数据采集和发送机制(至少实现一个定时器程序或ScheduledThreadPoolExecutor),也可以直接像正常程序一样集成一个 Jmxertic,让它用javaagent 线程来实现这个周期机制。5 Ganglia 界面定制5.1 产生报表(Report) 产品的性能指标,最好能绘制成优雅的报表图形曲线来展示,除了上节提到的每个节点缺省产生的详细指标外,我们需要将一些关键的指标抽出来汇总成报表(report)。 我们仿效 Ganglia 内置的 CPU/Memory/Network 等指标 report 的方法。在 web/graph.d目录下,有类似 cpu_report.php/load_report.php/mem_report.php 等一些现成的例子可参考。 我们为 DaStor 提供了三个新的 report 程序: dastorload_report.php:存储容量负载指标(字节数) dastorreads_report.php:读操作吞吐量指标(每秒读次数) dastorwrites_report.php:写操作吞吐量指标(每秒写次数) 下图为 dastorload_report.php 的 PHP 程序例子(整个程序是依葫芦画瓢得来的,另外两个类似): 17
  • 5.2 展示报表界面 上述 report 虽然产生出来了,但界面上还没能显示出来,这需要修改一些变量和静态页面的代码:(1) 首先修改 conf.php 中对附加图形的声明 $optional_graphs = array(packet,dastorload, dastorwrites, dastorreads); 这个变量缺省是注释掉的,须打开,并加上我们的三个报表的名字。其实我觉得 PHP 程 序应该自动程度再高点,缺省自动将 graph.d 下的 report 都显示出来(除非用户显式地隐 藏掉的)。(2) 修改静态页面 templates/default/host_view.tpl,在每个节点的页面中添加报表(同时集群 页面中也会自动相应地呈现),增加下列代码: <A HREF="./graph.php?g=dastorload_report&z=large&c={cluster_url}&{graphargs}"> <IMG BORDER=0 ALT="{cluster_url} DASTORLOAD" SRC="./graph.php?g=dastorload_report&z=medium&c={cluster_url}&{graphargs}"> </A> <A HREF="./graph.php?g=dastorwrites_report&z=large&c={cluster_url}&{graphargs}"> <IMG BORDER=0 ALT="{cluster_url} DASTORWRITES" SRC="./graph.php?g=dastorwrites_report&z=medium&c={cluster_url}&{graphargs}"> 18
  • </A> <A HREF="./graph.php?g=dastorreads_report&z=large&c={cluster_url}&{graphargs}"> <IMG BORDER=0 ALT="{cluster_url} DASTORREADS" SRC="./graph.php?g=dastorreads_report&z=medium&c={cluster_url}&{graphargs}"> </A> 下图是最终展示的图形(那几个浅蓝色底色的图形就是新加上去的) :5.3 Logo 替换和其他页面调整 只需替换 templates/default/images/logo.jpg 即可。 其他的页面调整,我们可以继续修改 templates 中这些静态页面模板的代码,做一些简单的调整。5.4 多种界面风格 在 DaStor 产品中,为了和 default 的界面风格 templates 共存,我们在 templates 目录下可以创建多个风格文件目录,DaStor 将自己的目录定位 dastor。相应地,需要在 conf.php 中配置:$template_name = "dastor";。6 Ganglia 的 Shell Script 集成 前面提到过 gmetric 这个工具,特别适合写一些 shell script 采集数据,将它们发到 Ganglia展示。 例如,我们需要采集 iostat 中的 iowait 和%util 两个常用的磁盘性能参数,就可以写个脚本采集 iostat 的输出,将 iowait 和%util 两个指标用 gmetric 发到 gmond。将这个脚本配置到 19
  • crontab 中每分钟执行一次,就可以了。 我们写过一个比较土的 iostat 的脚本,目前在公司和 Pangu 都在用: iostat.sh 展示的图形如下: 注意:ganglia-3.1.7 及以前的版本中的 gmetric 不能指定所发 metric 的 group,所以显示的界面上会看到其 group name 为”no_group metrics”,如下图。目前的 3.2.0 版本的 ganglia中完善了这个功能,可以通过”--group=STRING”指定 group name。 类似脚本参考:https://github.com/ganglia/gmetric/tree/master/disk/diskio.pl 还有很多脚本:https://github.com/ganglia/gmetric。7 深入 Ganglia 本文写的都是比较浅的使用放过,如果要深入,需要大家具体细致地去实施。 如果要继续深入地使用 Ganglia,甚至在正式的产品中集成 Ganglia,那就需要对 Ganglia进行深入的研究和使用。这里只列出一些参考参考资料: http://ganglia.info/ 主站。 https://github.com/ganglia 有很多扩展的 contributes 可参考或拿来修改使用。 http://www.ibm.com/developerworks/wikis/display/WikiPtype/ganglia 深入集成 Ganglia 的话,我们必须多读上述文档资料,熟悉 Ganglia 提供的 API(目前以 C为主),特别是要熟悉下面几点:  Ganglia 内部的原理:多看文档。  Ganglia 的 API 和工具接口:看文档,结合 API 代码。  Ganglia 对外的接口协议格式:比如我们的 jmxetric 就是直接封装 gmond 能接收的 udp 消息格式, 直接发送给它的。 经过测试发现目前的 jmxetric 版本和 ganglia-3.2.0 何以集成成功,jmxetric 的配置上要配置 wireformat31x="true"。  界面的修改,产品包装一定要修改界面,要对 PHP 和 HTML 有些了解。  Ganglia 相关的一系列工具,比如和 Nagios 集成,各种各样的脚本等。  多看其他例子。 20
  • 8 其他相关项目Ganglia 在公司的多个项目中都在使用,可相互借鉴经验。 DaStor 对 Ganglia 做了比较多的定制和集成,使用了 jmxetric 等工具。参考本文前面的介绍 和 DaStor 的代码。 相关人员:Anty,Schubert 等。 oHive 和 DaStor 类似的用法,结合了 Python 的集成。 相关人员:Terry 等。 CloudMaster 这是公司新成立的项目组开发的新的 CloudMaster,深度集成和定制了 Ganglia。 相关人员:Hackie 等。 Pangu 运维 这里的开发和定制应该不多,但所管理的集群是最大的,几百台主机。 其他 在很多测试场合都在用。 21