集群監(jiān)控工具簡(jiǎn)介:Ganglia和Nagios
隨著數(shù)據(jù)中心的增長(zhǎng)和管理人員的縮減,對(duì)計(jì)算資源使用有效監(jiān)視工具的需求變得比以往更加迫切。術(shù)語(yǔ)監(jiān)視 在應(yīng)用到數(shù)據(jù)中心時(shí)可能會(huì)讓人混淆,因?yàn)樗暮x會(huì)根據(jù)具體的說(shuō)話(huà)者和聽(tīng)眾而有所不同。例如:
- 在集群中運(yùn)行應(yīng)用程序的人員會(huì)思考:“我的作業(yè)什么時(shí)候運(yùn)行?它什么時(shí)候會(huì)完成?以及與上一次相比,它是怎樣執(zhí)行的?”
- 網(wǎng)絡(luò)運(yùn)營(yíng)中心(NOC)的操作員會(huì)思考:“什么時(shí)候會(huì)出現(xiàn)表示需要解決問(wèn)題的紅燈并安排服務(wù)電話(huà)?”
- 系統(tǒng)工程部的人員會(huì)思考:“我們的機(jī)器如何執(zhí)行?所有服務(wù)是否運(yùn)行正常?我們可以看到哪些趨勢(shì)以及如何更好地利用計(jì)算資源?”
面對(duì)如此多的定義,您必須查找大量的代碼才能監(jiān)視您真正想要監(jiān)視的內(nèi)容,不僅如此,還存在無(wú)數(shù)的產(chǎn)品和服務(wù)。可是幸運(yùn)的是,許多監(jiān)視工具都是開(kāi)源的 —— 實(shí)際上,某些開(kāi)源工具的表現(xiàn)比嘗試完成同樣工作的某些商業(yè)應(yīng)用程序還要好。
使用開(kāi)源監(jiān)視工具最困難的部分是實(shí)現(xiàn)適合環(huán)境的安裝和配置。使用開(kāi)源監(jiān)視工具的兩個(gè)主要問(wèn)題是:
- 沒(méi)有一個(gè)工具可以按照期望的方式監(jiān)視所需的所有內(nèi)容。為什么?因?yàn)椴煌挠脩?hù)將以不同的方式定義監(jiān)視(正如我剛才所述)。
- 由于存在第一個(gè)問(wèn)題,因此要讓工具完全按照期望在數(shù)據(jù)中心中工作可能需要完成大量自定義。為什么?因?yàn)椴还芏嗝吹貥?biāo)準(zhǔn),每一個(gè)環(huán)境也都是獨(dú)一無(wú)二的。
順便說(shuō)一句,商業(yè)監(jiān)視工具也同樣存在這兩個(gè)問(wèn)題。
因此,我將介紹 Ganglia 和 Nagios,這是兩個(gè)用于監(jiān)視數(shù)據(jù)中心的工具。這兩個(gè)工具被大量用于高性能計(jì)算(HPC)環(huán)境中,但是它們對(duì)于其他環(huán)境也具有很大的吸引力(例如云、呈現(xiàn)集群和托管中心)。此外,兩者對(duì)監(jiān)視的定義也采取了不同的側(cè)重點(diǎn)。Ganglia 更多地與收集度量數(shù)據(jù)并隨時(shí)跟蹤這些數(shù)據(jù)有關(guān),而 Nagios 一直致力于成為一種報(bào)警機(jī)制。
隨著獨(dú)立項(xiàng)目的發(fā)展,逐步出現(xiàn)了交疊。例如:
- Ganglia 過(guò)去要求代理運(yùn)行在每臺(tái)主機(jī)上以從中收集信息,但是現(xiàn)在可以通過(guò) Ganglia 的欺騙機(jī)制獲得度量數(shù)據(jù)。
- Nagios 過(guò)去也是僅用于從目標(biāo)主機(jī)中輪詢(xún)信息,但是現(xiàn)在提供了在目標(biāo)主機(jī)上運(yùn)行代理的插件。
雖然這些工具在某些功能領(lǐng)域里已經(jīng)發(fā)生交疊,但是兩者之間還是有許多不同之處,可以讓您從運(yùn)行這兩個(gè)工具中獲益。同時(shí)運(yùn)行兩個(gè)工具可以相互彌補(bǔ)不足:
- Ganglia 沒(méi)有內(nèi)置通知系統(tǒng),而 Nagios 在這方面表現(xiàn)杰出。
- Nagios 似乎沒(méi)有適合目標(biāo)主機(jī)的可伸縮內(nèi)置代理(這是一個(gè)爭(zhēng)議點(diǎn)),而 Ganglia 在設(shè)計(jì)之初就考慮到這點(diǎn)。
還有其他開(kāi)源項(xiàng)目也可以完成這兩個(gè)工具完成的工作,并且有些項(xiàng)目在某些領(lǐng)域做得比其他項(xiàng)目好。常用開(kāi)源監(jiān)視解決方案包括 Cacti、Zenoss、Zabbix、Performance Copilot(PCP)和 Clumon(而且我相信您已經(jīng)有了自己喜歡的選擇)。這些工具(包括 Ganglia 和一些 Nagios 插件)中的許多工具在底層都使用了 RRDTool 或 Tobi Oetiker 的 MRTG(Multi Router Traffic Grapher),以生成漂亮的圖形和存儲(chǔ)數(shù)據(jù)。
盡管用于監(jiān)視數(shù)據(jù)中心的開(kāi)源解決方案如此眾多,我卻經(jīng)常驚訝地發(fā)現(xiàn)許多向外擴(kuò)展的計(jì)算中心在開(kāi)發(fā)自己的解決方案,而忽略其他人已經(jīng)完成的工作。
在這個(gè)兩部分文章中,我將討論 Ganglia 和 Nagios,因?yàn)橛幸恍┦聦?shí)證據(jù)表明這些工具是最常用的。盡管將兩者集成在一起是非常普遍的實(shí)踐(尤其是在一些大型的 HPC 實(shí)驗(yàn)室和大學(xué)里),但是我發(fā)現(xiàn)很少有文章對(duì)此進(jìn)行介紹。
學(xué)完本系列,您應(yīng)當(dāng)能夠安裝 Ganglia 并與 Nagios 綁定在一起,并且可以回答不同的用戶(hù)組向您詢(xún)問(wèn)的監(jiān)視問(wèn)題。這只是一個(gè)開(kāi)始,但是應(yīng)當(dāng)可以幫助您了解基礎(chǔ)知識(shí)并逐步把握集群的整體情況。
在本文中,我將指導(dǎo)您完成:
- 安裝和配置基本的 Ganglia 設(shè)置。
- 如何使用 Python 模塊來(lái)用 IPMI(Intelligent Platform Management Interface)擴(kuò)展功能。
- 如何使用 Ganglia 主機(jī)欺騙來(lái)監(jiān)視 IPMI。
我們的目標(biāo) —— 設(shè)置 HPC Linux® 集群的基準(zhǔn)監(jiān)視系統(tǒng),在其中可以在某個(gè)程度上解決上面所述的三個(gè)不同監(jiān)視意圖:
- 應(yīng)用程序人員可以看到隊(duì)列的排隊(duì)情況如何,并可以看到運(yùn)行作業(yè)的可用節(jié)點(diǎn)。
- NOC 可以收到系統(tǒng)故障報(bào)警或者在 Nagios Web 界面上看到一個(gè)閃亮的紅色錯(cuò)誤指示燈。如果節(jié)點(diǎn)出現(xiàn)故障或者溫度過(guò)高,他們也可以通過(guò)電子郵件收到通知。
- 系統(tǒng)工程師可以繪制數(shù)據(jù)曲線(xiàn)圖、報(bào)告集群利用情況并決定未來(lái)采購(gòu)哪些硬件。
Ganglia 簡(jiǎn)介
Ganglia 是 UC Berkeley 發(fā)起的一個(gè)開(kāi)源監(jiān)視項(xiàng)目,設(shè)計(jì)用于測(cè)量數(shù)以千計(jì)的節(jié)點(diǎn)。每臺(tái)計(jì)算機(jī)都運(yùn)行一個(gè)收集和發(fā)送度量數(shù)據(jù)(如處理器速度、內(nèi)存使用量等)的名為 gmond
的守護(hù)進(jìn)程。它將從操作系統(tǒng)和指定主機(jī)中收集。接收所有度量數(shù)據(jù)的主機(jī)可以顯示這些數(shù)據(jù)并且可以將這些數(shù)據(jù)的精簡(jiǎn)表單傳遞到層次結(jié)構(gòu)中。正因?yàn)橛羞@種層次結(jié)構(gòu)模式,才使得 Ganglia 可以實(shí)現(xiàn)良好的擴(kuò)展。gmond
帶來(lái)的系統(tǒng)負(fù)載非常少,這使得它成為在集群中各臺(tái)計(jì)算機(jī)上運(yùn)行的一段代碼,而不會(huì)影響用戶(hù)性能。
所有這些數(shù)據(jù)收集會(huì)多次影響節(jié)點(diǎn)性能。網(wǎng)絡(luò)中的 “抖動(dòng)(Jitter)” 發(fā)生在大量小消息同時(shí)出現(xiàn)時(shí)。我們發(fā)現(xiàn)通過(guò)將節(jié)點(diǎn)時(shí)鐘保持一致,就可以避免這個(gè)問(wèn)題。
安裝 Ganglia
Internet 中有許多介紹如何安裝 Ganglia 的文章和參考資料。我們將重新查看我在 xCAT 維基中撰寫(xiě)的一篇文章。我假定出于本文的目的,操作系統(tǒng)是 Red Hat 5 Update 2(但是對(duì)于其他企業(yè) Linux 操作系統(tǒng),這些步驟不會(huì)有很大差別)。
先決條件
假定您已經(jīng)設(shè)置了 yum 庫(kù),安裝先決條件在很大程度上應(yīng)當(dāng)十分簡(jiǎn)單。類(lèi)似于以下代碼:
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 實(shí)際上應(yīng)該可以處理大多數(shù)依賴(lài)關(guān)系,但是在我的一個(gè)測(cè)試中,我看到編譯失敗,而這些失敗可以通過(guò)添加所有這些包來(lái)修正。)
在獲得這些包之后,您需要滿(mǎn)足另一個(gè)不在 Red Hat 庫(kù)中的先決條件。您可以像下面這樣獲取并構(gòu)建它,只要您的機(jī)器連接了 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 |
#p#
RRDTool
RRDTool 表示:輪循數(shù)據(jù)庫(kù)工具(Round Robin Database Tool)。它是由 Tobias Oetiker 創(chuàng)建的,并且為許多高性能監(jiān)視工具提供了引擎。Ganglia 是其中之一,但是 Cacti 和 Zenoss 是另外兩個(gè)。
要安裝 Ganglia,首先需要讓 RRDTool 運(yùn)行在監(jiān)視服務(wù)器上。RRDTool 將提供其他程序使用的兩個(gè)非常優(yōu)秀的功能:
- 它將在輪循數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)。隨著捕捉的數(shù)據(jù)變得越來(lái)越舊,解析的精確性將變得越來(lái)越低。這將占用很少的內(nèi)存并且在大多數(shù)情況下仍然有用。
- 它可以通過(guò)使用命令行實(shí)參根據(jù)捕捉的數(shù)據(jù)生成圖形。
要安裝 RRDTool,請(qǐng)運(yùn)行以下代碼(對(duì) 1.3.4 版和 1.3.6 版進(jìn)行了測(cè)試):
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 作為環(huán)境中的獨(dú)立工具有許多種方法,但是我在這里不會(huì)介紹這些方法。
Ganglia 安裝
現(xiàn)在已滿(mǎn)足所有先決條件,您可以安裝 Ganglia。首先需要獲得它。在本文中,我們使用的是 Ganglia 3.1.1。下載 ganglia-3.1.1.tar.gz 文件并將其放在監(jiān)視服務(wù)器的 /tmp 目錄中。然后執(zhí)行以下代碼:
cd /tmp/ tar zxvf ganglia*gz cd ganglia-3.1.1/ ./configure --with-gmetad make -j8 make install |
您應(yīng)當(dāng)會(huì)退出,而不會(huì)遇到任何錯(cuò)誤。如果看到錯(cuò)誤,則可能需要檢查缺少哪些庫(kù)。
配置 Ganglia
現(xiàn)在基本安裝已完成,需要設(shè)置幾個(gè)配置項(xiàng)才能運(yùn)行。執(zhí)行以下步驟:
- 處理命令行文件。
- 修改 /etc/ganglia/gmond.conf。
- 注意多宿主(multi-homed)計(jì)算機(jī)。
- 在管理服務(wù)器中啟動(dòng)它。
步驟 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
現(xiàn)在可以修改 /etc/ganglia/gmond.conf 以命名集群。假定集群名稱(chēng)為 “matlock”;則可以將 name = "unspecified"
更改為 name = "matlock"
。
步驟 3:注意多宿主計(jì)算機(jī)
在我的集群中,eth0 是我的系統(tǒng)的公共 IP 地址。但是,監(jiān)視服務(wù)器將通過(guò) eth1 與私有集群網(wǎng)絡(luò)中的節(jié)點(diǎn)進(jìn)行通信。我需要確保 Ganglia 使用的多點(diǎn)傳送將與 eth1 綁定在一起。這可以通過(guò)創(chuàng)建 /etc/sysconfig/network-scripts/route-eth1 文件來(lái)完成。添加 239.2.11.71 dev eth1
內(nèi)容。
然后您可以使用 service network restart
重新啟動(dòng)網(wǎng)絡(luò)并確保路由器顯示此 IP 通過(guò) eth1。注:您應(yīng)當(dāng)使用 239.2.11.71,因?yàn)檫@是 ganglia 的默認(rèn)多點(diǎn)傳送通道。如果使用其他通道或者增加更多通道,請(qǐng)更改它。
步驟 4:在管理服務(wù)器中啟動(dòng)它
現(xiàn)在您可以在監(jiān)視服務(wù)器中完全啟動(dòng)它:
service gmond start service gmetad start service httpd restart |
停止 Web 瀏覽器并將其指向位于 http://localhost/ganglia 的管理服務(wù)器。您將看到管理服務(wù)器現(xiàn)在處于受監(jiān)視狀態(tài)。您還將看到若干度量數(shù)據(jù)正受到監(jiān)視并繪制曲線(xiàn)圖。最有用的曲線(xiàn)圖之一是您可以監(jiān)視這臺(tái)計(jì)算機(jī)中的負(fù)載情況。下面是我的計(jì)算機(jī)的負(fù)載情況圖:
圖 1. 監(jiān)視負(fù)載
沒(méi)有發(fā)生什么操作,計(jì)算機(jī)只是處于空閑狀態(tài)。
#p#
把 Ganglia 放在節(jié)點(diǎn)上
到現(xiàn)在為止,我們已經(jīng)完成了在管理服務(wù)器中運(yùn)行 Ganglia 的工作;現(xiàn)在必須更多地關(guān)注計(jì)算節(jié)點(diǎn)。事實(shí)證明只需復(fù)制一些文件就可以把 Ganglia 放到計(jì)算節(jié)點(diǎn)上。這是在使用 Kickstart 時(shí)可以添加到安裝后腳本中的內(nèi)容或是可以添加到其他更新工具中的內(nèi)容。
快速但粗糙的方法是這樣的:創(chuàng)建一個(gè)含有所有主機(jī)名的文件。假定您有 deathstar001
-deathstar100
節(jié)點(diǎn)。則將擁有類(lèi)似如下所示的名為 /tmp/mynodes 的文件:
deathstar001 deathstar002 ...skip a few... deathstar099 deathstar100 |
現(xiàn)在只需運(yùn)行以下代碼:
# 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 |
您可以重新啟動(dòng) gmetad
,刷新 Web 瀏覽器,然后應(yīng)當(dāng)會(huì)看到節(jié)點(diǎn)現(xiàn)在出現(xiàn)在列表中。
您可能會(huì)遇到下面這些潛在的問(wèn)題:
- 您可能也需要按照前面的步驟 3 那樣對(duì)節(jié)點(diǎn)明確設(shè)置靜態(tài)路由。
- 您的防火墻可能會(huì)阻塞端口。
gmond
將在端口 8649 上運(yùn)行。如果gmond
是在計(jì)算機(jī)中運(yùn)行,您應(yīng)當(dāng)能夠運(yùn)行telnet localhost 8649
命令。并看到一些 XML 輸出滾動(dòng)顯示在屏幕中。
觀察 Ganglia
許多系統(tǒng)工程師很難理解他們自己的工作量或者工作特性。他們可能有自定義代碼或者沒(méi)有對(duì)商業(yè)產(chǎn)品的運(yùn)行進(jìn)行研究。Ganglia 可以幫助剖析應(yīng)用程序。
我們將使用 Ganglia 來(lái)檢驗(yàn)運(yùn)行 Linpack 基準(zhǔn)的屬性。圖 2 顯示了啟動(dòng)三項(xiàng)不同的 Linpack 作業(yè)的時(shí)間間隔。
圖 2. 觀察 Linpack
從此圖中可以看到,當(dāng)作業(yè)開(kāi)始時(shí),在作業(yè)啟動(dòng)時(shí)網(wǎng)絡(luò)中有一些活動(dòng)。但是,有趣的是接近作業(yè)結(jié)束時(shí),網(wǎng)絡(luò)流量增加了很多。如果您不了解 Linpack,您至少會(huì)認(rèn)為:網(wǎng)絡(luò)流量在作業(yè)結(jié)束時(shí)增加。
圖 3 和圖 4 分別顯示 CPU 和內(nèi)存使用率。在這里,您可以看到正在逼近處理器的限制,而且內(nèi)存使用率也非常高。
圖 3. CPU 使用率
圖 4. 內(nèi)存使用率
這些圖形讓我們深入了解正在運(yùn)行的應(yīng)用程序:我們正在使用大量 CPU 和內(nèi)存并且在接近作業(yè)結(jié)束時(shí)造成更多網(wǎng)絡(luò)流量。關(guān)于這項(xiàng)作業(yè)還有很多其他屬性是我們不知道的,但是這給我們提供了一個(gè)很好的開(kāi)端。
知道這些情況可以幫助在未來(lái)購(gòu)買(mǎi)更多硬件時(shí)做出更好的采購(gòu)決定。當(dāng)然,沒(méi)有人購(gòu)買(mǎi)硬件只是為了運(yùn)行 Linpack ……對(duì)么?
#p#
擴(kuò)展能力
基本 Ganglia 安裝已經(jīng)給我們提供了大量有用信息。使用 Ganglia 的插件將給我們提供兩種添加更多功能的方法:
- 通過(guò)添加帶內(nèi)(in-band)插件。
- 通過(guò)添加一些其他來(lái)源的帶外(out-of-band)欺騙。
第一種方法一直是 Ganglia 的常見(jiàn)實(shí)踐。第二種方法是最新開(kāi)發(fā)的實(shí)踐,并且與 Nagios 在功能上有所交疊。讓我們通過(guò)一個(gè)實(shí)際示例來(lái)簡(jiǎn)要探究?jī)煞N方法。
帶內(nèi)插件
帶內(nèi)插件可以通過(guò)兩種方式發(fā)生。
- 使用 cron-job 方法并調(diào)用 Ganglia 的
gmetric
命令來(lái)輸入數(shù)據(jù)。 - 使用新 Python 模塊插件并撰寫(xiě)它的腳本。
第一種方法是過(guò)去常采用的方法,并且我將在下一節(jié)中討論更多關(guān)于帶外插件的內(nèi)容。它的問(wèn)題是無(wú)法干凈地完成。Ganglia 3.1.x 添加了 Python 和 C 模塊插件以使其看上去可以更加自然地?cái)U(kuò)展 Ganglia。此刻,我將向您展示第二種方法。
首先,用 Ganglia 啟用 Python 插件。執(zhí)行以下操作:
- 編輯 /etc/ganglia/gmond.conf 文件。
如果打開(kāi)該文件,您會(huì)注意到:其中四分之一的內(nèi)容都是類(lèi)似如下所示的名為 modules
的部分:
modules { module { name = "core_metrics" } ... } |
我們將向模塊部分添加另一個(gè)模塊。這個(gè)必須添加的模塊就是:
module { name = "python_module" path = "modpython.so" params = "/usr/lib64/ganglia/python_modules/" } |
在 gmond.conf 中,我在第 90 行添加了上一個(gè)代碼段。這將允許 Ganglia 使用 Python 模塊。此外,還在 include ('/etc/ganglia/conf.d/*.conf')
語(yǔ)句后添加一些行,添加 include ('/etc/ganglia/conf.d/*.pyconf')
行。這些包括了要添加的內(nèi)容的定義。
- 創(chuàng)建一些目錄。
如下所示:
mkdir /etc/ganglia/conf.d mkdir /usr/lib64/ganglia/python_modules |
- 在所有節(jié)點(diǎn)上重復(fù)執(zhí)行步驟 1 和 2。
為此,執(zhí)行下面的操作:
- 把新的 gmond.conf 復(fù)制到要監(jiān)視的各個(gè)節(jié)點(diǎn)上。
- 在要監(jiān)視的各個(gè)節(jié)點(diǎn)中創(chuàng)建步驟 2 中所示的兩個(gè)目錄,以便它們也可以使用 Python 擴(kuò)展。
現(xiàn)在已經(jīng)設(shè)置好節(jié)點(diǎn)可以準(zhǔn)備運(yùn)行 Python 模塊了,讓我們創(chuàng)建一個(gè)新模塊。在本例中,我們將添加一個(gè)使用 Linux IPMI 驅(qū)動(dòng)程序的插件。如果不熟悉 IPMI 并且使用的是現(xiàn)代的 Intel 和 AMD 計(jì)算機(jī),則請(qǐng)了解一下這方面的內(nèi)容(請(qǐng)參閱 參考資料)。
我們將使用開(kāi)源 IPMItool 與本地計(jì)算機(jī)中的 IPMI 設(shè)備進(jìn)行通信。還有若干其他選項(xiàng),如 OpenIPMI 或 freeipmi。這只是一個(gè)示例,因此如果您想要使用其他選項(xiàng),那么完全沒(méi)有問(wèn)題。
在開(kāi)始使用 Ganglia 之前,確保 IPMItool 可以在您的計(jì)算機(jī)中工作。運(yùn)行 ipmitool -c sdr type temperature | sed 's/ /_/g'
命令;如果該命令不工作,請(qǐng)嘗試裝入 IPMI 設(shè)備驅(qū)動(dòng)程序并再次運(yùn)行:
modprobe ipmi_msghandler modprobe ipmi_si modprobe ipmi_devintf |
在運(yùn)行 ipmitool
命令后,我的輸出顯示:
Ambient_Temp,20,degrees_C,ok CPU_1_Temp,20,degrees_C,ok CPU_2_Temp,21,degrees_C,ok |
因此在我的 Ganglia 插件中,我將只監(jiān)視周?chē)h(huán)境溫度。我已經(jīng)創(chuàng)建了一個(gè)編寫(xiě)得不是很好的名為 ambientTemp.py 的插件,該插件將根據(jù)在 Ganglia 維基中找到的插件使用 IPMI:
清單 1. 編寫(xiě)得不是很好的 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) |
復(fù)制清單 1 并將其放到 /usr/lib64/ganglia/python_modules/ambientTemp.py 中。對(duì)集群中的所有節(jié)點(diǎn)都這樣做。
現(xiàn)在我們已經(jīng)把腳本添加到了集群的所有節(jié)點(diǎn)中,告訴 Ganglia 如何執(zhí)行腳本。創(chuàng)建名為 /etc/ganglia/conf.d/ambientTemp.pyconf 的新文件,內(nèi)容如下:
清單 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 保存到所有節(jié)點(diǎn)上。
重新啟動(dòng) gmond
之前必須完成的最后一件事是更改 IPMI 設(shè)備的權(quán)限,這樣沒(méi)有人 可以對(duì)它執(zhí)行操作。這將使您的 IPMI 接口極易受到惡意攻擊!
這只是一個(gè)示例:chown nobody:nobody /dev/ipmi0
。
現(xiàn)在在所有位置重新啟動(dòng) gmond
。如果運(yùn)行正常,則應(yīng)當(dāng)可以刷新 Web 瀏覽器并看到類(lèi)似如下所示的內(nèi)容:
圖 5. IPMI 帶內(nèi)度量數(shù)據(jù)
帶內(nèi)度量數(shù)據(jù)的好處是允許您在主機(jī)中運(yùn)行程序,并通過(guò)其他度量數(shù)據(jù)使用的同一種收集機(jī)制將信息提供給鏈路。這種方法的缺點(diǎn)(尤其是對(duì)于 IPMI)是需要在主機(jī)上執(zhí)行相當(dāng)多的配置才能工作。
注意,必須確保腳本是用 Python 編寫(xiě)的,配置文件已經(jīng)存在,并且 gmond.conf 已正確設(shè)置。我們只執(zhí)行一種度量!考慮一下編寫(xiě)其他度量所需執(zhí)行的所有操作!針對(duì)每種度量在每臺(tái)主機(jī)上執(zhí)行此操作會(huì)變得非常煩人。IPMI 是帶外工具,因此有一種更好的方法,不是嗎?確實(shí)是。
#p#
帶外插件(主機(jī)欺騙)
主機(jī)欺騙剛好是我們需要的工具。在這里使用功能強(qiáng)大的 gmetric
并告訴它我們正在其上運(yùn)行的主機(jī) —— gmetric
是將信息插入到 Ganglia 中的命令行工具。通過(guò)這種方法,您可以監(jiān)視任何內(nèi)容。
gmetric
最精彩的部分是什么?大量已經(jīng)編寫(xiě)好的腳本。
作為一種學(xué)習(xí)體驗(yàn),我將向您展示如何徹底改造運(yùn)行 ipmitool 以遠(yuǎn)程訪(fǎng)問(wèn)計(jì)算機(jī)的方法:
- 確保 ipmitool 可以在帶外正常工作。
我已經(jīng)設(shè)置了 BMC(目標(biāo)計(jì)算機(jī)中的芯片),以便我可以在其中運(yùn)行 IPMI 命令。例如:我的監(jiān)視主機(jī)名為 redhouse。通過(guò) redhouse,我希望監(jiān)視集群中的所有其他節(jié)點(diǎn)。Redhouse 是 gmetad
運(yùn)行的位置,也是 Web 瀏覽器指向的位置(以便訪(fǎng)問(wèn)所有 Ganglia 信息)。
我的集群中的一個(gè)節(jié)點(diǎn)擁有 x01 主機(jī)名。我把 x01 的 BMC 設(shè)為擁有解析到主機(jī) x01-bmc 的 IP 地址。在這里,我嘗試遠(yuǎn)程訪(fǎng)問(wèn)該主機(jī):
# 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 |
看上去一切良好?,F(xiàn)在讓我們把它放到一個(gè)腳本中以提供給 gmetric
。
- 創(chuàng)建使用 ipmitool 的腳本以提供給
gmetric
。
我們創(chuàng)建了下面的 /usr/local/bin/ipmi-ganglia.pl 腳本并將其放到監(jiān)視服務(wù)器中:
#!/usr/bin/perl # vallard@us.ibm.com 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; } |
除了所有解析之外,此腳本只運(yùn)行 ipmitool
命令并獲取溫度。然后,它將針對(duì)每項(xiàng)度量數(shù)據(jù),使用 gmetric
命令將這些值放到 Ganglia 中。
- 以 cron 作業(yè)的形式運(yùn)行腳本。
運(yùn)行 crontab -e
。我添加了以下每 30 分鐘就運(yùn)行一次的條目:30 * * * * /usr/local/bin/ipmi-ganglia.sh
。您可能希望它發(fā)生得更加頻繁或者次數(shù)更少。
- 打開(kāi) Ganglia 并查看結(jié)果。
打開(kāi) Ganglia Web 瀏覽器并查看一個(gè)節(jié)點(diǎn)的圖形,您可以看到節(jié)點(diǎn)被欺騙并且更新了每個(gè)節(jié)點(diǎn)條目:
圖 6. no_group 度量數(shù)據(jù)
欺騙的缺點(diǎn)之一是類(lèi)別歸入 no_group 度量組。gmetric
似乎沒(méi)有辦法像帶內(nèi)版本那樣進(jìn)行良好的分組。
結(jié)束語(yǔ)
本文大致介紹了使用 Ganglia 和 Nagios 作為開(kāi)源監(jiān)視工具(單獨(dú)使用和同時(shí)使用)可以完成的工作。您了解了如何安裝/配置 Ganglia,然后看到了 Ganglia 對(duì)于了解應(yīng)用程序特性是多么有用。最后,您看到了如何使用帶內(nèi)腳本擴(kuò)展 Ganglia 以及如何使用帶有主機(jī)欺騙的帶外腳本。
這是一個(gè)良好的開(kāi)端。但是本文只回答了系統(tǒng)工程師提出的監(jiān)視問(wèn)題?,F(xiàn)在可以查看系統(tǒng)范圍的性能并了解計(jì)算機(jī)的利用情況。我們可以確定計(jì)算機(jī)是否始終處于空閑狀態(tài),還是以 60% 的使用率運(yùn)行。現(xiàn)在甚至可以確定哪些計(jì)算機(jī)運(yùn)行得最活躍,哪些計(jì)算機(jī)運(yùn)行得最少,并了解其機(jī)架位置是否可以安排得更好。
這個(gè)兩部分系列的第二部分將探究如何設(shè)置 Nagios 并將其與 Ganglia 整合在一起,內(nèi)容包括:
- 安裝和配置基本 Nagios 設(shè)置以執(zhí)行報(bào)警
- 監(jiān)視交換機(jī)和其他基礎(chǔ)設(shè)施
- 將 Nagios 綁定到 Ganglia 中以執(zhí)行報(bào)警
此外,第二部分將展示如何擴(kuò)展整個(gè)監(jiān)視系統(tǒng)以監(jiān)視運(yùn)行作業(yè)和其他基礎(chǔ)設(shè)施。通過(guò)執(zhí)行這些附加項(xiàng)目,我們將能夠回答不同用戶(hù)組詢(xún)問(wèn)的其他監(jiān)視問(wèn)題。
原文:https://www.ibm.com/developerworks/cn/linux/l-ganglia-nagios-1/
【相關(guān)閱讀】