上一章講了用django搭建了一個檢測網站是否可訪問的簡單監控系統 , 領導要求還需要有雲端服務器CPU 記憶體等硬體方面的監控資訊 ,並按時提供報表
看了下開源的這種叢集監控方案,決定先採用ganglia, 畢竟安裝簡單,報表豐富~
安裝ganglia
編譯安裝的方式非常繁瑣,直接採用yum安裝的方式。雲端服務器系統 redhat6.3
到yum的設定檔 /etc/yum.repo/ 目錄下 ,將此目錄下的所有檔案刪除(刪除前先備份,可以直接將檔案名稱改名為xxx.repo.bak)
然後建立CentOS6-Base-sohu.repo (直接採用sohu源,速度很快) ,檔案內容如下:
注意系統的版本,我的系統為redhat6.3,如果是7.x的版本,baseurl裡更改為/centos/7/ 即可
# CentOS-Base.repo## The mirror system uses the connecting IP address of the client and the# update status of each mirror to pick mirrors that are updated to and# geographically close to the client. You should use this for CentOS updates# unless you are manually picking other mirrors.## If the mirrorlist= does not work for you, as a fall back you can try the # remarked out baseurl= line instead.##[base] name=CentOS-6.3 - Base baseurl=http://mirrors.sohu.com/centos/6/os/x86_64/ gpgcheck=0 enabled=1 [epel] name=epel baseurl=http://mirrors.sohu.com/fedora-epel/6/x86_64/ gpgcheck=0 enabled=1 [extra] name=extra baseurl=http://mirrors.sohu.com/centos/6/extras/x86_64 gpgcheck=0 enabled=1 [update] name=extra baseurl=http://mirrors.sohu.com/centos/6/updates/x86_64 gpgcheck=0 enabled=1 [openstack]name=cloudbaseurl=http://mirrors.sohu.com/centos/6/cloud/x86_64/openstack-kilo/gpgcheck=0enabled=0
注意:如果是centos系統, 直接 yum install -y epel-release 安裝 epel包就可以了
server端安裝
yum install rrdtool ganglia-gmetad ganglia-gmond ganglia-web httpd php
client端安裝
yum install ganglia-gmond
ganglia配置
server端需要配置 /etc/ganglia/gmond.conf 以及 /etc/ganglia/gmetad.conf 兩個檔案
> vi /etc/ganglia/gmond.conf 採用組播的模式 ,只需要更改以下三個地方
cluster {name = "toltech_launcher" // 這個名稱相當於叢集分組....}udp_send_channel {mcast_join = 239.2.11.72port = 8649ttl = 1}udp_recv_channel { mcast_join = 239.2.11.72 port = 8649 bind = 239.2.11.72 retry_bind = true}
為server端配置資料來源 ,toltech_launcher 與gmond.conf中的cluster name值一致。
由於server端也安裝了gmond作為被監控端,這裡的資料來源直接配置server本機localhost就可以,也可以配置為叢集被監控端的其他IP。或者配置多個資料來源
> vi /etc/ganglia/gmetad.conf
data_source "toltech_launcher" localhost:8649
將server端的/etc/ganglia/gmond.conf 檔案分發到client端,配置結束
> scp /etc/ganglia/gmond.conf root@{ip}:/etc/ganglia/gmond.conf
運行ganglia
Server端
service gmond start
service gmetad start
service httpd start
Client端
service gmond start
測試
# 命令列列印當前活動client
gstat -a
web訪問 http://{your_ip}/ganglia
python抓取報表圖片並郵件發送
ganglia已經安裝完成, 可以從web上看到各種硬體的監控報表 。但是領導並沒有時間來開啟網站看如此多的報表,
如何讓領導知道我們在努力工作呢,當然是主動把報表發送領導郵箱了~
仔細觀察下ganglia中各種報表的圖片地址, 可以發現每張報表圖片都是一個有規律的地址
比如叢集總cpu報表 :
http://ip/ganglia/graph.php?r=day&z=xlarge&c=toltech_launcher&m=load_one&s=by+name&mc=2&g=cpu_report
參數r=day ,表示上一天的監控報表,如果想要上一小時的報表,改成r=hour 就可以 ,還有按周、按月等等可以自己去觀察相應的參數
c=toltech_launcher ,很明顯代表報表所對應的資料來源,我這裡代表的是叢集分組,不同的應用使用不同的分組,方便營運查看
g=cpu_report ,表示為cpu的報表, 其他的還有 g=network_report 網路報表 ,g=mem_report 記憶體報表等 。
還有叢集內各個節點的監控資訊
比如 #叢集內各節點剩餘記憶體 http://ip/ganglia/stacked.php?m=mem_free&c=toltech_launcher&r=day&st=1514511038&host_regex=
m=mem_free ,表示當前是剩餘可用記憶體的監控報表, 還可以設定為 m=cpu_user 、 m=disk_free、m=load_one 等各種其他的監控資訊 ,具體參數可去查看相應的報表圖片url
其他的 r=day ,c=toltech_launcher 與上面叢集總監控報表參數一致
弄清楚url參數含義後,只需要組裝出我們想要產生的監控報表圖片url ,然後下載並郵件發送就可以了
採用python ,伺服器上配置定時執行此指令碼 。指令碼比較簡單, 直接貼代碼
#coding:utf-8import urllib,urllib2,socket,reimport time,osimport smtplib ,sys,datetimefrom email.mime.text import MIMETextfrom email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipartfrom email.header import Headerreload(sys)sys.setdefaultencoding("utf-8")downloadpath = 'E:\\2014\\'def getHtml(url): # 要佈建要求頭,讓伺服器知道不是機器人 user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent': user_agent} request=urllib2.Request(url,headers=headers); page = urllib2.urlopen(request); html = page.read() return htmldef sendMail(body,urls): # 第三方 SMTP 服務 mail_host="smtp.xxx.cn" #設定伺服器 mail_user="xxxx@xxxx.cn" #使用者名稱 mail_pass="xxxx" #口令 sender = 'xxxxx@xxxx.cn' receivers = ['xxxx@qq.com'] # 內送郵件,可設定為你的QQ郵箱或者其他郵箱 #建立一個帶附件的執行個體 message = MIMEMultipart() message['From'] = Header("xx", 'utf-8') message['To'] = Header(" , ".join(receivers), 'utf-8') today = datetime.datetime.today(); subject = 'xxxxx叢集監控日報表' + today.strftime('%Y-%m-%d %H:%M:%S') message['Subject'] = Header(subject, 'utf-8') #郵件內文內容 message.attach(MIMEText(body, 'html', 'utf-8')) #設定郵件名片(html格式) # html = file('qianming.html').read().decode("utf-8") # message.attach(MIMEText(html, 'html', 'utf-8')) for index, item in enumerate(urls): downloadimg(item,index,downloadpath) #下載報表圖片 # 二進位模式讀取圖片 with open(downloadpath + '%s.jpg' % index , 'rb') as f: msgImage1 = MIMEImage(f.read()) # 定義圖片ID msgImage1.add_header('Content-ID', '%s' % index) message.attach(msgImage1) try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 為 SMTP 連接埠號碼 smtpObj.login(mail_user,mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print "郵件發送成功" except smtplib.SMTPException,e: print "Error: 無法發送郵件" + repr(e) deletimg(downloadpath) #下載圖片def downloadimg(url,id ,path): urllib.urlretrieve(url, path+ '%s.jpg' % id)#刪除下載檔案夾內的圖片def deletimg(path): for file in os.listdir(path): targetFile = os.path.join(path, file) if os.path.isfile(targetFile): os.remove(targetFile) #圖片url urls = []#叢集總負載urls.insert(0,"http://ip/ganglia/graph.php?r=day&z=xlarge&c=toltech_launcher&m=load_one&s=by+name&mc=2&g=load_report") #叢集記憶體使用量urls.insert(1,"http://ip/ganglia/graph.php?r=day&z=xlarge&c=toltech_launcher&m=load_one&s=by+name&mc=2&g=mem_report") #叢集CPUurls.insert(2,"http://ip/ganglia/graph.php?r=day&z=xlarge&c=toltech_launcher&m=load_one&s=by+name&mc=2&g=cpu_report") #叢集網路IO使用urls.insert(3,"http://ip/ganglia/graph.php?r=day&z=xlarge&c=toltech_launcher&m=load_one&s=by+name&mc=2&g=network_report") #叢集內各節點負載概況urls.insert(4,"http://ip/ganglia/stacked.php?m=load_one&c=toltech_launcher&r=day&st=34533545") #叢集內各節點CPU使用urls.insert(5,"http://ip/ganglia/stacked.php?m=cpu_user&c=toltech_launcher&r=day&st=3454532&host_regex=")#叢集內各節點剩餘記憶體urls.insert(6,"http://ip/ganglia/stacked.php?m=mem_free&c=toltech_launcher&r=day&st=3454532&host_regex=")#叢集內各節點剩餘硬碟容量urls.insert(7,"http://ip/ganglia/stacked.php?m=disk_free&c=toltech_launcher&r=day&st=3453453&host_regex=") today = datetime.datetime.today();body = """ <h2>xxx伺服器叢集每日監控報表 %s (自動發送)</h2> <font color="#FF0000">叢集總概況</font> <br/> <img src="cid:0" /> <br/> <font color="#FF0000"> 叢集總記憶體使用量 </font> <br/> <img src="cid:1" /> <br/> <font color="#FF0000"> 叢集總CPU </font> <br/> <img src="cid:2" /> <br/> <font color="#FF0000">叢集總網路IO使用 </font> <br/> <img src="cid:3" /> <br/> <font color="#FF0000"> 叢集內各節點負載概況 </font> <br/> <img src="cid:4" /> <br/> <font color="#FF0000">叢集內各節點CPU使用 </font> <br/> <img src="cid:5" /> <br/> <font color="#FF0000">叢集內各節點剩餘記憶體 </font> <br/> <img src="cid:6" /> <br/> <font color="#FF0000">叢集內各節點剩餘硬碟容量 </font> <br/> <img src="cid:7" /> """ % today.strftime('%Y-%m-%d') sendMail(body, urls)
郵件效果