AndyViky 2011-02-10
简介: 这是两部分系列文章的第一篇文章,介绍使用开源工具 Ganglia 和 Nagios 监视数据中心的解决方案。在第 1 部分中,查看如何安装和配置 Ganglia,它是基于层次结构设计的高性能集群的可扩展、分布式监视系统。此外,通过编写 Ganglia 插件并启用外部欺骗(spoofing),了解如何添加更多监视功能。
<!--<p class="ibm-no-print"><div id="dw-tag-this" class="ibm-no-print"></div><div id="interestShow" class="ibm-no-print"></div></p>-->
发布日期: 2009 年 4 月 13 日
级别:中级
其他语言版本:英文
访问情况3254次浏览
建议: 2 (查看或添加评论) <!-- Rating_Area_Begin --><!-- Ensure that div id is based on input id and ends with -widget -->随着数据中心的增长和管理人员的缩减,对计算资源使用有效监视工具的需求变得比以往更加迫切。术语监视 在应用到数据中心时可能会让人混淆,因为它的含义会根据具体的说话者和听众而有所不同。例如:
面对如此多的定义,您必须查找大量的代码才能监视您真正想要监视的内容,不仅如此,还存在无数的产品和服务。可是幸运的是,许多监视工具都是开源的 —— 实际上,某些开源工具的表现比尝试完成同样工作的某些商业应用程序还要好。
使用开源监视工具最困难的部分是实现适合环境的安装和配置。使用开源监视工具的两个主要问题是:
顺便说一句,商业监视工具也同样存在这两个问题。
因此,我将介绍 Ganglia 和 Nagios,这是两个用于监视数据中心的工具。这两个工具被大量用于高性能计算(HPC)环境中,但是它们对于其他环境也具有很大的吸引力(例如云、呈现集群和托管中心)。此外,两者对监视的定义也采取了不同的侧重点。Ganglia 更多地与收集度量数据并随时跟踪这些数据有关,而 Nagios 一直致力于成为一种报警机制。
随着独立项目的发展,逐步出现了交叠。例如:
虽然这些工具在某些功能领域里已经发生交叠,但是两者之间还是有许多不同之处,可以让您从运行这两个工具中获益。同时运行两个工具可以相互弥补不足:
还有其他开源项目也可以完成这两个工具完成的工作,并且有些项目在某些领域做得比其他项目好。常用开源监视解决方案包括 Cacti、Zenoss、Zabbix、Performance Copilot(PCP)和 Clumon(而且我相信您已经有了自己喜欢的选择)。这些工具(包括 Ganglia 和一些 Nagios 插件)中的许多工具在底层都使用了 RRDTool 或 Tobi Oetiker 的 MRTG(Multi Router Traffic Grapher),以生成漂亮的图形和存储数据。
尽管用于监视数据中心的开源解决方案如此众多,我却经常惊讶地发现许多向外扩展的计算中心在开发自己的解决方案,而忽略其他人已经完成的工作。
在这个两部分文章中,我将讨论 Ganglia 和 Nagios,因为有一些事实证据表明这些工具是最常用的。尽管将两者集成在一起是非常普遍的实践(尤其是在一些大型的 HPC 实验室和大学里),但是我发现很少有文章对此进行介绍。
学完本系列,您应当能够安装 Ganglia 并与 Nagios 绑定在一起,并且可以回答不同的用户组向您询问的监视问题。这只是一个开始,但是应当可以帮助您了解基础知识并逐步把握集群的整体情况。
在本文中,我将指导您完成:
我们的目标 —— 设置 HPC Linux® 集群的基准监视系统,在其中可以在某个程度上解决上面所述的三个不同监视意图:
Ganglia 简介
Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点。每台计算机都运行一个收集和发送度量数据(如处理器速度、内存使用量等)的名为 gmond
的守护进程。它将从操作系统和指定主机中收集。接收所有度量数据的主机可以显示这些数据并且可以将这些数据的精简表单传递到层次结构中。正因为有这种层次结构模式,才使得 Ganglia 可以实现良好的扩展。gmond
带来的系统负载非常少,这使得它成为在集群中各台计算机上运行的一段代码,而不会影响用户性能。
所有这些数据收集会多次影响节点性能。网络中的 “抖动(Jitter)” 发生在大量小消息同时出现时。我们发现通过将节点时钟保持一致,就可以避免这个问题。
回页首
安装 Ganglia
Internet 中有许多介绍如何安装 Ganglia 的文章和参考资料。我们将重新查看我在 xCAT 维基中撰写的一篇文章。我假定出于本文的目的,操作系统是 Red Hat 5 Update 2(但是对于其他企业 Linux 操作系统,这些步骤不会有很大差别)。
先决条件
假定您已经设置了 yum 库,安装先决条件在很大程度上应当十分简单。类似于以下代码:
yum -y install apr-devel apr-util check-devel cairo-devel pango-devel libxml2-devel rpmbuild glib2-devel dbus-devel freetype-devel fontconfig-devel gcc-c++ expat-devel python-devel libXrender-devel |
(注:Yum 实际上应该可以处理大多数依赖关系,但是在我的一个测试中,我看到编译失败,而这些失败可以通过添加所有这些包来修正。)
在获得这些包之后,您需要满足另一个不在 Red Hat 库中的先决条件。您可以像下面这样获取并构建它,只要您的机器连接了 Internet:
wget \ http://ga13.files.bigpond.com:4040/fedora/linux/releases/9/Everything/source/ SRPMS/libconfuse-2.6-1.fc9.src.rpm rpmbuild --rebuild libconfuse-2.6-1.fc9.src.rpm cd /usr/src/redhat/RPMS/x86_64/ rpm -ivh libconfuse-devel-2.6-1.x86_64.rpm libconfuse-2.6-1.x86_64.rpm |
记住,镜像经常变化。如果此镜像不工作,则使用搜索引擎查找 libconfuse-2.6.-1.fc9 source RPM。
RRDTool
RRDTool 表示:轮循数据库工具(Round Robin Database Tool)。它是由 Tobias Oetiker 创建的,并且为许多高性能监视工具提供了引擎。Ganglia 是其中之一,但是 Cacti 和 Zenoss 是另外两个。
要安装 Ganglia,首先需要让 RRDTool 运行在监视服务器上。RRDTool 将提供其他程序使用的两个非常优秀的功能:
要安装 RRDTool,请运行以下代码(对 1.3.4 版和 1.3.6 版进行了测试):
cd /tmp/ wget http://oss.oetiker.ch/rrdtool/pub/rrdtool.tar.gz tar zxvf rrdtool* cd rrdtool-* ./configure --prefix=/usr make -j8 make install which rrdtool ldconfig # make sure you have the new rrdtool libraries linked. |
使用 RRDTool 作为环境中的独立工具有许多种方法,但是我在这里不会介绍这些方法。
主要 Ganglia 安装
现在已满足所有先决条件,您可以安装 Ganglia。首先需要获得它。在本文中,我们使用的是 Ganglia 3.1.1。下载 ganglia-3.1.1.tar.gz 文件并将其放在监视服务器的 /tmp 目录中。然后执行以下代??:
cd /tmp/ tar zxvf ganglia*gz cd ganglia-3.1.1/ ./configure --with-gmetad make -j8 make install |
您应当会退出,而不会遇到任何错误。如果看到错误,则可能需要检查缺少哪些库。
回页首
配置 Ganglia
现在基本安装已完成,需要设置几个配置项才能运行。执行以下步骤:
步骤 1:处理命令行文件
如下所示:
cd /tmp/ganglia-3.1.1/ # you should already be in this directory mkdir -p /var/www/html/ganglia/ # make sure you have apache installed cp -a web/* /var/www/html/ganglia/ # this is the web interface cp gmetad/gmetad.init /etc/rc.d/init.d/gmetad # startup script cp gmond/gmond.init /etc/rc.d/init.d/gmond mkdir /etc/ganglia # where config files go gmond -t | tee /etc/ganglia/gmond.conf # generate initial gmond config cp gmetad/gmetad.conf /etc/ganglia/ # initial gmetad configuration mkdir -p /var/lib/ganglia/rrds # place where RRDTool graphs will be stored chown nobody:nobody /var/lib/ganglia/rrds # make sure RRDTool can write here. chkconfig --add gmetad # make sure gmetad starts up at boot time chkconfig --add gmond # make sure gmond starts up at boot time |
步骤 2:修改 /etc/ganglia/gmond.conf
现在可以修改 /etc/ganglia/gmond.conf 以命名集群。假定集群名称为 “matlock”;则可以将 name = "unspecified"
更改为 name = "matlock"
。
步骤 3:注意多宿主计算机
在我的集群中,eth0 是我的系统的公共 IP 地址。但是,监视服务器将通过 eth1 与私有集群网络中的节点进行通信。我需要确保 Ganglia 使用的多点传送将与 eth1 绑定在一起。这可以通过创建 /etc/sysconfig/network-scripts/route-eth1 文件来完成。添加 239.2.11.71 dev eth1
内容。
然后您可以使用 service network restart
重新启动网络并确保路由器显示此 IP 通过 eth1。注:您应当使用 239.2.11.71,因为这是 ganglia 的默认多点传送通道。如果使用其他通道或者增加更多通道,请更改它。
步骤 4:在管理服务器中启动它
现在您可以在监视服务器中完全启动它:
service gmond start service gmetad start service httpd restart |
停止 Web 浏览器并将其指向位于 http://localhost/ganglia 的管理服务器。您将看到管理服务器现在处于受监视状态。您还将看到若干度量数据正受到监视并绘制曲线图。最有用的曲线图之一是您可以监视这台计算机中的负载情况。下面是我的计算机的负载情况图:
图1.监视负载
没有发生什么操作,计算机只是处于空闲状态。
把 Ganglia 放在节点上
到现在为止,我们已经完成了在管理服务器中运行 Ganglia 的工作;现在必须更多地关注计算节点。事实证明只需复制一些文件就可以把 Ganglia 放到计算节点上。这是在使用 Kickstart 时可以添加到安装后脚本中的内容或是可以添加到其他更新工具中的内容。
快速但粗糙的方法是这样的:创建一个含有所有主机名的文件。假定您有 deathstar001
-deathstar100
节点。则将拥有类似如下所示的名为 /tmp/mynodes 的文件:
deathstar001 deathstar002 ...skip a few... deathstar099 deathstar100 |
现在只需运行以下代码:
# for i in `cat /tmp/mynodes`; do scp /usr/sbin/gmond $i:/usr/sbin/gmond ssh $i mkdir -p /etc/ganglia/ scp /etc/ganglia/gmond.conf $i:/etc/ganglia/ scp /etc/init.d/gmond $i:/etc/init.d/ scp /usr/lib64/libganglia-3.1.1.so.0 $i:/usr/lib64/ scp /lib64/libexpat.so.0 $i:/lib64/ scp /usr/lib64/libconfuse.so.0 $i:/usr/lib64/ scp /usr/lib64/libapr-1.so.0 $i:/usr/lib64/ scp -r /usr/lib64/ganglia $i:/usr/lib64/ ssh $i service gmond start done |
您可以重新启动 gmetad
,刷新 Web 浏览器,然后应当会看到节点现在出现在列表中。
您可能会遇到下面这些潜在的问题:
gmond
将在端口 8649 上运行。如果 gmond
是在计算机中运行,您应当能够运行 telnet localhost 8649
命令。并看到一些 XML 输出滚动显示在屏幕中。 回页首
观察 Ganglia
许多系统工程师很难理解他们自己的工作量或者工作特性。他们可能有自定义代码或者没有对商业产品的运行进行研究。Ganglia 可以帮助剖析应用程序。
我们将使用 Ganglia 来检验运行 Linpack 基准的属性。图 2 显示了启动三项不同的 Linpack 作业的时间间隔。
图2.观察Linpack
从此图中可以看到,当作业开始时,在作业启动时网络中有一些活动。但是,有趣的是接近作业结束时,网络流量增加了很多。如果您不了解 Linpack,您至少会认为:网络流量在作业结束时增加。
图 3 和图 4 分别显示 CPU 和内存使用率。在这里,您可以看到正在逼近处理器的限制,而且内存使用率也非常高。
图3.CPU使用率
图4.内存使用率
这些图形让我们深入了解正在运行的应用程序:我们正在使用大量 CPU 和内存并且在接近作业结束时造成更多网络流量。关于这项作业还有很多其他属性是我们不知道的,但是这给我们提供了一个很好的开端。
知道这些情况可以帮助在未来购买更多硬件时做出更好的采购决定。当然,没有人购买硬件只是为了运行 Linpack ……对么?
回页首
扩展能力
基本 Ganglia 安装已经给我们提供了大量有用信息。使用 Ganglia 的插件将给我们提供两种添加更多功能的方法:
第一种方法一直是 Ganglia 的常见实践。第二种方法是最新开发的实践,并且与 Nagios 在功能上有所交叠。让我们通过一个实际示例来简要探究两种方法。
回页首
带内插件
带内插件可以通过两种方式发生。
gmetric
命令来输入数据。 第一种方法是过去常采用的方法,并且我将在下一节中讨论更多关于带外插件的内容。它的问题是无法干净地完成。Ganglia 3.1.x 添加了 Python 和 C 模块插件以使其看上去可以更加自然地扩展 Ganglia。此刻,我将向您展示第二种方法。
首先,用 Ganglia 启用 Python 插件。执行以下操作:
如果打开该文件,您会注意到:其中四分之一的内容都是类似如下所示的名为 modules
的部分:
modules { module { name = "core_metrics" } ... } |
我们将向模块部分添加另一个模块。这个必须添加的模块就是:
module { name = "python_module" path = "modpython.so" params = "/usr/lib64/ganglia/python_modules/" } |
在 gmond.conf 中,我在第 90 行添加了上一个代码段。这将允许 Ganglia 使用 Python 模块。此外,还在 include ('/etc/ganglia/conf.d/*.conf')
语句后添加一些行,添加 include ('/etc/ganglia/conf.d/*.pyconf')
行。这些包括了要添加的内容的定义。
如下所示:
mkdir /etc/ganglia/conf.d mkdir /usr/lib64/ganglia/python_modules |
为此,执行下面的操作:
现在已经设置好节点可以准备运行 Python 模块了,让我们创建一个新模块。在本例中,我们将添加一个使用 Linux IPMI 驱动程序的插件。如果不熟悉 IPMI 并且使用的是现代的 Intel 和 AMD 计算机,则请了解一下这方面的内容(请参阅 参考资料)。
我们将使用开源 IPMItool 与本地计算机中的 IPMI 设备进行通信。还有若干其他选项,如 OpenIPMI 或 freeipmi。这只是一个示例,因此如果您想要使用其他选项,那么完全没有问题。
在开始使用 Ganglia 之前,确保 IPMItool 可以在您的计算机中工作。运行 ipmitool -c sdr type temperature | sed 's/ /_/g'
命令;如果该命令不工作,请尝试装入 IPMI 设备驱动程序并再次运行:
modprobe ipmi_msghandler modprobe ipmi_si modprobe ipmi_devintf |
在运行 ipmitool
命令后,我的输出显示:
Ambient_Temp,20,degrees_C,ok CPU_1_Temp,20,degrees_C,ok CPU_2_Temp,21,degrees_C,ok |
因此在我的 Ganglia 插件中,我将只监视周围环境温度。我已经创建了一个编写得不是很好的名为 ambientTemp.py 的插件,该插件将根据在 Ganglia 维基中找到的插件使用 IPMI:
清单1.编写得不是很好的Python插件ambientTemp.py
import os def temp_handler(name): # our commands we're going to execute sdrfile = "/tmp/sdr.dump" ipmitool = "/usr/bin/ipmitool" # Before you run this Load the IPMI drivers: # modprobe ipmi_msghandler # modprobe ipmi_si # modprobe ipmi_devintf # you'll also need to change permissions of /dev/ipmi0 for nobody # chown nobody:nobody /dev/ipmi0 # put the above in /etc/rc.d/rc.local foo = os.path.exists(sdrfile) if os.path.exists(sdrfile) != True: os.system(ipmitool + ' sdr dump ' + sdrfile) if os.path.exists(sdrfile): ipmicmd = ipmitool + " -S " + sdrfile + " -c sdr" else: print "file does not exist... oops!" ipmicmd = ipmitool + " -c sdr" cmd = ipmicmd + " type temperature | sed 's/ /_/g' " cmd = cmd + " | awk -F, '/Ambient/ {print $2}' " #print cmd entries = os.popen(cmd) for l in entries: line = l.split() # print line return int(line[0]) def metric_init(params): global descriptors temp = {'name': 'Ambient Temp', 'call_back': temp_handler, 'time_max': 90, 'value_type': 'uint', 'units': 'C', 'slope': 'both', 'format': '%u', 'description': 'Ambient Temperature of host through IPMI', 'groups': 'IPMI In Band'} descriptors = [temp] return descriptors def metric_cleanup(): '''Clean up the metric module.''' pass #This code is for debugging and unit testing if __name__ == '__main__': metric_init(None) for d in descriptors: v = d['call_back'](d['name']) print 'value for %s is %u' % (d['name'], v) |
复制清单 1 并将其放到 /usr/lib64/ganglia/python_modules/ambientTemp.py 中。对集群中的所有节点都这样做。
现在我们已经把脚本添加到了集群的所有节点中,告诉 Ganglia 如何执行脚本。创建名为 /etc/ganglia/conf.d/ambientTemp.pyconf 的新文件,内容如下:
清单2.Ambient.Temp.pyconf
modules { module { name = "Ambient Temp" language = "python" } } collection_group { collect_every = 10 time_threshold = 50 metric { name = "Ambient Temp" title = "Ambient Temperature" value_threshold = 70 } } |
将清单 2 保存到所有节点上。
重新启动 gmond
之前必须完成的最后一件事是更改 IPMI 设备的权限,这样没有人 可以对它执行操作。这将使您的 IPMI 接口极易受到恶意攻击!
这只是一个示例:chown nobody:nobody /dev/ipmi0
。
现在在所有位置重新启动 gmond
。如果运行正常,则应当可以刷新 Web 浏览器并看到类似如下所示的内容:
图5.IPMI带内度量数据
带内度量数据的好处是允许您在主机中运行程序,并通过其他度量数据使用的同一种收集机制将信息提供给链路。这种方法的缺点(尤其是对于 IPMI)是需要在主机上执行相当多的配置才能工作。
注意,必须确保脚本是用 Python 编写的,配置文件已经存在,并且 gmond.conf 已正确设置。我们只执行一种度量!考虑一下编写其他度量所需执行的所有操作!针对每种度量在每台主机上执行此操作会变得非常烦人。IPMI 是带外工具,因此有一种更好的方法,不是吗?确实是。
回页首
带外插件(主机欺骗)
主机欺骗刚好是我们需要的工具。在这里使用功能强大的 gmetric
并告诉它我们正在其上运行的主机 —— gmetric
是将信息插入到 Ganglia 中的命令行工具。通过这种方法,您可以监视任何内容。
gmetric
最精彩的部分是什么?大量已经编写好的脚本。
作为一种学习体验,我将向您展示如何彻底改造运行 ipmitool 以远程访问计算机的方法:
我已经设置了 BMC(目标计算机中的芯片),以便我可以在其中运行 IPMI 命令。例如:我的监视主机名为 redhouse。通过 redhouse,我希望监视集群中的所有其他节点。Redhouse 是 gmetad
运行的位置,也是 Web 浏览器指向的位置(以便访问所有 Ganglia 信息)。
我的集群中的一个节点拥有 x01 主机名。我把 x01 的 BMC 设为拥有解析到主机 x01-bmc 的 IP 地址。在这里,我尝试远程访问该主机:
# ipmitool -I lanplus -H x01-bmc -U USERID -P PASSW0RD sdr dump \ /tmp/x01.sdr Dumping Sensor Data Repository to '/tmp/x01.sdr' # ipmitool -I lanplus -H x01-bmc -U USERID -P PASSW0RD -S /tmp/x01.sdr \ sdr type Temperature Ambient Temp | 32h | ok | 12.1 | 20 degrees C CPU 1 Temp | 98h | ok | 3.1 | 20 degrees C CPU 2 Temp | 99h | ok | 3.2 | 21 degrees C |
看上去一切良好。现在让我们把它放到一个脚本中以提供给 gmetric
。
gmetric
。 我们创建了下面的 /usr/local/bin/ipmi-ganglia.pl 脚本并将其放到监视服务器中:
#!/usr/bin/perl # [email protected] use strict; # to keep things clean... er cleaner use Socket; # to resolve host names into IP addresses # code to clean up after forks use POSIX ":sys_wait_h"; # nodeFile: is just a plain text file with a list of nodes: # e.g: # node01 # node02 # ... # nodexx my $nodeFile = "/usr/local/bin/nodes"; # gmetric binary my $gmetric = "/usr/bin/gmetric"; #ipmitool binary my $ipmi = "/usr/bin/ipmitool"; # userid for BMCs my $u = "xcat"; # password for BMCs my $p = "f00bar"; # open the nodes file and iterate through each node open(FH, "$nodeFile") or die "can't open $nodeFile"; while(my $node = <FH>){ # fork so each remote data call is done in parallel if(my $pid = fork()){ # parent process next; } # child process begins here chomp($node); # get rid of new line # resolve node's IP address for spoofing my $ip; my $pip = gethostbyname($node); if(defined $pip){ $ip = inet_ntoa($pip); }else{ print "Can't get IP for $node!\n"; exit 1; } # check if the SDR cache file exists. my $ipmiCmd; unless(-f "/tmp/$node.sdr"){ # no SDR cache, so try to create it... $ipmiCmd = "$ipmi -I lan -H $node-bmc -U $u -P $p sdr dump /tmp/$node.sdr"; `$ipmiCmd`; } if(-f "/tmp/$node.sdr"){ # run the command against the cache so that its faster $ipmiCmd = "$ipmi -I lan -H $node-bmc -U $u -P $p -S /tmp/$node.sdr sdr type Temperature "; # put all the output into the @out array my @out = `$ipmiCmd`; # iterate through each @out entry. foreach(@out){ # each output line looks like this: # Ambient Temp | 32h | ok | 12.1 | 25 degrees C # so we parse it out chomp(); # get rid of the new line # grap the first and 5th fields. (Description and Temp) my ($descr, undef, undef, undef,$temp) = split(/\|/); # get rid of white space in description $descr =~ s/ //g; # grap just the temp, (We assume C anyway) $temp = (split(' ', $temp))[0]; # make sure that temperature is a number: if($temp =~ /^\d+/ ){ #print "$node: $descr $temp\n"; my $gcmd = "$gmetric -n '$descr' -v $temp -t int16 -u Celcius -S $ip:$node"; `$gcmd`; } } } # Child Thread done and exits. exit; } # wait for all forks to end... while(waitpid(-1,WNOHANG) != -1){ 1; } |
除了所有解析之外,此脚本只运行 ipmitool
命令并获取温度。然后,它将针对每项度量数据,使用 gmetric
命令将这些值放到 Ganglia 中。
运行 crontab -e
。我添加了以下每 30 分钟就运行一次的条目:30 * * * * /usr/local/bin/ipmi-ganglia.sh
。您可能希望它发生得更加频繁或者次数更少。
打开 Ganglia Web 浏览器并查看一个节点的图形,您可以看到节点被欺骗并且更新了每个节点条目:
图6.no_group度量数据
欺骗的缺点之一是类别归入 no_group 度量组。gmetric
似乎没有办法像带内版本那样进行良好的分组。
回页首
结束语
本文大致介绍了使用 Ganglia 和 Nagios 作为开源监视工具(单独使用和同时使用)可以完成的工作。您了解了如何安装/配置 Ganglia,然后看到了 Ganglia 对于了解应用程序特性是多么有用。最后,您看到了如何使用带内脚本扩展 Ganglia 以及如何使用带有主机欺骗的带外脚本。
这是一个良好的开端。但是本文只回答了系统工程师提出的监视问题。现在可以查看系统范围的性能并了解计算机的利用情况。我们可以确定计算机是否始终处于空闲状态,还是以 60% 的使用率运行。现在甚至可以确定哪些计算机运行得最活跃,哪些计算机运行得最少,并了解其机架位置是否可以安排得更好。
这个两部分系列的第二部分将探究如何设置 Nagios 并将其与 Ganglia 整合在一起,内容包括:
此外,第二部分将展示如何扩展整个监视系统以监视运行作业和其他基础设施。通过执行这些附加项目,我们将能够回答不同用户组询问的其他监视问题。
<!-- CMA ID: 381454 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->参考资料
学习
获得产品和技术