一、Ganglia概述
规模的问题
Ganglia的运行和绝大多数监控系统是不一样的, Ganglia设计最大的考虑就是为了解决规模的问题。
主机即监控系统
基于冗余的结构
Ganglia 假设用户主机存在冗余,或至少按照某种意义进行分组。
Ganglia是否适合基于以下一些前提:
① 拥有一些装有多用途操作系统的计算机(如非路由器、交换机等),并且希望获得它们近实时的性能信息。实际上,结合sFlow代理, Ganglia也可以用来监控路由器和交换机之类的网络设备。
② 不介意在所有主机上维护一份配置文件。
③ 主机可以(至少松散地)划分为多个分组。
④ 操作系统和网络兼兼容多播或用户数据报协议UDP。
Ganglia在结构上由三种守护进程组成gmond 、gmetad和gweb。在操作上,每种守护进程都是独立的,运行时只需要自己的配置文件来操作即可,任意守护进程在缺少其他两种守护进程的情况下也可以正常启动和运行。然而, 三者在结构上又是相互协作的,需要同时使用才能发挥功效。
gmond
gmond和普通代理一样,安装在每一台需要监控的主机上,负责与操作系统交互以获得需要关注的指标数据,例如CPU负载和硬盘容量。
gmond在内部采用模块化设计,采用基于C语言编写的、根据操作系统定制的插件进行监控。和其他监控系统采用的客户端代理软件不同, gmond不需要等待外部轮询引擎的数据监测请求,也不将监控数据直接上传至集中式轮询器,而是根据自己本地配置文件定义的调度方案进行轮询。监测数据时使用简单的监听/通告协议,通过 XDR (External Data Representation)在集群内的主机之间共享。因此,Ganglia集群内的每个节点都知道同一集群内所有主机的当前指标数据。远程轮询器可以通过端口8649 向集群内任意节点请求获得该集群XML格式的所有数据。
gmond并不是消极等待被监控系统服务器唤醒,而总是处于激活态,以便进行测量、传输和共享。轮询器不再需要知道从哪些主机获取哪些服务,而只需要一个包含每个集群内至少一台主机名称的列表即可。
gmetad:整合所有信息
gmeted是一个简单的轮询器,对网络中每个集群进行轮询,并将每台主机上返回的所有指标数据写入各个集群对应的轮询数据库RRD。
作为数据存储的一种流行的解决方案,RRDtool是很好的选择。指标数据存储于轮询数据库(Round Robin Database),这种数据库包含了多个时间块内静态分配的数值。如果每10秒进行一次轮询,每次数据都进行存储,一天将需要8640次存储。考虑到数据保留需求, RRDtool 内部以“循环覆盖”的方式管理数据,将新数据的值叠加到原来的数值上来覆盖原有数据。
gweb
Ganglia可视化工具——gweb无需用户进行任何自定义设置即可便捷、及时地访问网络中任意一台主机的任意一种指标数据。
二、Ganglia的安装和配置
安装gmond
gmond ( Ganglia Monitoring Daemon )是一种轻量级服务,安装在每台需要收集指标数据的节点主机上。gmond在每台主机上完成实际意义上的指标数据收集工作,并通过侦听/通告协议和集群内其他节点共享数据。使用gmond ,可以很容易收集很多系统指标数据,如CPU 、内存、磁盘、网络和活跃进程的数据等。
Debian Linux:sudo apt-get install ganglia-monitor
RPM Linux:yum installganglia-gmond
安装gmetad
gmetad ( Ganglia Meta Daemon )是一种从其他gmetad或gmond源收集指标数据,并将其以RRD格式存储至磁盘的服务。gmetad为从主机组收集的特定指标信息提供了简单的查询机制,并支持分级授权,使得创建联合监测域成为可能。
Debian Linux:sudo apt-get install gmetad
RPM Linux:sudo yum install ganglia-gmetad
安装gweb
完整的Ganglia不能缺少网络接口: gweb ( Ganglia Web ) 。为了评估集群的运行状态,在收集多种不同指标数据后,我们需要这些指标数的展现形式可视化,更希望能够在Web界面中以图表方式展现。gweb 由此应运而生。gwe b是一种利用浏览器显示gmetad所存储数据的PHP前端。
Debian Linux:apt-get install apache2 php5 php5-json
如果执行以上命令后,gweb还不能运行,执行以下命令以启动PHP JSON模块:
grep ^extension=json.so /etc/php5/conf.d/json.ini
如果该模块还不能运行,执行以下命令:
echo ‘extension=json.so’ >> /etc/php5/conf.d/json.ini
接下来下载最新版本的gweb(https ://ganglia.info/download),解压并编译Makefile来安装gweb:
tar -xvzf ganglia-web-major.minor.release.tar.gz
cd ganglia-web-major.minor.release
编译Makefile并设置变量DESTDIR和APACHE_USER。在Debian Linux上,默认设置为:
# Location where gweb should be installed to
DESTDIR = /var/www/html/ganglia2
APACHE USER =WWW-data
...
最后,运行以下命令:
make install
Ganglia的配置
① gmond.conf
拓扑考虑:
gmond默认拓扑为多播模式,也就是说集群内所有节点都收发指标数据,每个节点维护一个内存数据库一一以哈希表的形式存储集群内所有节点的指标数据。
gmond 内部的发送和接收两部分互不相连。指标模块收集的本地数据通过发送部分直接传送到网络,而接收部分的内部数据库只存储从网络种收集的指标数据。
“单发”节点的使用消除了大型集群的运行开销。单发和单收参数的出现使得一些gmond节点可以充当其他gmond节点的专用汇聚器和中继器。单收指的是那些不传送数据的节点,它甚至不收集本节点的指标数据,但是却汇聚集群内其他gmond的指标数据。单发指的是那些不接收任何网络中指标数据,也不侦听多播成员状态信息的节点,只要它不同时是单收节点,就可以继续为其他侦听节点发送指标数据。
多播并不是所有拓扑所必需的。在多播不适用的情况下,这种单发/单收拓扑可以使用UDP单播来实现。
配置文件:
命令:gmond -t
生成默认配置文件。配置文件分为两个逻辑分类,第一类的section处理主机和集群的配置;第二类种的section处理指标数据收集和调度的特定问题。
【section:globals】
setuid:为true时,gmond将User属性指定的特定用户的UID作为有效UID;当值为false时,gmond将不会改变其有效用户。
mute:为true时,gmond将不能发送数据。但可以响应诸如gmetad的外部轮询器。
deaf:为true时,gmond将不能接收数据。
host_dmax:值为0时,即使远程主机停止报告,gmond也不会从列表里删除该主机。如果host_dmax为正值,当gmond在host_dmax秒内接收不到某台主机的数据,gmond将删除该主机。
host_tmax:gmond等待一台主机更新的最长时间。如果在4倍host_tmax时间内接收不到某台主机的任何消息,gmond就认为该主机已经崩溃。
cleanup_threshold:gmond清除过期数据的最小时间间隔。
gexec:为true时,gmond将允许主机运行gexec任务。这种方式需要运行gexecd并安装合适的验证码。
send_metadata_interval:gmond两次发送指标数据的时间间隔。在单播模式下必须设置重发间隔。
【section:cluster】
name:集群名称
owner:集群管理员
②gmetad.conf
gmetad ( Ganglia Meta Dae mon )是一种安装在主机上用来收集和汇聚gmond所收集的指标数据的守护进程。gmetad默认使用RRD文件收集和汇聚指标数据,然而也可以通过配置gmetad将指标数据转送到诸如Graphite的外部系统。
gmetad通过tcp端口8651侦听远程gmetad连接,并且向授权主机提供XML格式的网格状态。gmetad也通过tcp端口8652对交互式请求做出应答。
gmetad拓扑:
最简单的gmetad拓扑结构为一个gmetad进程轮询一个或多个gmond。冗余性或高可用性是一项基本要求,比如两个(冗余)gmetad轮询同一集群内的多个gmond。同时,gmetad并不局限于轮询gmond,gmetad也可以通过轮询另外的gmetad来创建层次化的gmetad结构。
gmetad默认将指标数据直接写入文件系统上的RRD文件。在有I/O限制的大型装置中,rrdcached充当gmetad和RRD文件之间的缓存。
data_source 属性。data_source属性是gmetad配置的核心。每一行data_source描述一个gmetad收集信息的gmond集群或gmetad 网格。
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
data source ” another source” 20 1.3.4,8:8655 1.3,4,8
每个data_source 由3个字段组成。第一个字段为唯一标识data source的字符串;第二个字段为指定轮询间隔(单位:秒)的数字;第三个字段为以空格分开的所要轮询数据的主机列表,这些地址以IP地址或DNS主机名的形式指定,并可能添加“ :端口号”形式的后缀。
【注意】gmetad 会依次检测指定主机,并从第一台响应主机开始收集状态数据,所以无需在data_source定义里指定集群内的所有主机。假若有节点失效,通常指定两三个主机也就足够保证数据的收集。
【gmetad守护进程行为】
gridname:
能唯一标识网格的字符串。该字符串应该与gmond 中所设置的标识符不同。在gmond.conf的(at cluster { name =“xxx”}) CLUSTER标识符中,用来表示gmond实例能收集到所有主机,而gridname属性则表示由GRID标识符指定的所有数据源,可以理解为在data source中定义的一个集群集合。
authority (URL):
网格的授权RL ,被其他gmetad用来找到当前gmetad数据掘的图表位置。默认为“ http://hostname/ganglia/”
trusted hosts (文本格式):
当前gmetad允许数据共享的主机列表,以空格作为分隔。localhost总是可信的。
all_trusted (on/off)
当该值设置为on时 ,将重写trusted_hosts属性,允许数据和任意主机共享。
xml_port (数字)
gmetad侦听端口,默认为8651
interactive_port (数字)
gmetad交互式侦听端口,默认为8652
server threads (数字)
允许同时连接到侦听端口的连接数,默认为40
RRDtool属性:
rrd rootdir (路径)
指定RRD文件在本地文件系统存储的基本目录。
Graphite支持。通过设置下列属性,可以将gmetad收集到的指标数据输出到Graphite 。
Graphite是一种外部开源指标数据存储和可视化工具。
carbon_server (地扯)
远程carbon守护进程的主机名或IP。
carbon_port (数字)
carbon端口号,默认2003
carbon timeout (数字)
gmetad等待Graphite服务器响应的毫秒数。该.置很重要,因为metad的carbon发送器不是线程的,需要收到来自下游carbon守护进程的响应才能进行后续发送。默认为500
③gweb
templates (路径)
指定gweb搜索模板文件的目录。模板就像网站的皮肤,可以改变其网站的外观和感觉。
graphdir (路径)
代表用户放置JSON格式的定制图表的路径。
rrds (路径)
指定RRD文件目录。
auth_system (readonlyJenabledJdisabled)
gweb包含一个简单的授权系统,它可以选择性允许或拒绝单个用户访问特定应用部分。将auth_ system设置为nabled时启动该系统。
rrdcached socket (路径)
指定rrdcached socket 连接路径。rrdcached是一种高性能缓存守护进程,通过缓存和合并写入来减轻与RRD数据写入相关的负载。
graph_engine (rrdtoolJgraphite)
gweb可使用Graphite (而非RRDtool )作为在UI上生成图表的工具。
启动进程
①如果使用UDP单播拓扑,首先启动UDP汇聚节点,以确保它在其他节点首次传输元数据时处于侦听状态
②启动所有其他gmond程序。
③如果使用rrdcached ,启动所有rrdcached程序。
④启动层次结构中最低级别的gmetad程序
⑤按照层次顺序启动其他所有的gmetad程序。
⑥启动Apache网络服务器。Web 服务器应在gmetad之后启动。
检查安装
gmond 和gmetad都通过TCP socket侦听入站连接。为了检查gmond是否在指定的主机上工作, telnet到gmond的TCP端口:
telnet localhost 8649
gmond会输出XML格式的指标数据作为应答。
三、可扩展性
gmond和ganglia集群的可扩展性
在发送/接收节点数量不多的小型网络中,通常默认的多播拓扑就够用了,但是在大型网络中最好进行可扩展性分析。
内存影响:节点数越多,从每个节点上收集的指标就越多,则用来收集其他节点指标的gmond进程的内存消耗也就越大。
CPU影响:gmond是单线程工作的,因此网络中指标到达速率越快, CPU 内核使用就越多。指标到达速率依赖三方面:节点数量、每个节点的指标数量和节点配置的传输新值的速率。
RRD文件结构和可扩展性
Ganglia对每个检测指标创建一个RRD文件,而不是将多个数据源的指标数据包含在同一个RRD文件中。
gmetad启动阶段的大量I/O需求
为了确保主机长时间停机后的顺利启动,规划时要认真考虑存储系统、采样间隔和保留时间等问题。
正常运行期间gmetad的I/O需求
实时写入的负荷:
非连续写入和并发存取一起造成了磁盘写访问模式的随机化
网络图表/报告的读取操作
报告的读取操作
预测I/O负荷
仔细规划和实时监测gmetad服务器时非常有必要的:
①取决于所需的RRA结构(采样间隔、保留时间以及MIN 、MAX或AVERAGE等函数)。
②为一个RRD文件创建足够大的逻辑卷( 4MB 即可)。格式化井挂载该逻辑卷。在新的文件系统上创建一个RRD文件样本。
③使用iostat观察逻辑卷上的写I/O:
iostat -k 60 -x /dev/dm-X
其中X代表实际的设备节点。
④为了观察iostat I/O级别,可以使用rrdupdate命令( man rrdupdate )手动向RRD文件写入更新
⑤观察iostat命令的输出,查看发生了多少读写IOPS ,注意查看的是IOPS计数值,而非速率。
⑥将IOPS计数值除以$PERIOD得到系统实时运行的真实IOPS速率(仿真运行速率大于实际运行速率,所以iostat报告的速率没有意义)。将IOPS速率乘以主机数和需要收集的指标数量,即可估计实时I/0 负荷
⑦用rrdcached重复仿真。
处理gmetad大量I/O需求的通用策略
①将RRD文件存储在高速磁盘(RAID0、SAN、SSD)
事实证明在SAN或SSD (solid-state drive )中存储RD文件时,系统性能更好。
②使用具有较大写人缓存的磁盘控制器
许多RAID控制器现在提供512MB 或IGB 的写入缓存。此外,这些控制器通常提供电池备份和闪存备份选项,以保证大容量写入缓存的可靠性。
③不要使用NFS
NFS通过严格的协议来确保完全执行硬盘写入。虽然这种方法在客户端/服务器模式中非常可靠(必需),但是对于I/O需求很大的应用,尤其是还需要访问多个文件时,NFS就不适用了。
④使用noatime选项挂载文件
开启noatime选项可以减少大量非必需的1/0操作,从而获得大量增益。
⑤在RAM磁盘上存储RRD文件
⑥使用rrdcached
rrdcached 是一种接收RRD文件更新,并计算更新量的守护进程,当接收到足够的更新或超过预定义时间时,该守护进程将向RRD文件中写入更新。
⑦设置反向代理
使用Squid之类的Web代理可以缓存图表,当多用户使用同一图表时就没有必要重复产生。通过这种方式可以动态减少I/O读取负荷。
⑧预先生成报告
设置计划任务( cron job )以预期间隔准备静态HTML报告。使用户方问静HTML报告,而不是直接访问gweb
⑨确保有足够的RAM
当更新RRD时, rrdtool必须读取和写入整个磁盘块,而不是只写入需要更改的字节。因此使用足够多的RAM作为页面存储器来缓存活动的磁盘块(每个RRD文件至少一个4096字节的块),可以避免在写I/O执行前rrdtool需要从磁盘读取块。
四、指标管理和扩展
gmond:指标收集代理
在单播模式中,叶子节点是通过UDP连接,而非多播通道进行数据发送。在同一集群内可以同时使用多播模式和单播模式。
基本指标
使用Ganglia 自带的小型实用程序gmetric ,可以收集附加指标,并将其写入gmond代理所监听的单播通道和多播通道中。虽然gmetric提供了一种将新指标插入系统的方法,但实际上gmond还是不能收集
硬编码指标集合外的任何指标。扩展功能的引人必将增加gmond的主机占用,使指标偏差的风险加大,但如果采用模块接口的方式扩展gmond,用户可以通过配置将gmond的主机占用做到可控。
扩展指标