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


















