Ganglia集羣監控

 

簡介

 

Ganglia是UC Berkeley發起的一個開源集羣監視項目,設計用於測量數以千計的節點。Ganglia的核心包含gmond、gmetad以及一個Web前端。主要是用來監控系統性能,如:cpu 、mem、硬盤利用率, I/O負載、網絡流量狀況等,經過曲線很容易見到每一個節點的工做狀態,對合理調整、分配系統資源,提升系統總體性能起到重要做用。php

每臺計算機都運行一個收集和發送度量數據的名爲 gmond 的守護進程。接收全部度量數據的主機能夠顯示這些數據而且能夠將這些數據的精簡表單傳遞到層次結構中。正由於有這種層次結構模式,才使得 Ganglia 能夠實現良好的擴展。gmond 帶來的系統負載很是少,這使得它成爲在集羣中各臺計算機上運行的一段代碼,而不會影響用戶性能。全部這些數據屢次收集會影響節點性能。網絡中的 「抖動」發生在大量小消息同時出現時,能夠經過將節點時鐘保持一致,來避免這個問題。html

gmetad能夠部署在集羣內任一臺節點或者經過網絡鏈接到集羣的獨立主機,它經過單播路由的方式與gmond通訊,收集區域內節點的狀態信息,並以XML數據的形式,保存在數據庫中。由RRDTool工具處理數據,並生成相應的的圖形顯示,以Web方式直觀的提供給客戶端。前端

ganglia又依賴於一個web服務器用來顯示集羣狀態,用rrdtool來存儲數據和生成曲線圖,須要xml解析所以須要expat,配置文件解析須要libconfuse。安裝apche的httpd還須要支持php4以上,同時還有一些依賴軟件。node

安裝

採用源碼編譯安裝,從http://ganglia.info網站下載最新版的ganglia,下載後解壓。python

1 ./configure --with-librrd=/rrd/path  --with-gmetad 2 --prefix=/usr/local/ganglia 3 make
4 make install

 

若是中間出現依賴軟件問題,則須要安裝缺乏的那個軟件包。安裝完畢後,須要進行配置,其配置文件通常放在/etc/ganglia目錄下,名稱爲gmetad.conf。固然對於路徑並無嚴格要求,由於gmetad能夠在啓動時指定所用的配置文件。mysql

 安裝ganglia後,還須要安裝apache服務器,同時須要有php模塊支持,不然最終的顯示頁面沒法正常顯示。推薦採用yum install –y httpd phplinux

不然若是沒有配置正確,則有可能apache不能和php正確關聯。web

安裝完畢後能夠輸入http://localhost/test.php,編一個php頁面測試下是否成功安裝。sql

 

 配置

若是採用源碼安裝,根據前面的--prefixganglia會被安裝到/usr/local/ganglia目錄下。數據庫

 首先建一個目錄,該目錄用來存放ganglia的web頁面

mkdir -p /var/www/html/ganglia/

該目錄用來存放後面用來顯示數據的web頁面。 

因爲採用源碼編譯的,並無將gmetad和gmond加爲服務,執行如下命令。

1 cp gmetad/gmetad.Init /etc/rc.d/Init.d/gmetad#拷貝gmetad服務啓動腳本 2 cp gmond/gmond.Init /etc/rc.d/Init.d/gmond #拷貝gmond服務啓動腳本 3 mkdir /etc/ganglia #建立配置文件主目錄 4 gmond -t | tee /etc/ganglia/gmond.conf #生成gmond服務配置文件 5 cp gmetad/gmetad.conf /etc/ganglia/ #拷貝gmetad服務配置文件 6 mkdir -p /var/lib/ganglia/rrds #建立rrd文件存放目錄 7 chown nobody:nobody /var/lib/ganglia/rrds #屬主和屬組都爲nobody 8 chkconfig --add gmetad #將服務交給chkconfig管理 9 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保存數據的目錄

1 rrd_rootdir "/var/lib/ganglia/rrds"
2 
3 Network
4 
5 xml_port 8651 #能夠telnet到該端口,獲得gmetad的xml文件
6 
7 interactive_port 8652 #php頁面數據交互使用的端口

 

php頁面的配置

須要到/var/www/html/ganglia/目錄下查找

php.conf

