Ganglia简介
对基础设施的监控主要包括三个方面:状态,性能和可用性。通俗的讲就是:是否在干活,干了多少活,还能干多少。
有很多开源的强大工具可以用于监控,比如 Cacti, Nagios 以及比较新的 Shinken和 Zabbix。 这些工具的主要功能是状态监控和报警——就像一个合格的监工,随时掌握基础设施是否在干活,发现谁没干活马上报告。
如果是传统的运维工作,有这些工具就足够强大了。但是对于分布式系统的开发+运维人员(DevOps?),更关心的是掌握分布式系统的性能和可用性,根据数据做出性能调整、升级、扩容等的决策,从而保证基础设施服务能够满足不断增长的业务需求。
Ganglia就是这样一种工具。Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点。Ganglia主要监控集群的性能指标,如cpu 、mem、硬盘利用率, I/O负载、网络流量情况等, 也可以监控自定义的性能指标。通过Ganglia绘制的曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体性能起到重要作用。
gmond 带来的系统负载非常少,这使得它成为在集群中各台计算机上运行的一段代码,而不会影响用户性能。
Ganglia架构
Ganglia的整体架构如下图所示:
- 每个被检测的节点或集群运行一个gmond进程,进行监控数据的收集、汇总和发送。gmond即可以作为发送者(收集本机数据),也可以作为接收者(汇总多个节点的数据)。
- 通常在整个监控体系中只有一个gmetad进程。该进程定期检查所有的gmonds,主动收集数据,并存储在RRD存储引擎中。
- ganglia-web是使用php编写的web界面,以图表的方式展现存储在RRD中的数据。通常与gmetad进程运行在一起。
其中,RRDtool(Round Robin Database tool,环状数据库工具)是一组操作RRD数据的API,支持数据图形化。RRD是一种环状数据库技术,只存储固定数量的数据,新的数据会覆盖最旧的数据。 更多信息可以参考RRDtool简体中文教程 v1.01。
Ganglia规划
在动手部署Ganglia之前,首先要对监控体系进行初步的规划。主要考虑两方面的问题:
-
单集群 or 多集群
如果节点较少,使用单集群配置起来更容易; 如果节点很多,使用多集群可以避免广播风暴。但是需要为每个集群配置不同的组播通道(通过端口区分),同时要配置gmetad同时监听这多个通道。
-
组播模式 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
访问。如果提示权限问题,需要检查:
- selinux设置
- 防火墙设置
- /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
文件:
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可以访问的前提下,只需要做如下配置:
- 将python_modules/目录下的文件复制到gmond节点的
/usr/lib64/ganglia/python_modules
目录。这是执行数据采集的脚本 - 将conf.d/目录下的文件复制到gmond节点的
/etc/ganglia/conf.d/
目录。这些文件定义了collection_group以及metric - 重启gmond
- 将graph.d/目录下的文件复制到gmetad节点的
/usr/share/ganglia/graph.d
目录。这些文件定义了如何绘制metric的图形 - 重启gmetad,在对应的nginx节点详细信息中可以看到nginx metric对应的7个图表。
理解了NginX插件,基本上能够自己开发Ganglia插件了。
TODO:与Nagios结合使用
Nagios提供了很好的报警机制,将Ganglia与Nagios结合使用是常见的方式。
http://thinkinside.tk/2013/07/30/ganglia.html