ganglia 監控技術分析
Ganglia是一個分布式的監控工具,用來對Grid和Cluster上面的節點進行監控,利用它提供的web界面可以看到每個節點狀態,并且可以輸出 圖形化的表示。 Ganglia 是 UC Berkeley 發起的一個開源監視項目,設計用于測量數以千計的節點。每臺計算機都運行一個收集和發送度量數據(如處理器速度、內存使用量等)的名為 gmond 的守護進程。它將從操作系統和指定主機中收集。接收所有度量數據的主機可以顯示這些數據并且可以將這些數據的精簡表單傳遞到層次結構中。正因為有這種層次 結構模式,才使得 Ganglia 可以實現良好的擴展。gmond 帶來的系統負載非常少,這使得它成為在集群中各臺計算機上運行的一段代碼,而不會影響用戶性能。
名詞說明
Metrics : 監控電腦的運行數據,這個詞中文比較難翻譯,英語中有度量的意思,下文我就不翻譯,直接用原詞。
Node : 一臺電腦,或許擁有多個CPU,中文稱之為節點。
Cluster : 一組節點,中文稱之為簇。通常節點之間擁有達到G比特的高帶寬,簇內通過組播協議,每個節點組播自己的數據,所以每個節點擁有整個簇的狀態,這種冗余設計可以提高簇的魯棒性。一般簇內節點為相同的系統和體系結構,由同一個管理員管理。
Grid : 一組簇,中文可稱之為網格。網格的用處是在一個大范圍內把各異構的簇通過寬帶匯聚在一起。在文獻3中,還有一個概念是Planetary-scale systems,也就是全球性的網絡,一般部署于主干網的根節點。并且假定,網內的帶寬不充裕,而且昂貴,經常有擁塞的情況出現。這是加州伯克利的一個 GRID網絡:http://monitor.millennium.berkeley.edu 你可以通過選擇Grid或者Cluster來查看各類數據。
Ganglia的各種組成功能
gmond(Ganglia Monitor Daemon) :數據采集器的服務程序,配置文件是/etc/gmond.conf 位于每個Node上
gmetad(Ganglia Metadata Daemon):數據混合收集器的服務程序,配置文件是/etc/gmetad.conf。它通過輪詢收集gmond的數據,并聚合簇的各類信息,然后保 存在本地rrdtool的數據庫中,最好每個cluster都有一個gmetad,以便能構建多級網絡.
Web可視化工具:這是用PHP腳本實現的將數據可視化,并畫出表格。可以是任何支持PHP、SSL和XML的web服務器。一般都用Apache2web服務器
額外的高級工具
gmetric可以用來添加你需要監控的Node額外狀態;gstat可以直接獲得Ganglia的數據,每臺需要這些功能的Node上
ganglia功能示意圖
從圖中可以看到,簇內通過UDP協議組播壓縮的XML(XDR)數據,每個節點共享簇內所有節點的信息,當gmetad輪詢簇內某個節點不成功時,也可以輪詢其他節點。gmetad通過TCP協議發送簇內數據給上層gmetad節點。
gmond程序由多個線程組成:
collect and publish thread線程用于采集節點的metrics并組播出去;
listening thread線程用于監聽組播端口,并把這些metrics保存于內存中的一個多級hash表;一組XML export threads線程組用于相應TCP請求,把簇內的metrics發送出去。
gmond 不會保存數據,僅僅是監聽保存并相應發送數據。節點間通過 heartbeat信號檢測對方節點存活與否,如果一段時間內該節點沒有廣播metrics,我們視其宕機,而且每次啟動時,會廣播一個gmond啟動時 間,這時鄰居節點收到以后就視其機器重啟,會刪除該節點已存的所有metrics。
gmetad周期性的向data source發送輪詢包,并為每個源分配一個線程。采集的metrics,經由SAX XML進行解析,內置一個gperf的hash表,便于數據的處理,最后將處理好的數據存于RRDTools中。
metrics的組成
Metrics 數據由gmond內置的程序或gmetric程序獲得,一般以XDR(外部數據表示法(External Data Representation,縮寫為XDR))形式壓縮保存,保存格式為:(key,value),key為4 字節,value為4-8字節。metrics的采集次數、頻率和發送時間間隔均在Gmond.conf中定義,gmond維持一個采集表,每個 metric都有其屬性。
一個多簇異構Ganglia網絡的數據流
圖中有四種簇:
黃色Cluster - 既有本地的Node,也提供前端顯示的接口。它提供web服務器查看Ganglia的數據,其中不僅包含本地的Node(可選),也包括藍色和綠色簇中的數據。
淡綠色Cluster - 前端web服務顯示,一般沒有本地節點。
藍色Cluster - 這個簇中沒有本地的數據收集器。所以這些節點將會共享所有數據(由于gmond是用多播來發送數據,所以實現共享比較容易),然后其中一個節點將數據發送給上層的數據收集器。黃色簇的gmetad服務收集并儲存,如果沒有保存,這些數據將會丟失。
深綠色Cluster - 這個簇中擁有本地數據收集器和倉庫。綠色節點中也是共享數據,但是由一個簇頭節點收集數據,并儲存,在被詢問時通過TCP發送給上層的黃色簇。
一般性的組網建議:
1、網絡由許多深綠色節點和有本地節點的黃色簇組成
2、網絡由許多藍色節點和沒有本地節點的黃色簇組成
各類簇的配置綠色簇的配置
針對gmond.conf 獲得gmond默認配置
gmond -t >/etc/gmond.conf
gmond.conf修改如下:
/* This configuration is as close to 2.5.x default behavior. as possible
The values closely match ./gmond/metric.h definitions in 2.5.x */
globals {
daemonize = yes
setuid = yes
user = nobody
debug_level = 0
max_udp_msg_len = 1472
mute = no
deaf = no
host_dmax = 0 /*secs */
cleanup_threshold = 300 /*secs */
gexec = no
}
/* If a cluster attribute is specified, then all gmond hosts are wrapped inside
* of a
* NOT be wrapped inside of a
cluster {
name = "green"
owner = "unspecified"
latlong = "unspecified"
url = "unspecified"
}
/* The host section describes attributes of the host, like the location */
host {
location = "unspecified"
}
/* Feel free to specify as many udp_send_channels as you like. Gmond
used to only support having a single channel. */
udp_send_channel {
mcast_join = green_header
port = 8649
}
/* You can specify as many udp_recv_channels as you like as well. */
udp_recv_channel {
port = 8649
family = inet4
}
...
對于mcast_join這個參數,green_header是簇頭節點的主機名,你可以指定ip。
然后重啟gmond服務。
簇頭節點中/etc/gmetad.conf需要添加下面一行:
data_source "green" localhost
藍色簇的配置
藍色簇的配置與綠色簇類似,你只需要把簇的名字和簇頭的名字設定好,然后重啟所有節點的gmond服務。
黃色簇的配置
大部分配置與綠色簇類似,在/etc/gmetad.conf中需要加入以下幾行:
data_source "yellow" localhost
data_source "blue" blue_header
data_source "green" green_header
這樣gmetad就會:
1、聯系本地gmond,獲取所有黃色節點的狀態數據。
2、聯系blue_header節點的gmond,獲取所有藍色節點的狀態數據。這些數據將會保存在本地的rrdtool數據庫中。
3、聯系green_header節點,獲取在gmetad收集的rrdtools的整合數據。注意這些數據并不會保存在黃色簇中的rrdtools中,所以如果前端web服務器刷新時,會重新向green_header請求更新的的數據。
此外,在/etc/gmetad.conf ,也可以加入Grid的名稱: gridname "Rainbow"
現在Ganglia的網頁會顯示一個叫Rainbow的網絡,其中有三個簇:yellow,green和blue。
一些高級話題gmetric的使用
你可以添加固件:
gmetric --name firmware --value `lsattr -El sys0 -a modelname -F value` --type "string"
添加磁盤的數目:
gmetric --name number_of_disks --value `lspv | wc -l` --type int32
添加對某項數據的監控(其中name是現實的名字,value是由myget程序獲取的,獲取的數字類型是由type決定):
gmetric --name tpm --value `/usr/local/bin/myget` --type double
上面統計都只是一次,如果你需要長久的顯示,最好是把上面的語句每60秒執行一次。然后,過幾分鐘以后,這些數據就會在網頁上顯示出來了。
對于gmetric的更多了解,你可以看http://ganglia.wiki.sourceforge.net/ganglia_readme 。
這里有一些自定義的gmetric腳本可以參考:http://ganglia.sourceforge.net/gmetric/
使用gstat獲取數據,gstat可以通過命令直接顯示數據,如:
[root@rac1 ~]# gstat
CLUSTER INFORMATION
Name: my_hadoop
Hosts: 3
Gexec Hosts: 0
Dead Hosts: 0
Localtime: Tue Feb 14 20:40:05 2012
There are no hosts running gexec at this time
[root@rac1 ~]#
你也可以通過加參數獲取更多的信息:
[root@rac1 ~]# gstat --all --single_line
CLUSTER INFORMATION
Name: my_hadoop
Hosts: 3
Gexec Hosts: 0
Dead Hosts: 0
Localtime: Tue Feb 14 20:39:43 2012
CLUSTER HOSTS
Hostname LOAD CPU Gexec
CPUs (Procs/Total) [ 1, 5, 15min] [ User, Nice, System, Idle, Wio]
rac2 1 ( 0/ 481) [ 0.04, 0.14, 0.11] [ 2.3, 0.0, 0.4, 97.3, 0.1] OFF
rac3 1 ( 0/ 406) [ 0.07, 0.04, 0.01] [ 0.2, 0.0, 0.4, 99.4, 0.0] OFF
rac1 1 ( 0/ 777) [ 0.09, 0.43, 0.42] [ 2.7, 0.0, 0.9, 96.3, 0.0] OFF