1 gmetad_root = "/var/lib/ganglia"; #gmetad寫入的rrd數據庫的路徑 2 rrds = "$gmetad_root/rrds"; 3 ganglia_ip = "localhost"; #gmetad服務器的地址 4 ganglia_port = 8652;       #gmetad服務器的交互式提供監控數據端口

 

默認狀況下,web前端每300秒(5分鐘)刷新一次,能夠修改刷新間隔時間,經過修改config.php文件實現,它裏面包括有全部的Ganglia Web參數。

 ganglia客戶端配置

vi /etc/ganglia/gmond.conf

 

主要是三個地方須要修改,cluster name,udp_send_channel,udp_recv_channel。注意單播與多播模式的區別,在多播模式下,加入該多播組的節點都會收到組內全部其餘節點的數據,因此每一個至關於一個備份。單播模式下,只是點到點的發送數據,數據只會發向特定的那個host,這種模式下一般具備一箇中央收集節點。

 

 1 cluster {  2 
 3   name = "Cluster1" #本節點屬於哪一個cluster  4 
 5   owner = "chifeng" #誰是該節點的全部者  6 
 7   latlong = "unspecified" #在地球上的座標,經度、緯度?  8 
 9   url = "unspecified"
10 
11 } 12 
13 udp_send_channel { #udp包的發送通道 14 
15   mcast_join = 239.2.11.71   #多播,工做在239.2.11.71通道下。若是使用單播模式,則要寫host = host1(接受數據的目標主機),單播模式下也能夠配置多個udp_send_channel 16 
17   port = 8649 #監聽端口 18 
19   ttl = 1
20 
21 } 22 
23 udp_recv_channel { #接收udp包配置 24 
25   mcast_join = 239.2.11.71   #一樣工做在239.2.11.71通道下,若是使用單播模式,則要寫host = localip,就是必須是本機的ip 26 
27   port = 8649 #監聽端口 28 
29   bind = 239.2.11.71 #綁定 30 
31 } 32 
33 tcp_accept_channel { 34 
35   port = 8649 #經過tcp協議監聽的端口,遠端能夠經過連接8649端口獲得監控數據,gmetad就是經過該端口獲得xml數據 36 
37 }

 

 

還有其餘的一些配置項,一般狀況下不須要修改,其含義以下:

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)

 

實例以下:

 1 collection_group {  2   collect_every = 80
 3   time_threshold = 950
 4  metric {  5     name = "proc_run"
 6     value_threshold = "1.0"
 7  }  8  metric {  9     name = "proc_total"
10     value_threshold = "1.0"
11  } 12 }

 

 命令集合

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

 

服務端:

安裝expat-2.0.1.tar.gz

 

1 tar xvzf expat-2.0.1.tar.gz 2 cd expat*;./configure --prefix=/usr/local/apr 3 make
4 make install

 

 

安裝confuse-2.6

1 ./configure --prefix=/usr/local/confuse-2.6 CFLAGS=-fPIC --disable-nls 2 make
3 make install

 

安裝apr

1 tar xvjf apr-1.3.2.tar.bz2 2 cd apr-1.3.2
3 ./configure --prefix=/usr/local/apr 4 make
5 make install

 

安裝apr-util-1.3.2.tar.bz2

 

