一、什么是Ganglia
對於這個工具,大家可能比較陌生,但是它功能非常強大,如果我們想收集所有服務器、網絡設備的數據,那么ganglia絕對是首選,在深入學習之前,還是先從基礎概念了解起吧!
Ganglia是一款為HPC(高性能計算)集群而設計的可擴展的分布式監控系統,它可以監視和顯示集群中的節點的各種狀態信息,它由運行在各個節點上的gmond守護進程來采集CPU 、內存、硬盤利用率、I/O負載、網絡流量情況等方面的數據,然后匯總到gmetad守護進程下,使用rrdtool存儲數據,最后將歷史數據以曲線方式通過PHP頁面呈現。
Ganglia的特點如下:
良好的擴展性,分層架構設計能夠適應大規模服務器集群的需要
負載開銷低,支持高並發
廣泛支持各種操作系統(UNIX等)和cpu架構,支持虛擬機
二、Ganglia的組成
Ganglia監控系統有三部分組成,分別是gmond、gmetad、webfrontend,作用如下。
gmond: 即為ganglia monitoring daemon,是一個守護進程,運行在每一個需要監測的節點上,用於收集本節點的信息並發送到其他節點,同時也接收其他節點發過了的數據,默認的監聽端口為8649。
gmetad: 即為ganglia meta daemon,是一個守護進程,運行在一個數據匯聚節點上,定期檢查每個監測節點的gmond進程並從那里獲取數據,然后將數據指標存儲在本地RRD存儲引擎中。
webfrontend: 是一個基於web的圖形化監控界面,需要和Gmetad安裝在同一個節點上,它從gmetad取數據,並且讀取RRD數據庫,通過rrdtool生成圖表,用於前台展示,界面美觀、豐富,功能強大。
下圖是一個簡單的Ganglia監控系統結構圖。
從圖中可以看出,一個Ganglia監控系統是由多個gmond進程和一個主gmetad進程組成,所有gmond進程將收集到的監控數據匯總到gmetad管理端,而gmetad將數據存儲到RRD數據庫中,最后通過PHP程序在Web界面進行展示。
這是最簡單的Ganglia運行結構圖,在復雜的網絡環境下,還有更復雜的Gnaglia監控架構。下圖是Ganglia的另一種分布式監控架構圖。
從這個圖中可以看出,gmond可以等待gmetad將監控數據收集走,也可以將監控數據交給其它gmond,進而讓其他gmond將數據最終交付給gmetad,同時,gmetad也可以收集其他gmetad的數據.比如,對於上圖中的Cluster1和Cluster2集群,Cluster2就是一個gmetad,它將自身收集到的數據又一次的傳輸給了Cluster1集群;而Cluster1將所有集群的數據進行匯總,然后通過Web進行統一展現。
三、Ganglia的工作原理
在介紹Ganglia的工作原理之前,需要介紹一下在Ganglia中經常用到的幾個名詞,這些是了解Ganglia分布式構架的基礎。在Ganglia分布式結構中,經常提到的幾個名詞有node、cluster和grid,這三部分構成了Ganglia分布式監控系統。
node: Ganglia監控系統中的最小單位,即被監控的單台服務器。
cluster:表示一個服務器集群,由多台服務器組成,是具有相同監控屬性的一組服務器的集合。
grid: 表示一個網格。grid由多個服務器集群組成,即多個cluster組成一個grid。
從上面介紹可以看出這三者之間的關系:
一個grid對應一個gmetad,在gmetad配置文件中可以指定多個cluster。
一個node對應一個gmond,gmond負責采集其所在機器的數據,同時gmond還可以接收來自其他gmond的數據,而gmetad定時去每個node上收集監控數據。
1、Ganglia數據流向分析
在Ganglia分布式監控系統中,gmond和gmetad之間是如何傳輸數據呢?接下來介紹一下Ganglia是如何實現數據的傳輸和收集的。下圖是Ganglia的數據流向圖,也是Ganglia的內部工作原理。
下面簡述下Ganglia基本運作流程。
1) gmond收集本機的監控數據,發送到其他機器上,並收集其他機器的監控數據,gmond之間通過udp通信,傳遞文件格式為XDL。
2) gmond節點間的數據傳輸方式支持單播點對點傳送外,還支持多播傳送。
3) gmetad周期性的到gmond節點或gmetad節點上獲取(poll)數據,gmetad只有tcp通道,因此gmond與gmetad之間的數據都以XML格式傳輸。
4) gmetad既可以從gmond也可以從其他的gmetad得到XML數據。
5) gmetad將獲取到的數據更新到rrds數據庫中。
6) 通過web監控界面,從gmetad取數據,並且讀取rrds數據庫,生成圖片顯示出來。
2、Ganglia工作模式
Ganglia的收集數據工作可以在單播(unicast)或多播(multicast)模式下進行,默認為多播模式。
單播:每個被監控節點發送自己收集到的本機數據到指定的一台或幾台機器上。單播模式可以跨越不同的網段。如果是多個網段的網絡環境,就可以采用單播模式采集數據。
多播:每個被監控節點發送自己收集到的本機數據到同一網段內所有的機器上,同時也接收同一網段內的所有機器發送過來的監控數據。因為是以廣播包的形式發送,因此這種模式需要所有主機在同一網段內。但在同一網段內,又可以定義不同的發送通道。
四、Ganglia的安裝
在介紹安裝之前,首先說明一下安裝環境,這里采用CentOS7.5的Linux發行版本,其他版本的安裝過程基本相同。
Ganglia的安裝很簡單,可以通過源碼包和yum源兩種方式進行安裝。yum源方式安裝方便,可以自動安裝依賴關系,但是版本往往不是最新的,而通過源碼方式,可以安裝最新版的Ganglia。下面具體介紹一下這兩種安裝方式。
4.1、yum源安裝方式
CentOS系統中默認的yum源並沒有包含Ganglia,所以我們必須安裝擴展的yum源。從下面這個地址下載Linux附加軟件包(EPEL),然后安裝擴展yum源:
[root@node1 ~]#wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm [root@node1 ~]# rpm -ivh epel-release-latest-7.noarch.rpm
完成yum源安裝,就可以直接通過yum方式安裝Ganglia了。
Ganglia的安裝分為兩個部分,分別是gmetad和gmond,gmetad安裝在監控管理端,gmond安裝在需要監控的客戶端主機,對應的yum包名稱分別為ganglia-gmetad和ganglia-gmond。
下面介紹通過yum方式安裝Ganglia的過程。
以下操作是在監控管理端進行的,首先通過yum命令查看下可用的Ganglia安裝信息:
[root@monitor ~]#yum list ganglia* 可安裝的軟件包 ganglia.x86_64 3.7.2-2.el7 epel ganglia-devel.x86_64 3.7.2-2.el7 epel ganglia-gmetad.x86_64 3.7.2-2.el7 epel ganglia-gmond.x86_64 3.7.2-2.el7 epel ganglia-gmond.x86_64 3.7.2-2.el7 epel ganglia-gmond-python.x86_64 3.7.2-2.el7 epel ganglia-web.x86_64 3.7.1-2.el7 epel
從輸出可知,通過yum安裝的Ganglia版本為ganglia-3.7.2,。接着開始安裝ganglia-gmetad:
[root@monitor ~]# yum -y install ganglia-gmetad.x86_64
安裝gmetad需要rrdtool的支持,而通過yum方式,會自動查找gmetad依賴的安裝包,自動完成安裝,這也是yum方式安裝的優勢。
最后在需要監控的所有客戶端主機上安裝gmond服務:
[root@node1 ~]# yum -y install ganglia-gmond.x86_64
這樣,Ganglia監控系統就安裝完成了。通過yum方式安裝的Ganglia默認配置文件位於/etc/ganglia中。
4.2、源碼方式
通過源碼方式安裝Ganglia稍微有一定的復雜性,但是可以使用最新的版本,這也是我們推薦的安裝方式。源碼方式安裝Ganglia也分為監控管理端的安裝和客戶端的安裝,這里我們安裝使用的是Ganglia最新穩定版本ganglia-3.7.2,安裝的路徑是/opt/app/ganglia。首先在監控管理端通過yum命令安裝Ganglia的基礎依賴包,操作如下:
[root@monitor ~]#yum install -y expat expat-devel pcre pcre-devel zlib cairo-devel libxml2-devel pango-devel pango libpng-devel libpng freetype freetype-devel libart_lgpl-devel apr-devel rrdtool rrdtool-devel
接着安裝ganglia的依賴程序,首選是apr,可從http://apr.apache.org/download.cgi 網站下載,編譯安裝如下:
[root@monitor ~]#tar zxvf apr-1.6.3.tar.gz [root@monitor ~]#cd apr-1.6.3 [root@monitor apr-1.6.3]#./configure [root@monitor apr-1.6.3]#make [root@monitor apr-1.6.3]#make install
接着是confuse的安裝,可從http://ftp.twaren.net/Unix/NonGNU/confuse/ 下載,操作過程如下:
[root@monitor ~]#tar zxvf confuse-2.7.tar.gz [root@monitor ~]#cd confuse-2.7 [root@monitor confuse-2.7]#./configure CFLAGS=-fPIC --disable-nls [root@monitor confuse-2.7]#make [root@monitor confuse-2.7]#make install
最后進入ganglia-gmetad的安裝,過程如下:
[root@monitor ~]#tar zxvf ganglia-3.7.2.tar.gz [root@monitor ~]#cd ganglia-3.7.2 [root@monitor ganglia-3.7.2]# ./configure --prefix=/opt/app/ganglia --with-static-modules --enable-gexec --enable-status --with-gmetad --with-python=/usr --with-libexpat=/usr --with-libconfuse=/usr/local --with-libpcre=/usr/local [root@monitor ganglia-3.7.2]#make [root@monitor ganglia-3.7.2]# make install [root@monitor gmetad]# mkdir -p /opt/app/ganglia/var/run [root@monitor gmetad]# systemctl enable gmetad
至此,ganglia-gmetad安裝完成。
下面介紹Ganglia客戶端的安裝過程,ganglig-gmond的安裝與ganglia-gmetad大致相同,對於系統依賴包和基礎軟件包的安裝完全相同,只是ganglig-gmond不需要rrdtool的支持,因此重點講述ganglig-gmond的編譯安裝過程。
[root@node1 ~]#tar zxvf ganglia-3.7.2.tar.gz [root@node1 ~]#cd ganglia-3.7.2 [root@node1 ganglia-3.7.2]#./configure --prefix=/opt/app/ganglia --enable-gexec --enable-status --with-python=/usr --with-libapr=/usr/local/apr/bin/apr-1-config --with-libconfuse=/usr/local --with-libexpat=/usr --with-libpcre=/usr [root@node1 ganglia-3.7.2]#make [root@node1 ganglia-3.7.2]#make install [root@node1 gmond]#cd gmond [root@node1 gmond]#./gmond -t > /opt/app/ganglia/etc/gmond.conf #用於生成gmond服務配置文件 [root@node1 gmond]#mkdir -p /opt/app/ganglia/var/run [root@node1 gmond]# systemctl enable gmond
到這里為止,ganglig-gmond安裝完成。
五、配置一個Ganglia分布式監控系統
5.1、 Ganglia配置文件介紹
Ganglia的配置文件主要有兩個,分別是監控管理端的gmetad.conf和客戶端的gmond.conf文件。根據Ganglia安裝方式的不同,配置文件的路徑也不相同,通過yum方式安裝的Ganglia,默認的配置文件位於/etc/ganglia下,而通過源碼方式安裝的Ganglia,配置文件路徑位於ganglia安裝路徑的etc目錄下,例如上面通過源碼方式安裝的Ganglia配置文件路徑為/opt/app/ganglia/etc。在監控管理端,只需要配置gmetad.conf文件即可,而在客戶端也只需要配置gmond.conf文件就行了。
5.2、 Ganglia監控系統架構圖
Ganglia支持多種監控架構,這是由gmetad的特性決定的,gmetad可以周期性地去多個gmond節點收集數據,這就是ganglia的兩層架構。同時,gmetad不但可以從gmond收集數據,也可以從其他的gmetad得到數據,這就形成了Gnaglia的三層架構。多種架構方式也體現了Ganglia作為分布式監控系統的靈活性和擴展性。
這里介紹一個簡單的Ganglia配置構架,即一個監控管理端和多個客戶端的兩層架構。我們假定gmond工作在多播模式,並且有一個Cluster1的集群,其中有4台要監控的服務器,主機名從cloud0到cloud3,這4台主機在同一個網段內。
5.3、 Ganglia監控管理端配置
監控管理端的配置文件是gmetad.conf,這個配置文件內容比較多,但是需要修改的配置僅有如下幾個:
data_source "Cluster1" cloud0 cloud2 gridname "TopGrid" xml_port 8651 interactive_port 8652 rrd_rootdir "/opt/app/ganglia/rrds"
data_source:此參數定義了集群名字,以及集群中的節點。Cluster1就是這個集群的名稱,cloud0和cloud2指明了從這兩個節點收集數據,Cluster1后面指定的節點名可以是IP地址,也可以是主機名,由於采用了multicast模式,每個gmond節點都有本Cluster1集群節點所有監控數據,因此不需要把所有節點都寫入data_source中。但是建議寫入不低於2個,這樣,在cloud0節點出現故障的時候,gmetad會自動到cloud2節點采集數據,這樣就保證了Ganglia監控系統的高可用性。
上面通過data_source參數定義了一個服務器集群Cluster1,對於要監控多個應用系統的情況,還可以對不同用途的主機進行分組,定義多個服務器集群,分組方式可以通過下面的方法定義:
data_source "my cluster" 10 localhost my.machine.edu:8649 1.2.3.5:8655 data_source "my grid" 50 1.3.4.7:8655 grid.org:8651 grid-backup.org:8651 data_source "another source" 1.3.4.7:8655 1.3.4.8
可以通過定義多個data_source來實現監控多個服務器集群,而每個服務器集群在定義集群節點的時候,可以采用主機名或IP地址等形式,也可以加端口,如果不加端口,默認端口是8649,同時可以設定采集數據的頻率,如上面的“10 localhost、50 1.3.4.7:8655”等,分別表示每隔10秒鍾、50秒鍾采集一次數據。
gridname:此參數是定義一個網格名稱。一個網格有多個服務器集群組成,每個服務器集群由“data_source”選項來定義。
xml_port:此參數定義了一個收集數據匯總的交互端口,如果不指定,默認是8651,可以通過telnet這個端口得到監控管理端收集到的客戶端的所有數據。
interactive_port:此參數定義了Web端獲取數據的端口,這個端口在配置Ganglia的Web監控界面時需要指定。
rrd_rootdir:此參數定義了rrd數據庫的存放目錄,gmetad在收集到監控數據后會將其更新到該目錄下的對應的rrd數據庫中。gmetad需要對此文件夾有寫權限,默認gmetad是通過nobody用戶運行的,因此需要授權此目錄的權限為nobody。即為:chown -R nobody:nobody /opt/app/ganglia/rrds。
到這里為止,在Ganglia監控管理端的配置完成了。
5.4、 Ganglia的客戶端配置
Ganglia監控客戶端gmond安裝完成后,配置文件位於Ganglia安裝路徑的etc目錄下,名稱為gmond.conf,這個配置文件稍微復雜,如下所示:
globals { daemonize = yes #是否后台運行,這里表示以后台的方式運行 setuid = yes #是否設置運行用戶,在Windows中需要設置為false user = nobody #設置運行的用戶名稱,必須是操作系統已經存在的用戶,默認是nobody debug_level = 0 #調試級別,默認是0,表示不輸出任何日志,數字越大表示輸出的日志越多 max_udp_msg_len = 1472 mute = no #是否發送監控數據到其他節點,設置為no表示本節點將不再廣播任何自己收集到的數據到網絡上 deaf = no #是否接受其他節點發送過來的監控數據,設置為no表示本節點將不再接收任何其他節點廣播的數據包 allow_extra_data = yes#是否發送擴展數據 host_dmax = 0 /*secs */#是否刪除一個節點,0代表永遠不刪除,0之外的整數代表節點的不響應時間,超過這個時間后,Ganglia就會刷新集群節點信息進而刪除此節點 cleanup_threshold = 300 /*secs */ #gmond清理過期數據的時間 gexec = no #是否使用gexec來告知主機是否可用,這里不啟用 send_metadata_interval = 60 #主要用在在單播環境中,如果設置為0,那么如果某個節點的gmond重啟后,gmond匯聚節點將不再接受這個節點的數據,將此值設置大於0,可以保證在gmond節點關閉或重啟后,在設定的時間內,gmond匯聚節點可以重新接收此節點發送過來的信息。單位秒 } cluster { name = "Cluster1" #集群的名稱,是區分此節點屬於某個集群的標志,必須和監控服務端data_source中的某一項名稱匹配 owner = "junfeng" #節點的擁有者,也就是節點的管理員 latlong = "unspecified" #節點的坐標,經度、緯度等,一般無需指定 url = "unspecified" #節點的URL地址,一般無需指定 } host { location = "unspecified" #節點的物理位置,一般無需指定 } udp_send_channel { #udp包的發送通道 mcast_join = 239.2.11.71 #指定發送的多播地址,其中239.2.11.71是一個D類地址。如果使用單播模式,則要寫host = host1,網絡環境復雜的情況下,推薦使用單播模式。在單播模式下也可以配置多個udp_send_channel port = 8649 #監聽端口 ttl = 1 } udp_recv_channel { #接收udp包配置 mcast_join = 239.2.11.71 #指定接收的多播地址,同樣也是239.2.11.71這個D類地址 port = 8649 #監聽端口 bind = 239.2.11.71 #綁定地址 } tcp_accept_channel { port = 8649 #通過tcp協議監聽的端口,在遠端可以通過連接到8649端口得到監控數據 }
在一個集群內,所有客戶端的配置是一樣的。完成一個客戶端配置后,將配置文件復制到此集群內的所有客戶端主機上即可完成客戶端主機的配置。
5.5、 Ganglia的Web端配置
Ganglia的web監控界面是基於PHP的,因此需要安裝LAMP或LNMP環境。推薦大家使用LNMP環境,這個環境在zabbix章節中已經介紹很清楚了,這里不再介紹,大家可以在http://sourceforge.net/projects/ganglia/files/下載ganglia-web的最新版本,然后將ganglia-web程序放到Apche Web的根目錄即可,這里我們推薦下載的版本是ganglia-web-3.7.2。
配置Ganglia的Web界面比較簡單,只需要修改幾個php文件即可。首先是conf_default.php,可以將conf_default.php重命名為conf.php,也可以保持不變,Ganglia的Web默認先找conf.php,找不到會繼續找conf_default.php,需要修改的內容如下:
$conf['gweb_confdir'] = "/var/www/html/ganglia"; #ganglia web的根目錄 $conf['gmetad_root'] = "/opt/app/ganglia"; # ganglia程序安裝目錄 $conf['rrds'] = "${conf['gmetad_root']}/rrds"; #ganglia web讀取rrd數據庫的路徑,這里是/opt/app/ganglia/rrds $conf['dwoo_compiled_dir'] = "${conf['gweb_confdir']}/dwoo/compiled"; #需要“777”權限 $conf['dwoo_cache_dir'] = "${conf['gweb_confdir']}/dwoo/cache"; #需要“777”權限 $conf['rrdtool'] = "/opt/rrdtool/bin/rrdtool"; #指定rrdtool的路徑 $conf['graphdir']= $conf['gweb_root'] . '/graph.d'; #生成圖形模板目錄 $conf['ganglia_ip'] = "125.0.0.1"; #gmetad服務所在服務器的地址 $conf['ganglia_port'] = 8652; #gmetad服務器的交互式提供監控數據端口發布
這里需要說明的是:“$conf[‘dwoo_compiled_dir’]”和“$conf[‘dwoo_cache_dir’]”指定的路徑在默認情況下可能不存在,因此需要手動建立compiled和cache目錄,並授予Linux下“777”的權限。另外,rrd數據庫的存儲目錄/opt/app/ganglia/rrds一定要保證rrdtool可寫,因此需要執行授權命令:
chown –R nobody:nobody /opt/app/ganglia/rrds
這樣rrdtool才能正常讀取rrd數據庫,進而將數據通過Web界面展示出來。其實ganglia-web的配置還是比較簡單的,一旦配置出錯會給出提示,根據錯誤提示進行問題排查,一般都能找到解決方法。
六、Ganglia監控系統的管理和維護
在Ganglia的所有配置完成之后,就可以啟動Ganglia監控服務了,首先在被監控節點依次啟動gmond服務,操作如下:
[root@node1 ~]#systemctl start gmond
然后通過查看系統的/var/log/messages日志信息,判斷gmond是否成功啟動,如果出現問題,根據日志的提示進行解決。
接着就可以啟動監控管理節點的gmetad服務了,操作如下:
[root@monitor ~]#systemctl start gmetad
同樣,也可以跟蹤一下系統的/var/log/messages日志信息,看啟動過程是否出現異常。
最后,將Apache/PHP的Web服務啟動,就可以查看Ganglia收集到的所有節點的監控數據信息。下圖是Ganglia Web某一時刻的運行狀態圖。
到這里位置,ganglia分布式監控平台已經搭建起來了,默認情況下,ganglia會對每個監控節點的CPU、內存、磁盤、網絡、IO、負載進行自動收集數據,無需做任何配置,並且收集數據的gmond進程非常輕量級,基本不會對被監控服務器上的業務造成影響。因此,通過ganglia可以監控海量主機。
ganglia 的基礎本文先介紹到這里,下面會對ganglia分布式監控和分布式架構、以及ganglia擴展監控做更詳細的介紹。