Deploy a Ganglia Monitoring System

Intro

Ganglia是一个分布式的开源集群监控系统,主要包括gmond,gmetad,gweb三个模块,其独特的网状结构具备强大的伸缩性,通过组播(multicast)/UDP的的通信方式Ganglia可以很轻松监控成千上万(丝毫不夸张)的服务器集群,且不存在单点故障的问题。

Deploy

Ganglia代码托管在SourceForge上,代码中自带RPM编译定义文件,通过rpmbuild可以很容易编译出RPM包:

rpmbuild -bb ganglia.spec

rpmbuild -bb ganglia-web.spec

以CentOS x86平台为例,最后得到一系列的软件包:

  • libganglia-3.5.0-1.i386.rpm
  • ganglia-devel-3.5.0-1.i386.rpm
  • ganglia-gmond-3.5.0-1.i386.rpm
  • ganglia-gmetad-3.5.0-1.i386.rpm
  • ganglia-gmond-modules-python-3.5.0-1.i386.rpm
  • ganglia-web-3.5.7-1.noarch.rpm

Config

gmond - Ganglia Monitoring Daemon

gmond是一个部署在服务器节点上的轻量级数据采集程序,通过简单的监听/广播协议,服务器的数据在集群各个节点间共享。配置文件位于/etc/ganglia/gmond.conf,以组播的方式为例,比较基础的配置有:

globals {
  mute = no   /* 是否广播数据 */
  deaf = no   /* 是否监听其他节点的数据 */
}

udp_send_channel {
  mcast_join = 239.2.11.71    /* 组播地址 */
  port = 8639                 /* 发送端口 */
  ttl = 1                     /* 最大路由跨域跳数 */
}

upd_recv_channel {
  mcast_join = 239.2.11.71    /* 组播地址 */
  port = 8649                 /* 接收端口 */
}

若需要考虑安全问题可以通过ACL配置访问权限:

acl {
  default = "deny"
  access {
    ip = 192.168.0.0
    mask = 24
    action = "allow"
  }
}

gmetad - Ganglia Metad Daemon

gmetad负责从网络上的其它gmond/gmetad节点上收集信息数据,数据以RRD格式保存在本地磁盘。配置文件位于/etc/ganglia/gmetad.conf,主要的配置项为:

/* 定义数据源,格式为 `标识` `采集间隔` `节点列表` */
data_source "my cluster" 10 localhost  my.machine.edu:8649  1.2.3.5:8655
data_source "my grid" 50 1.3.4.7:8655 grid.org:8651 grid-backup.org:8651 

gridname "NERV"       /* 集群标识 */

rrd_rootdir "/var/lib/ganglia/rrds"     /* RRD数据文件存放地址 */

data_source中的采集间隔参数可以省略,默认为15秒,gmetad会根据节点列表的定义顺序收集数据,若某个节点失效会自动访问下个节点。gmetad会自动判断节点的类型(gmond/gmetad),若节点是gmetad的话则将只保存该集群的摘要RRD数据。

gweb - Ganglia Web

Ganglia自带一个网页前端,主要架构为PHP+Dwoo+jQuery,网站目录默认安装在/var/www/html/ganglia,自带的jQuery UI主题比较难看,可以通过修改ganglia/templates/default/header.tpl定制样式。在/var/lib/ganglia-web/conf下可通过JSON文件自定义视图(Views),图表定义可参考/var/www/html/ganglia/graph.d/sample_report.php及该目录下的文件。

gmond-modules (Python)

除了C/C++外,gmond还支持通过Python扩展监控模块,代码结构可参考/usr/lib/ganglia/python_modules/目录下的example.py文件,模块编写完后需要在/etc/ganglia/conf.d下添加对应的pyconf文件来启用(安装ganglia-gmond-modules-python时会自动添加modpython.conf,该配置负责导入pyconf模块),需要注意的是配置文件名必须与gmond模块定义文件一致。

Go

Ganglia安装完成后会在/etc/init.d/下添加对应的服务脚本,因此只要将gmond/gmetad服务添加到系统中就可以了:

chkconfig gmond on
service gmond start

Ganglia-Web作为正常的PHP网站部署配置就可以了,以Nginx为例:

{
  # ...

  root        /var/www/html/ganglia;

  index       index.php;

  location ~ \.php$ {
      fastcgi_pass    localhost:9000;
      fastcgi_index   index.php;

      include         fastcgi_params;

      fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
  }

  location ~* \.(js|css|png|jpg|jpeg|git|icon)$ {
      expires         30d;
  }

  # ...
}

上面只是粗略介绍了Ganglia的基本结构及部署方式,官网很遗憾没有更加详细的文档,不过倒是有一本《Monitoring with Ganglia》可以深入阅读。