1 tar xvjf apr-util-1.3.2.tar.bz2 2 cd apr-util-1.3.2
3 ./configure --with-apr=/usr/local/apr --with-expat=/usr/local/expat 4 make
5 make install
6 cp /usr/local/apr-1.3.2/include/apr-1/* /usr/local/apr-1.3.2/include/目錄 #由於ganglia安裝時默認會去/usr/local/apr/include下尋找apr的庫文件。

 

安裝rrdtool-1.2.27.tar.gz

 

1 tar xvzf rrdtool-1.2.27.tar.gz 2 cd rrdtool-1.2.27
3 ./configure --prefix=/usr/local/rrdtool 4 make
5 make install
6 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

 

 

安裝ganglia

 

1 ./configure --with-librrd=/opt/rrdtool-1.4.4 --with-gmetad --prefix=/usr/local/ganglia --with-libconfuse=/usr/local/confuse-2.6
2 make
3 make install

 

安裝apache服務器和php支持

1 yum -y install httpd mysqld php-mysql php

 

客戶端:

 1 wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libconfuse-2.5-4.el5.x86_64.rpm
 2 wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libconfuse
 3 devel-2.5-4.el5.x86_64.rpm  4 scp apr-*.* 10.250.13.45:~/
 5 scp libconfuse-*.* 10.250.13.45:~/
 6 scp ganglia-*.gz 10.250.13.45:~/
 7 scp ganglia-devel-*.rpm 10.250.13.45:~/
 8 scp *.conf 10.250.13.45:~/
 9 ssh 10.250.13.45
10 sudo su -
11 yum install expat 12 cd /home/admin 13 tar -xvf apr-1.4.*.gz 14 cd apr*
15 ./configure --prefix=/usr/local/apr 16 make
17 make install
18 cd .. 19 tar -xvf apr-util-1.3.9.*
20 cd apr-util*
21 ./configure --with-apr=/usr/local/apr 22 make
23 make install
24 cd .. 25 rpm -ivh  libconfuse-2.5-4.el5.x86_64.rpm 26 rpm -ivh libconfuse-devel-2.5-4.el5.x86_64.rpm 27 tar -xvf ganglia-3.1.*.gz 28 cd ganglia*
29 cp /usr/local/apr/bin/apr-1* /usr/local/bin/
30 ./configure --with-apr=/usr/local/apr 31 find / -name "libpython2.5*"
32 cp /usr/local/lib/libpython2.5.so /usr/lib/libpython2.5.so 33 make
34 make install
35 cd .. 36 rpm -ivh ganglia-devel-3.1.1-1.x86_64.rpm --nodeps 37 cd /etc 38 mkdir ganglia 39 cp /home/admin/*.conf /etc/ganglia/ 40 cd /etc/ganglia 41 vi gmond.conf ;edit udp send and recv host. 42 vi /usr/local/etc/gmond.conf 43 gmond --debug=10 44 ps -e|grep gmond 45 kill -9 id 46 gmond 47 #若是必要須要從新修改gmond.conf 48 scp test 10.250.13.42:~/ 49 scp test 10.250.13.43:~/ 50 scp test 10.250.13.44:~/ 51 scp test 10.250.13.45:~/ 52 vi /etc/profile 53 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/usr/local/lib64/" 54 source /etc/profile

 

 

安裝問題

缺乏庫文件,一般在make過程當中出現該錯誤,ld找不到對應的庫好比libpython2.5.so

解決方法:find命令查找這兩個文件,並ln –s 建立指向這兩個文件的軟連接引用。

find / -name libpython*

 

若是安裝過程當中出現依賴錯誤,一般在configure時出現

解決方法:首先利用find查找,若是找到能夠閱讀readme,查看是否有參數支持指明該路徑。不行考慮拷貝到默認目錄,仍是不行則能夠加入參數--nodeps,而後download該lib,一般包含在其devel包裏,須要去網上查找包含該lib的文件,而後安裝。

  配置及運行問題

測試gmond和gmetad是否運行成功:

1 Telent localhost 8649
2 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的路徑地址端口是否正確。

 

ganglia工做原理

Ganglia項目是由加州大學發起的,如今已經成爲一個應用很是普遍集羣監控軟件。能夠監視和顯示集羣中的節點的各類狀態信息,好比如:cpu 、mem、硬盤利用率, I/O負載、網絡流量狀況等,同時能夠將歷史數據以曲線方式經過php頁面呈現。同時具備很好的擴展性,容許用戶加入本身所要監控的狀態信息。

 

 

                                                                       

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

 

                                                                         

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

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

 

                                                           

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

 自定義metrics

向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環境安裝配置。

 

高級擴展

 

直接讀取xml文件

 

除了使用ganglia內置的網頁頁面外,也能夠自行獲得xml文件去進行本身的分析。一般須要本身編寫一個腳原本完成該任務。經過直接telnet gmond或者gmetad的tcp服務監聽端口,能夠直接獲得xml文件,而後咱們就能夠對該xml文件進行須要的處理了。在單播模式下,應該telnet那個gmond的中央節點,登陸該節點才能獲得集羣內全部節點的信息,不然只能獲得單獨節點的信息。

 

 參考文獻

http://duanple.blog.163.com/blog/static/70971767201183092413177/

相關文章
相關標籤/搜索