轉載請注明作者:phylips@bmy 2011-9-30
出處:http://duanple.blog.163.com/blog/static/70971767201183092413177/
Ganglia是伯克利開發的一個集群監控軟件。可以監視和顯示集群中的節點的各種狀態信息,比如如:cpu 、mem、硬盤利用率, I/O負載、網絡流量情況等,同時可以將歷史數據以曲線方式通過php頁面呈現。
而ganglia又依賴於一個web服務器用來顯示集群狀態,用rrdtool來存儲數據和生成曲線圖,需要xml解析因此需要expat,配置文件解析需要libconfuse。安裝apche的httpd還需要支持php4以上,同時還有一些依賴軟件。
在redhat可以通過如下命令安裝這些依賴軟件:
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
libconfuse可以通過如下命令得到:
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libconfuse-2.5-4.el5.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libconfuse-devel-2.5-4.el5.x86_64.rpm
這里采用下載源碼編譯安裝,到http://ganglia.info網站下載最新版的ganglia,下載后解壓。
./configure --with-librrd=/rrd/path --with-gmetad --prefix=/usr/local/ganglia
make
make install
如果中間出現依賴軟件問題,則需要安裝缺少的那個軟件包。安裝完畢后,需要進行配置,其配置文件一般放在/etc/ganglia目錄下,名稱為gmetad.conf。當然對於路徑並沒有嚴格要求,因為gmetad可以在啟動時指定所用的配置文件。
安裝ganglia后,還需要安裝apache服務器,同時需要有php模塊支持,否則最終的顯示頁面無法正常顯示。推薦采用yum install httpd php
否則如果沒有配置正確,則有可能apache不能和php正確關聯。
安裝完畢后可以輸入http://localhost/test.php,編一個php頁面測試下是否成功安裝。
1.2.2 配置
如果采用源碼安裝,根據前面的—prefix,ganglia會被安裝到/usr/local/ganglia目錄下。
首先建一個目錄,該目錄用來存放ganglia的web頁面
mkdir -p /var/www/html/ganglia/
該目錄用來存放后面用來顯示數據的web頁面。
由於采用源碼編譯的,並沒有將gmetad和gmond加為服務,執行以下命令。
cp gmetad/gmetad.Init /etc/rc.d/Init.d/gmetad //拷貝gmetad服務啟動腳本
cp gmond/gmond.Init /etc/rc.d/Init.d/gmond //拷貝gmond服務啟動腳本
mkdir /etc/ganglia //創建配置文件主目錄
gmond -t | tee /etc/ganglia/gmond.conf //生成gmond服務配置文件
cp gmetad/gmetad.conf /etc/ganglia/ //拷貝gmetad服務配置文件
mkdir -p /var/lib/ganglia/rrds //創建rrd文件存放目錄
chown nobody:nobody /var/lib/ganglia/rrds //屬主和屬組都為nobody
chkconfig --add gmetad //將服務交給chkconfig管理
chkconfig --add gmond //同上
修改配置文件/etc/gmetad.conf通常只需要修改如下的參數:
data_source "Clustername" host1 host2
將 集群名稱改為你自己的,host1 host2是gmetad用來得到集群信息的xml文件的數據源,如果沒有寫端口,則采用默認的8649端口,gmetad默認每隔15秒通過tcp連接 去該主機下載xml文件。所以他們可以是gmond的8649端口,也可以是gmetad的8651端口,它們都可以提供集群信息的xml格式的數據下 載。
host1 host2是or的關系,如果host1無法下載,則才會嘗試去host2下載,所以它們應該都是同一個集群的節點,保存着同樣的數據。采用 multicast模式時,每台gmond節點都有本cluster內節點機器的所有監控數據,因此不需要把所有節點寫入data_source中。建議 寫入不低於2個,在host1節點死機的時候,會自動找host2節點取數據。
此外gmetad還有如下的屬性設置:
RRD database storage defInition
RRAs "RRA:AVERAGE:0.5:1:244" "RRA:AVERAGE:0.5:24:244" "RRA:AVERAGE:0.5:168:244" "RRA:AVERAGE:0.5:672:244" "RRA:AVERAGE:0.5:5760:374"
RRD files location
訪問控制Access control
trusted_hosts address1 address2 … DN1 DN2 …
all_trusted OFF/on
rrd保存數據的目錄
rrd_rootdir "/var/lib/ganglia/rrds"
Network
xml_port 8651 #可以telnet到該端口,得到gmetad的xml文件
interactive_port 8652 #php頁面數據交互使用的端口
1.2.3 php頁面的配置
需要到/var/www/html/ganglia/目錄下查找
php.conf
$gmetad_root = "/var/lib/ganglia"; #gmetad寫入的rrd數據庫的路徑
$rrds = "$gmetad_root/rrds";
$ganglia_ip = "localhost"; #gmetad服務器的地址
$ganglia_port = 8652; #gmetad服務器的交互式提供監控數據端口
默認情況下,web前端每300秒(5分鍾)刷新一次,可以修改刷新間隔時間,通過修改config.php文件實現,它里面包括有所有的Ganglia Web參數。
vi /etc/ganglia/gmond.conf
主 要是三個地方需要修改,cluster name,udp_send_channel,udp_recv_channel。注意單播與多播模式的區別,在多播模式下,加入該多播組的節點都會收到 組內所有其他節點的數據,所以每個相當於一個備份。單播模式下,只是點到點的發送數據,數據只會發向特定的那個host,這種模式下通常具有一個中央收集 節點。
cluster {
name = "Cluster1" #本節點屬於哪個cluster
owner = "chifeng" #誰是該節點的所有者
latlong = "unspecified" #在地球上的坐標,經度、緯度?
url = "unspecified"
}
mcast_join = 239.2.11.71 #多播,工作在239.2.11.71通道下。如果使用單播模式,則要寫host = host1(接受數據的目標主機),單播模式下也可以配置多個udp_send_channel
port = 8649 #監聽端口
ttl = 1
}
udp_recv_channel { #接收udp包配置
mcast_join = 239.2.11.71 #同樣工作在239.2.11.71通道下,如果使用單播模式,則要寫host = localip,就是必須是本機的ip
port = 8649 #監聽端口
bind = 239.2.11.71 #綁定
}
tcp_accept_channel {
port = 8649 #通過tcp協議監聽的端口,遠端可以通過鏈接8649端口得到監控數據,gmetad就是通過該端口得到xml數據
}
還有其他的一些配置項,通常情況下不需要修改,其含義如下:
Collection_group section:
collect_once – Specifies that the group of static metrics
collect_every – Collection interval (only valid for non-static)
time_threshold – Max data send interval
Metric section:
Name – Metric name (see “gmond –m”)
Value_threshold – Metric variance threshold (send if exceeded)
實例如下:
collection_group {
collect_every = 80
time_threshold = 950
metric {
name = "proc_run"
value_threshold = "1.0"
}
metric {
name = "proc_total"
value_threshold = "1.0"
}
}
說明:命令集合,是指我在安裝配置時所使用的那些命令行命令,這些可以作為自動化部署腳步的一個基礎。后面可以考慮編寫自動化部署的腳步。
服務端:
1)安裝expat-2.0.1.tar.gz
tar xvzf expat-2.0.1.tar.gz
cd expat*;./configure --prefix=/usr/local/apr;make;make install
2)安裝confuse-2.6
./configure --prefix=/usr/local/confuse-2.6 CFLAGS=-fPIC --disable-nls;make;make install
3)安裝apr
tar xvjf apr-1.3.2.tar.bz2
cd apr-1.3.2;./configure --prefix=/usr/local/apr;make;make install
安裝apr-util-1.3.2.tar.bz2
tar xvjf apr-util-1.3.2.tar.bz2
cd apr-util-1.3.2;./configure --with-apr=/usr/local/apr --with-expat=/usr/local/expat
make;make install
cp /usr/local/apr-1.3.2/include/apr-1/* /usr/local/apr-1.3.2/include/目錄,因為ganglia安裝時默認會去/usr/local/apr/include下尋找apr的庫文件。
4)安裝rrdtool-1.2.27.tar.gz
tar xvzf rrdtool-1.2.27.tar.gz
cd rrdtool-1.2.27;./configure --prefix=/usr/local/rrdtool
make;make install
5)cp /usr/local/apr/bin/apr-1* /usr/local/bin/拷過這個后 OK否則會編譯出問題
報錯如下:
Checking for apr
checking for apr-1-config... no
configure: error: apr-1-config binary not found in pat
6)安裝ganglia
./configure --with-librrd=/opt/rrdtool-1.4.4 --with-gmetad --prefix=/usr/local/ganglia --with-libconfuse=/usr/local/confuse-2.6
7)make;make install
8)安裝apache服務器和php支持
yum -y install httpd mysqld php-mysql php
客戶端:
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libconfuse-2.5-4.el5.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libconfuse-devel-2.5-4.el5.x86_64.rpm
scp apr-*.* 10.250.13.45:~/
scp libconfuse-*.* 10.250.13.45:~/
scp ganglia-*.gz 10.250.13.45:~/
scp ganglia-devel-*.rpm 10.250.13.45:~/
scp *.conf 10.250.13.45:~/
ssh 10.250.13.45
sudo su -
yum install expat
cd /home/admin
tar -xvf apr-1.4.*.gz
cd apr*
./configure --prefix=/usr/local/apr
make
make install
cd ..
tar -xvf apr-util-1.3.9.*
cd apr-util*
./configure --with-apr=/usr/local/apr
make
make install
cd ..
rpm -ivh libconfuse-2.5-4.el5.x86_64.rpm
rpm -ivh libconfuse-devel-2.5-4.el5.x86_64.rpm
tar -xvf ganglia-3.1.*.gz
cd ganglia*
cp /usr/local/apr/bin/apr-1* /usr/local/bin/
./configure --with-apr=/usr/local/apr
find / -name "libpython2.5*"
cp /usr/local/lib/libpython2.5.so /usr/lib/libpython2.5.so
make
make install
cd ..
rpm -ivh ganglia-devel-3.1.1-1.x86_64.rpm --nodeps
cd /etc
mkdir ganglia
cp /home/admin/*.conf /etc/ganglia/
cd /etc/ganglia
vi gmond.conf ;edit udp send and recv host.
vi /usr/local/etc/gmond.conf
gmond --debug=10
ps -e|grep gmond
kill -9 id
gmond
如果必要需要重新修改gmond.conf
scp test 10.250.13.42:~/
scp test 10.250.13.43:~/
scp test 10.250.13.44:~/
scp test 10.250.13.45:~/
vi /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/usr/local/lib64/"
source /etc/profile
◎缺少庫文件,通常在make過程中出現該錯誤,ld找不到對應的庫比如libpython2.5.so
解決方法:find命令查找這兩個文件,並ln –s 創建指向這兩個文件的軟鏈接引用。find / -name libpython*
◎如果安裝過程中出現依賴錯誤,通常在configure時出現
解決方法:首先利用find查找,如果找到可以閱讀readme,查看是否有參數支持指明該路徑。不行考慮拷貝到默認目錄,還是不行則可以加入參數—nodeps,然后download該lib,通常包含在其devel包里,需要去網上查找包含該lib的文件,然后安裝。
1.4.2 配置及運行問題
◎測試gmond和gmetad是否運行成功
Telent localhost 8649
Telent localhost 8651
如果沒有反應
解決方法:很可能是因為服務沒有啟動,或者使用的不是默認端口,ps –e|grep gmond,查找服務是否啟動。查看gmond.conf看所使用的tcp recv端口。
還找不到原因,就可以用調試模式啟動查看原因
gmond –debug=10
如果出現udp之類的端口綁定錯誤,比如是已被bind,則查看是否有端口已被利用 lsof –i:port。
還 可能是配置文件配置不正確,比如我曾經將udp_recv_channel的host修改成與udp_send_channel相同的值,就發生了端口錯 誤,udp_recv_channel的host必須是本機的ip(一個機子可能有多個ip)。如果是權限禁止,則考慮當前用戶身份,或者換成root試 下。
測試php前端支持是否成功
◎php頁面顯示為文件或者提示下載文件
解決方法:說明apache的php模塊沒有安裝配置好。使用yum install 或者重新下載安裝php模塊,並在apache的conf文件里配置好。
◎顯示頁面無圖象展示
首先檢查selinux是否關閉
然后查看conf.php文件里的rrdtool路徑是否正確,該文件是否存在,注意該路徑是rrdtool可執行文件的路徑不是其安裝目錄。
然后查看/var/lib/ganglia/rrds是否存在,能否被寫。chown nobody:nobody /var/lib/ganglia/rrds # make sure RRDTool can write here.
查看php.conf里的gmetad的路徑地址端口是否正確。
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