對於這個工具,你們可能比較陌生,可是它功能很是強大,若是咱們想收集全部服務器、網絡設備的數據,那麼ganglia絕對是首選,在深刻學習以前,仍是先從基礎概念瞭解起吧!php
Ganglia是一款爲HPC(高性能計算)集羣而設計的可擴展的分佈式監控系統,它能夠監視和顯示集羣中的節點的各類狀態信息,它由運行在各個節點上的gmond守護進程來採集CPU 、內存、硬盤利用率、I/O負載、網絡流量狀況等方面的數據,而後彙總到gmetad守護進程下,使用rrdtool存儲數據,最後將歷史數據以曲線方式經過PHP頁面呈現。css
Ganglia的特色以下:html
良好的擴展性,分層架構設計可以適應大規模服務器集羣的須要
負載開銷低,支持高併發
普遍支持各類操做系統(UNIX等)和cpu架構,支持虛擬機node
Ganglia監控系統有三部分組成,分別是gmond、gmetad、webfrontend,做用以下。python
gmond: 即爲ganglia monitoring daemon,是一個守護進程,運行在每個須要監測的節點上,用於收集本節點的信息併發送到其餘節點,同時也接收其餘節點發過了的數據,默認的監聽端口爲8649。
gmetad: 即爲ganglia meta daemon,是一個守護進程,運行在一個數據匯聚節點上,按期檢查每一個監測節點的gmond進程並從那裏獲取數據,而後將數據指標存儲在本地RRD存儲引擎中。
webfrontend: 是一個基於web的圖形化監控界面,須要和Gmetad安裝在同一個節點上,它從gmetad取數據,而且讀取RRD數據庫,經過rrdtool生成圖表,用於前臺展現,界面美觀、豐富,功能強大。nginx
下圖是一個簡單的Ganglia監控系統結構圖。web
從圖中能夠看出,一個Ganglia監控系統是由多個gmond進程和一個主gmetad進程組成,全部gmond進程將收集到的監控數據彙總到gmetad管理端,而gmetad將數據存儲到RRD數據庫中,最後經過PHP程序在Web界面進行展現。shell
這是最簡單的Ganglia運行結構圖,在複雜的網絡環境下,還有更復雜的Gnaglia監控架構。下圖是Ganglia的另外一種分佈式監控架構圖。數據庫
從這個圖中能夠看出,gmond能夠等待gmetad將監控數據收集走,也能夠將監控數據交給其它gmond,進而讓其餘gmond將數據最終交付給gmetad,同時,gmetad也能夠收集其餘gmetad的數據.好比,對於上圖中的Cluster1和Cluster2集羣,Cluster2就是一個gmetad,它將自身收集到的數據又一次的傳輸給了Cluster1集羣;而Cluster1將全部集羣的數據進行彙總,而後經過Web進行統一展示。apache
在介紹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上收集監控數據。
在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數據庫,生成圖片顯示出來。
Ganglia的收集數據工做能夠在單播(unicast)或多播(multicast)模式下進行,默認爲多播模式。
單播:每一個被監控節點發送本身收集到的本機數據到指定的一臺或幾臺機器上。單播模式能夠跨越不一樣的網段。若是是多個網段的網絡環境,就能夠採用單播模式採集數據。
多播:每一個被監控節點發送本身收集到的本機數據到同一網段內全部的機器上,同時也接收同一網段內的全部機器發送過來的監控數據。由於是以廣播包的形式發送,所以這種模式須要全部主機在同一網段內。但在同一網段內,又能夠定義不一樣的發送通道。
在介紹安裝以前,首先說明一下安裝環境,這裏採用CentOS7.5的Linux發行版本,其餘版本的安裝過程基本相同。
Ganglia的安裝很簡單,能夠經過源碼包和yum源兩種方式進行安裝。yum源方式安裝方便,能夠自動安裝依賴關係,可是版本每每不是最新的,而經過源碼方式,能夠安裝最新版的Ganglia。下面具體介紹一下這兩種安裝方式。
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中。
經過源碼方式安裝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的配置文件主要有兩個,分別是監控管理端的gmetad.conf和客戶端的gmond.conf文件。根據Ganglia安裝方式的不一樣,配置文件的路徑也不相同,經過yum方式安裝的Ganglia,默認的配置文件位於/etc/ganglia下,而經過源碼方式安裝的Ganglia,配置文件路徑位於ganglia安裝路徑的etc目錄下,例如上面經過源碼方式安裝的Ganglia配置文件路徑爲/opt/app/ganglia/etc。在監控管理端,只須要配置gmetad.conf文件便可,而在客戶端也只須要配置gmond.conf文件就好了。
Ganglia支持多種監控架構,這是由gmetad的特性決定的,gmetad能夠週期性地去多個gmond節點收集數據,這就是ganglia的兩層架構。同時,gmetad不但能夠從gmond收集數據,也能夠從其餘的gmetad獲得數據,這就造成了Gnaglia的三層架構。多種架構方式也體現了Ganglia做爲分佈式監控系統的靈活性和擴展性。
這裏介紹一個簡單的Ganglia配置構架,即一個監控管理端和多個客戶端的兩層架構。咱們假定gmond工做在多播模式,而且有一個Cluster1的集羣,其中有4臺要監控的服務器,主機名從cloud0到cloud3,這4臺主機在同一個網段內。
監控管理端的配置文件是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監控管理端的配置完成了。
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端口獲得監控數據 }
在一個集羣內,全部客戶端的配置是同樣的。完成一個客戶端配置後,將配置文件複製到此集羣內的全部客戶端主機上便可完成客戶端主機的配置。
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監控服務了,首先在被監控節點依次啓動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擴展監控作更詳細的介紹。