0%

用Ganglia监控集群的性能

对基础设施的监控主要包括三个方面:状态,性能和可用性。通俗的讲就是:是否在干活,干了多少活,还能干多少。与Cacti、Nagios、Zabbix等工具相比,Ganglia更关注整个集群的性能和可用性。可以用于集群的性能监控、分析和优化。

Ganglia简介

对基础设施的监控主要包括三个方面:状态,性能和可用性。通俗的讲就是:是否在干活,干了多少活,还能干多少。

有很多开源的强大工具可以用于监控,比如
Cacti
Nagios
以及比较新的
Shinken
Zabbix
这些工具的主要功能是状态监控和报警——就像一个合格的监工,随时掌握基础设施是否在干活,发现谁没干活马上报告。

如果是传统的运维工作,有这些工具就足够强大了。但是对于分布式系统的开发+运维人员(DevOps?),更关心的是掌握分布式系统的性能和可用性,根据数据做出性能调整、升级、扩容等的决策,从而保证基础设施服务能够满足不断增长的业务需求。

Ganglia就是这样一种工具。Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点。Ganglia主要监控集群的性能指标,如cpu 、mem、硬盘利用率, I/O负载、网络流量情况等,
也可以监控自定义的性能指标。通过Ganglia绘制的曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体性能起到重要作用。

gmond 带来的系统负载非常少,这使得它成为在集群中各台计算机上运行的一段代码,而不会影响用户性能。

Ganglia架构

Ganglia的整体架构如下图所示:

  1. 每个被检测的节点或集群运行一个gmond进程,进行监控数据的收集、汇总和发送。gmond即可以作为发送者(收集本机数据),也可以作为接收者(汇总多个节点的数据)。
  2. 通常在整个监控体系中只有一个gmetad进程。该进程定期检查所有的gmonds,主动收集数据,并存储在RRD存储引擎中。
  3. ganglia-web是使用php编写的web界面,以图表的方式展现存储在RRD中的数据。通常与gmetad进程运行在一起。

其中,RRDtool(Round Robin Database tool,环状数据库工具)是一组操作RRD数据的API,支持数据图形化。RRD是一种环状数据库技术,只存储固定数量的数据,新的数据会覆盖最旧的数据。
更多信息可以参考RRDtool简体中文教程 v1.01

Ganglia规划

在动手部署Ganglia之前,首先要对监控体系进行初步的规划。主要考虑两方面的问题:

  1. 单集群 or 多集群

    如果节点较少,使用单集群配置起来更容易;
    如果节点很多,使用多集群可以避免广播风暴。但是需要为每个集群配置不同的组播通道(通过端口区分),同时要配置gmetad同时监听这多个通道。

  2. 组播模式 or 单播模式

    组播模式是ganglia的默认模式,同一集群的多个gmond之间互相交换数据,gmetad中可以指定集群中的任意一个或多个节点作为”data_source”;

    组播模式可能会带来网络的 “抖动(Jitter)”。据说设置节点的时钟同步可以避免抖动的问题; 但如果网络环境不支持组播(比如Amazon’s AWS EC2),就需要使用单播模式。单播模式时,将大部分节点的gmond.conf中,global的deaf设置改为”yes”,则这些节点只发生数据,不接收其他节点的数据,同样也不能作为gmetad中的”data_source”。

    单播模式中还需要设置“send_metadata_interval”,比如30秒。以强制发送元数据。

ganglia将一个gmetad覆盖的所有集群/节点称为一个grid。可以在/etc/ganglia/gmetad.conf中通过gridname指定其名称。多个grid的数据也可以聚合到一个上级gmetad中。

安装和配置

安装

在RHEL/CentOS上如果配置了EPEL源,则安装变得非常简单。用yum可以查到如下软件包:

  • ganglia.i686 : Ganglia Distributed Monitoring System
  • ganglia.x86_64 : Ganglia Distributed Monitoring System
  • ganglia-devel.i686 : Ganglia Library
  • ganglia-devel.x86_64 : Ganglia Library
  • ganglia-gmetad.x86_64 : Ganglia Metadata collection daemon
  • ganglia-gmond.x86_64 : Ganglia Monitoring daemon
  • ganglia-gmond-python.x86_64 : Ganglia Monitor daemon python DSO and metric modules
  • ganglia-web.x86_64 : Ganglia Web Frontend

在不同的节点选择对应的软件包安装即可。

配置防火墙规则

gmond和gmetad之间默认使用UDP的8649端口进行通信,如果配置多个集群,还会有其他端口。要保证这些端口畅通。

配置被监控节点(/etc/ganglia/gmond.conf)

最重要的配置是集群名称(cluster.name)。

如果要配置多个集群,每个集群要使用不同的端口。共三个地方:

  • udp_send_channel.port
  • udp_recv_channel.port
  • tcp_accept_channel.port

配置中心节点(/etc/ganglia/gmetad.conf)

最重要的是配置数据源。比如:

data_source "NginX" a.a.a.101:8661 a.a.a.102:8661
data_source "LVS"   b.b.b.101 b.b.b.102

配置web

默认启动httpd服务后,就可以通过http://IP/ganglia访问。如果提示权限问题,需要检查:

  1. selinux设置
  2. 防火墙设置
  3. /etc/httpd/conf.d/ganglia.conf中的Deny from all限制

扩展监控功能

Ganglia默认只监控一些通用的性能指标,如果要监控自定义的指标,就需要对Ganglia进行扩展。

插件机制

从Ganglia 3.1开始,可以使用python开发的插件对Ganglia进行扩展。

/etc/ganglia/gmond.conf配置中通常会包含:

include ('/etc/ganglia/conf.d/*.conf')

如果安装了ganglia-gmond-python软件包,会创建一个/etc/ganglia/conf.d/modpython.conf文件:

1
2
3
4
5
6
7
8
9
modules {
module {
name = "python_module"
path = "modpython.so"
params = "/usr/lib64/ganglia/python_modules"
}
}

include ('/etc/ganglia/conf.d/*.pyconf')

这样,就可以用python编写自定义的插件。

Ganglia 在 GitHub 上已经收集了一些常用的python插件

部署NginX插件

常用的python插件中包含了
nginx_status插件
该插件利用NginX的状态监控功能获取数据。

在确保nginx_status可以访问的前提下,只需要做如下配置:

  1. 将python_modules/目录下的文件复制到gmond节点的/usr/lib64/ganglia/python_modules目录。这是执行数据采集的脚本
  2. 将conf.d/目录下的文件复制到gmond节点的/etc/ganglia/conf.d/目录。这些文件定义了collection_group以及metric
  3. 重启gmond
  4. 将graph.d/目录下的文件复制到gmetad节点的/usr/share/ganglia/graph.d目录。这些文件定义了如何绘制metric的图形
  5. 重启gmetad,在对应的nginx节点详细信息中可以看到nginx metric对应的7个图表。

理解了NginX插件,基本上能够自己开发Ganglia插件了。

TODO:与Nagios结合使用

Nagios提供了很好的报警机制,将Ganglia与Nagios结合使用是常见的方式。