Ganglia:分佈式監控系統

1         環境安裝配置

1.1      依賴軟件下載

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

1.2      安裝配置步驟
1.2.1     安裝

這裏採用下載源碼編譯安裝,到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參數。


1.2.4     ganglia客戶端配置

vi /etc/ganglia/gmond.conf

主要是三個地方需要修改,cluster name,udp_send_channel,udp_recv_channel。注意單播與多播模式的區別,在多播模式下,加入該多播組的節點都會收到組內所有其他節點的數據,所以每個相當於一個備份。單播模式下,只是點到點的發送數據,數據只會發向特定的那個host,這種模式下通常具有一箇中央收集節點。

 

cluster {

  name = "Cluster1"     #本節點屬於哪個cluster

  owner = "chifeng"     #誰是該節點的所有者

  latlong = "unspecified"   #在地球上的座標,經度、緯度?

  url = "unspecified"

}

udp_send_channel {       #udp包的發送通道

  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.3      命令集合

說明:命令集合,是指我在安裝配置時所使用的那些命令行命令,這些可以作爲自動化部署腳步的一個基礎。後面可以考慮編寫自動化部署的腳步。

 

服務端:

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

 

1.4      問題及解決
1.4.1     安裝問題

◎缺少庫文件,通常在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前端支持是否成功

http://localhost/ganglia

◎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的路徑地址端口是否正確。

 

2         原理

Ganglia項目是由加州大學發起的,現在已經成爲一個應用非常廣泛集羣監控軟件。可以監視和顯示集羣中的節點的各種狀態信息,比如如:cpu 、mem、硬盤利用率, I/O負載、網絡流量情況等,同時可以將歷史數據以曲線方式通過php頁面呈現。同時具有很好的擴展性,允許用戶加入自己所要監控的狀態信息。


2.1      ganglia工作原理

Ganglia:分佈式監控系統 - 星星 - 銀河裏的星星

                                                                              圖 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節點內部模塊圖如下所示:

Ganglia:分佈式監控系統 - 星星 - 銀河裏的星星

                                                                         圖 2  Gmond節點模塊結構圖

如上圖所示,主要由三個模塊組成,collect and publish模塊,該模塊週期性的調用一些內部指令獲得metric data,然後將這些數據通過udp通道發佈給其他gmond節點。Listen Threads,監聽其他gmond節點的發送的udp數據,然後將數據存放到內存中。XML export thread負責將數據以xml格式發佈出去,比如交給gmetad。

 下面重點介紹下unicast模式下ganglia系統內的數據流。

Ganglia:分佈式監控系統 - 星星 - 銀河裏的星星

                                                            圖 3單播狀況下集羣節點間的數據流

如上圖所示,多個gmond節點通過udp向單播的目標host的gmond發送數據,gmetad然後向該目標host的gmond請求xml文件,然後存入rrdtool數據庫。 在unicast模式中,圖中方框內的組件通常是位於集羣內的同一個節點。該節點負責收集存儲 顯示被監控的各節點的狀態信息。

 

2.2      自定義metrics

向ganglia加入自定義metric有兩種方法,一種是通過命令行的方式運行gmetric,另一種是通過ganglia提供的面向c和python的擴展模塊,加入自定義的模塊支持。


2.3      優點及可能存在的問題
2.3.1     優點

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也會存儲進去

 
2.3.2     可能存在的問題及瓶頸

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的配置文件,減少數據的保存時間的設置。

 
2.3.3運行需要做的部署工作

基於ganglia的監控運行時,需要各個客戶端安裝gangliang的客戶端gmond。收集數據的那個節點還需要安裝ganglia的服務端gmetad,爲了可以從web顯示結果,還需要安裝http服務器。安裝這些還有很多依賴軟件。具體參見1環境安裝配置。

 
3 高級擴展


3.1 直接讀取xml文件
 

除了使用ganglia內置的網頁頁面外,也可以自行得到xml文件去進行自己的分析。通常需要自己編寫一個腳本來完成該任務。通過直接telnet gmond或者gmetad的tcp服務監聽端口,可以直接得到xml文件,然後我們就可以對該xml文件進行需要的處理了。在單播模式下,應該telnet那個gmond的中央節點,登錄該節點才能得到集羣內所有節點的信息,否則只能得到單獨節點的信息。

 

4 參考文獻

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章