Ganglia 項目是由加州大學發起的,現在已經成為一個應用非常廣泛集群監控軟件。可以監視和顯示集群中的節點的各種狀態信息,比如如:cpu 、mem、硬盤利用率, I/O負載、網絡流量情況等,同時可以將歷史數據以曲線方式通過php頁面呈現。同時具有很好的擴展性,允許用戶加入自己所要監控的狀態信息。
圖 1 Ganglia整體結構圖
Ganglia 包括如下幾個程序,他們之間通過XDL(xml的壓縮格式)或者XML格式傳遞監控數據,達到監控效果。集群內的節點,通過運行gmond收集發布節點狀 態信息,然后gmetad周期性的輪詢gmond收集到的信息,然后存入rrd數據庫,通過web服務器可以對其進行查詢展示。
Gmetad 這個程序負責周期性的到各個datasource收集各個cluster的數據,並更新到rrd數據庫中。 可以把它理解為服務端。
Gmond 收集本機的監控數據,發送到其他機器上,收集其他機器的監控數據,gmond之間通過udp通信,傳遞文件格式為xdl。收集的數據供Gmetad讀取,默認監聽端口8649 ,監聽到gmetad請求后發送xml格式的文件。可以把它理解為客戶端。
web front-end 一個基於web的監控界面,通常和Gmetad安裝在同一個節點上(還需確認是否可以不在一個節點上,因為php的配置文件中ms可配置gmetad的地址及端口),它從Gmetad取數據,並且讀取rrd數據庫,生成圖片,顯示出來。
如上圖所示,gmetad周期性的去gmond節點或者gmetad節點poll數據。一個gmetad可以設置多個datasource,每個datasource可以有多個備份,一個失敗還可以去其他host取數據。
如 果是muticast模式的話,gmond之間還會通過多播來相互傳遞數據。Gmond本身具有udp send和recv通道,還有一個tcp recv通道。其中udp通道用於向其他gmond節點發送或接受數據,tcp則用來export xml文件,主要接受來自gmetad的請求。Gmetad只有tcp通道,一方面他向datasource發送請求,另一方面會使用一個tcp端口,發 布自身收集的xml文件,默認使用8651端口。所以gmetad即可以從gmond也可以從其他的gmetad得到xml數據。
Gmond節點內部模塊圖如下所示:
圖 2 Gmond節點模塊結構圖
如 上圖所示,主要由三個模塊組成,collect and publish模塊,該模塊周期性的調用一些內部指令獲得metric data,然后將這些數據通過udp通道發布給其他gmond節點。Listen Threads,監聽其他gmond節點的發送的udp數據,然后將數據存放到內存中。XML export thread負責將數據以xml格式發布出去,比如交給gmetad。
下面重點介紹下unicast模式下ganglia系統內的數據流。
圖 3單播狀況下集群節點間的數據流
如 上圖所示,多個gmond節點通過udp向單播的目標host的gmond發送數據,gmetad然后向該目標host的gmond請求xml文件,然后 存入rrdtool數據庫。 在unicast模式中,圖中方框內的組件通常是位於集群內的同一個節點。該節點負責收集存儲 顯示被監控的各節點的狀態信息。
向ganglia加入自定義metric有兩種方法,一種是通過命令行的方式運行gmetric,另一種是通過ganglia提供的面向c和python的擴展模塊,加入自定義的模塊支持。
n 自動收集數據
集 群內各個節點的信息收集可以通過ganglia系統自動的收集起來,這個收集是獨立進行地。其通信性能都是經過良好設計和優化的。具體的機制是:周期性的 將這些信息發送給gmond,這樣信息就加入了ganglia監控系統。通過ganglia的監控機制完成監控數據的收集顯示的功能。Ganglia系統 的機制可以參考2.1ganglia工作原理。
n 圖形界面
數據可以通過圖形顯示出來。通過登錄web服務器即可查看。目前可以通過該視圖查看集群及單獨節點的狀態曲線。同時具有基本的排序機制,可以根據值降序或者升序排序。可以查看過去1小時 1天 1周 1年等時間段的狀態曲線。
n 數據庫rrdtool存儲了歷史數據
由 於采用了rrd存儲數據,這樣我們不單可以查看當前的狀態,還可以查看之前的狀態歷史,同時可以將metrics隨時間的變化以曲線的方式變現表現出來。 而單獨的向文件寫日志很難保存和方便地查看之前的歷史記錄。而且有可能使得日志文件很大。RRDtool具有如下優點:
1)除了存儲數據之外,它具有可以創建圖形的工具;
2)它的數據庫文件大小是固定的,新的數據添加到已有數據的后面,當到了文件末尾的時候就開始從文件開始寫數據,Round Robin就是指這個意思;
3)一般的數據庫只能存儲數據本身,而rrd可以存儲相對與以前的數據的變動
4)一般的數據庫是在提供數據的時候才更新,而RRD是在每一個預先設好的時間間隔都會更新,每次更新的時候,time stamp也會存儲進去
n 開銷估計:網絡 IO CPU
只 運行gmond進程的節點開銷很小,通常需要1m左右內存,cpu大概1%不到,同時gmond只把數據保存在內存中,因此io開銷可以忽略。同時向其他 節點單播本身的信息本身的網絡壓力也不會很大。因此對於只運行gmond的節點來說,開銷很小。 如果采用了unicast模式,主要的開銷就會在各節點 的gmond進程向中央節點發送的udp數據帶來的網絡開銷,此外gmond和gmetad的通信,web服務也在該中央節點上進行。這樣主要的瓶頸就在 中央節點上,其網絡 IO CPU的壓力都會很大。
對於網絡來說,中央節點將收到來自其他所有節點發送的udp包,如果一個節點每秒發10個包,500個節點將會發出5000個,每個包有200字節,就有1m字節,5000個包的處理所需要的cpu使用也會上升。
對於內存來說每個狀態信息存儲在內存大概要耗費300byte,如果一個job有10萬個instance,每個instance又有10個狀態需要監控,那么將耗費10000*10*300=30m的內存,其對應的xml文件大小也應該是10m級別的。
對 於IO來說,Gmetad默認15秒向gmond取一次xml數據,如果gmond和gmetad都是在同一個節點,這樣就相當於本地io請求。同時 gmetad請求完xml文件后,還需要對其解析,也就是說按默認設置每15秒需要解析一個10m級別的xml文件,這樣cpu的壓力就會很大。同時它還 有寫入RRD數據庫,還要處理來自web客戶端的解析請求,也會讀RRD數據庫。這樣本身的IO CPU 網絡壓力就很大,因此這個節點至少應該是個空閑的而且能力比較強的節點。
n Gmetad RRD寫入瓶頸
需 要格外注意的是gmetad守護進程使用RRDtool,會在/var/lib/ganglia/rrds/目錄下的一個子目錄存儲這些rrd數據信息, 如果集群節點超過100個,你可能應將這個目錄放在RAM文件系統上,因為這個數據庫的磁盤I/O將會非常高。由於RRD特有的存儲方式,它會為每個 metric存放一個文件,如果配置了多個采樣頻率,它還會為每個采樣頻率保存一個單獨的文件。這就意味着gmetad將metric的值保存到rrd數 據庫的操作,將是針對大量小文件的IO,假設集群有300個節點,每個節點有50個metric,那么意味着gmetad會記錄15000個 metric,如果這些metric都是一秒更新一次,那么意味着每秒15000的隨機寫入操作,通常來說硬盤都是撐不住的。
一 個可能的解決方法就是將集群內的節點划分為多個子集,為每個子集配置一個中央收集節點。但這樣會帶來部署和結果查看的不方便性。另外可以通過 RRDcached來緩解這個gmetad使用RRDTool的問題大量隨機寫入,它會緩存這些寫入,批量進行更新。此外就是降低metric的采樣頻 率,減少metrics的數目,盡量減少這種寫入請求量。如果機器具有多塊磁盤,盡量利用多個磁盤來保存RRD數據。還有就是使用上面我們所說的將rrd 目錄加載為tmpfs。
n 使用的服務及端口以及依賴的庫
Ganglia 的gmond進程使用了udp進行單播,默認端口8649,同時還有負責tcp監控的端口8651 8652 8650也會被使用,這些端口需要在集群內部打開,這些使用的端口可以進行配置。另外apache也需要一個端口提供服務,這個端口會被從外部訪問,默認 是80。
n 同一個host的不同進程的相同Metirc可能混淆
由 於ganglia本身是根據host+metric_name來區分不同的狀態參數的,也就是它無法區分同一host內的不同進程相同的名稱的狀態變量。 但是對於單純的一個狀態量,雖然可能是多個進程的狀態,但對它來說只能看到一個名稱,所以當多個進程同時向它報告具有同一個名稱的狀態的value時,它 無法區分出進程間的不同。如果要區分它們,就需要加入一個命名機制區分它們。
程 序運行完畢,該程序對應的自定義的那些metric不會消失,這意味着雖然程序運行結束,但我們依然可以查看其歷史記錄。但另一方面這樣也會帶來新的問 題,由於我們采用的針對metric的命名機制,會導致metric積累到很多,這樣會導致xml變得越來越大,增加中央節點解析該文件時的壓力,也不方 面查閱。目前有一個可行的方法就是修改gmetad的配置文件,減少數據的保存時間的設置。
基於ganglia的監控運行時,需要各個客戶端安裝gangliang的客戶端gmond。收集數據的那個節點還需要安裝ganglia的服務端gmetad,為了可以從web顯示結果,還需要安裝http服務器。安裝這些還有很多依賴軟件。具體參見1環境安裝配置。
除 了使用ganglia內置的網頁頁面外,也可以自行得到xml文件去進行自己的分析。通常需要自己編寫一個腳本來完成該任務。通過直接telnet gmond或者gmetad的tcp服務監聽端口,可以直接得到xml文件,然后我們就可以對該xml文件進行需要的處理了。在單播模式下,應該 telnet那個gmond的中央節點,登錄該節點才能得到集群內所有節點的信息,否則只能得到單獨節點的信息。
The ganglia distributed monitoring system-design implementation
Wide Area Cluster Monitoring with Ganglia
http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration
轉自:http://duanple.blog.163.com/blog/static/70971767201183092413177/