參考文獻:html
一、http://blog.csdn.net/shifenglov/article/details/40658007前端
二、http://blog.sina.com.cn/s/blog_9b6ffb330101bkv9.htmlpython
三、https://www.cnblogs.com/pingjie/p/4809489.htmllinux
Ganglia:Ganglia是UC Berkeley發起的一個開源集羣監視項目,設計用於測量數以千計的節點。Ganglia的核心包含gmond、gmetad以及一個Web前端。主要是用來監控系統性能,如:cpu 、mem、硬盤利用率, I/O負載、網絡流量狀況等,經過曲線很容易見到每一個節點的工做狀態,對合理調整、分配系統資源,提升系統總體性能起到重要做用。ios
Nagios:Nagios是一款開源的電腦系統和網絡監視工具,能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網絡設置,打印機等。在系統或服務狀態異常時發出郵件或短信報警第一時間通知網站運維人員,在狀態恢復後發出正常的郵件或短信通知。vim
Ganglia的優點在於實時監控集羣中的機器的各項指標,好比cpu,內存,磁盤,溫度等數據,彙總成成各類圖形化界面,並提供接口可供調用數據。而在出現問題的時候報警提示功能,相對較弱。網絡
Nagios的優點在於出現問題之時能夠提供強大的報警提示功能,可是在實時監控上,功能較弱,即便使用NRPE本地插件也不能提供強大的機器監控。架構
在集羣運維中,有兩種方式,第一種,當問題出現的時候可以獲得報警提示,運維人員可以迅速出擊解決問題,將損失減小到最少。第二種,在問題出現以前,找到可能出現的問題,解決問題,避免問題出現。運維
所以Nagios適合第一種場景,Ganglia適合第二種場景,二者結合能有效的解決各類場景。固然還有其餘的監控報警軟件,好比Monitorix,NetXMS,cacti,Zabbix等。socket
這裏,咱們選擇最成熟的Ganglia和Nagios。
1. 集羣中已經安裝了Ganglia(安裝過程能夠參考個人上一篇博客http://blog.csdn.net/shifenglov/article/details/40587527)
2. 集羣中已經安裝了Nagios(安裝過程能夠參考這篇博客http://www.cnblogs.com/mchina/archive/2013/02/20/2883404.html)
經過Nagios調用Ganglia的接口,獲取整個集羣的監控指標,若是超過設定的報警閥值,則予以報警提示。
1.複製check_ganglia.py腳本到nagios的執行目錄中
若是有源碼,則check_ganglia.py在ganglia-3.6.0/contrib/check_ganglia.py中
若是沒有源碼,則能夠下載check_ganglia.py,很容易搜到
#cp check_ganglia.py/usr/local/nagios/libexec/
#!/usr/bin/env python import sys import getopt import socket import xml.parsers.expat class GParser: def __init__(self, host, metric): self.inhost =0 self.inmetric = 0 self.value = None self.host = host self.metric = metric def parse(self, file): p = xml.parsers.expat.ParserCreate() p.StartElementHandler = parser.start_element p.EndElementHandler = parser.end_element p.ParseFile(file) if self.value == None: raise Exception('Host/value not found') return float(self.value) def start_element(self, name, attrs): if name == "HOST": if attrs["NAME"]==self.host: self.inhost=1 elif self.inhost==1 and name == "METRIC" and attrs["NAME"]==self.metric: self.value=attrs["VAL"] def end_element(self, name): if name == "HOST" and self.inhost==1: self.inhost=0 def usage(): print """Usage: check_ganglia \ -h|--host= -m|--metric= -w|--warning= \ -c|--critical= [-s|--server=] [-p|--port=] """ sys.exit(3) if __name__ == "__main__": ############################################################## ganglia_host = '10.20.1.131' ganglia_port = 8649 host = None metric = None warning = None critical = None try: options, args = getopt.getopt(sys.argv[1:], "h:m:w:c:s:p:", ["host=", "metric=", "warning=", "critical=", "server=", "port="], ) except getopt.GetoptError, err: print "check_gmond:", str(err) usage() sys.exit(3) for o, a in options: if o in ("-h", "--host"): host = a elif o in ("-m", "--metric"): metric = a elif o in ("-w", "--warning"): warning = float(a) elif o in ("-c", "--critical"): critical = float(a) elif o in ("-p", "--port"): ganglia_port = int(a) elif o in ("-s", "--server"): ganglia_host = a if critical == None or warning == None or metric == None or host == None: usage() sys.exit(3) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ganglia_host,ganglia_port)) parser = GParser(host, metric) value = parser.parse(s.makefile("r")) s.close() except Exception, err: print "CHECKGANGLIA UNKNOWN: Error while getting value \"%s\"" % (err) sys.exit(3) if critical > warning: if value >= critical: print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) sys.exit(2) elif value >= warning: print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) sys.exit(1) else: print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) sys.exit(0) else: if critical >=value: print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) sys.exit(2) elif warning >=value: print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) sys.exit(1) else: print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) sys.exit(0)
修改好之後(注意上面文件中ganglia_host及ganglia_port變量修改)
./check_ganglia.py 試一下,沒問題
-h 指定主機。在這裏須要注意的是,這裏填寫的是主機名。前提是IP能夠被解析。
在/var/lib/ganglia/rrds/my cluster/裏面能夠看到相應的主機名
-m 檢測的是什麼參數,在rrds目錄下能夠看到。命令中不帶.rrd
-w warning
-c critical
例如
./check_ganglia.py -h 10.20.1.131 -m load_one -w 4 -c 5
2.追加獲取ganglia數據命令
#vim /usr/local/nagios/etc/objects/commands.cfg
追加內容以下:
define command { command_name check_ganglia command_line $USER1$/check_ganglia.py -h $HOSTADDRESS$ -m $ARG1$ -w $ARG2$ -c $ARG3$ }
3.追加監測數據所在主機信息(文件爲新追加)
#vim /usr/local/nagios/etc/objects/hosts.cfg
文件內容以下:
define host{ use linux-server host_name test address 10.20.1.131 } define hostgroup{ hostgroup_name ganglia-servers alias ganglia-servers members test }
4.追加監測metrics信息(文件爲新追加)
#vim /usr/local/nagios/etc/objects/services.cfg
文件內容以下:
define servicegroup{ servicegroup_name ganglia-metrics alias Ganglia Metrics } define service{ use ganglia-service host_name test hostgroup_name ganglia-servers service_description load_one check_command check_ganglia!load_one!4!5 } define service{ use ganglia-service host_name test hostgroup_name ganglia-servers service_description mem_free check_command check_ganglia!mem_free!50000!40000 }
5.追加模板信息
#vim /usr/local/nagios/etc/objects/templates.cfg
追加內容以下:
define service { use generic-service name ganglia-service hostgroup_name ganglia-servers service_groups ganglia-metrics register 0 }
6.追加配置文件關聯
#vim /usr/local/nagios/etc/nagios.cfg
追加內容以下:
#引進host文件 cfg_file=/usr/local/nagios/etc/objects/hosts.cfg #引進監控項的文件 cfg_file=/usr/local/nagios/etc/objects/services.cfg
7. 修改gmetad配置,使其share監控數據
由於默認狀況下,ganglia的gmetad服務不會share監控指標給網絡上的其餘機器,默認只能把數據傳輸到localhost,因此須要作相應的配置,使其能夠share相應數據給其餘機器。主要是考慮nagios的主機與ganglia的主機沒在同一臺機器上。
# vi /etc/ganglia/gmetad.conf
修改內容以下:
trusted_hosts 10.20.1.158 ##添加信任的主機IP
8.重啓ganglia及nagios服務
ganglia:
#service ganglia-monitor restart
#service gmetad restart
nagios:
#service nagios restart
9.訪問