RedHat最简单方便的Ganglia集群监控安装配置 以及 用python定时发送监控报表

上一章讲了用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=cloud
baseurl=http://mirrors.sohu.com/centos/6/cloud/x86_64/openstack-kilo/
gpgcheck=0
enabled=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.72
port = 8649
ttl = 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-8
import urllib,urllib2,socket,re
import time,os
import smtplib ,sys,datetime
from email.mime.text import MIMEText
from email.mime.image import MIMEImage  
from email.mime.multipart import MIMEMultipart
from email.header import Header

reload(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 html

def 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")   
#集群CPU
urls.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)  


邮件效果



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值