使用monit搭建一个监控系统

 上周用monit搭建或者说定制了一个监控系统,来监控服务器发生事情。当然了主要是监控异常,因为我们的产品属于服务器类型,很多进程都daemon,要不停的运行。我们搭建监控目的不过是出现问题能够及时的知道,平时可从web UI上看到整个系统的状况,同时它本身要轻量级,不要影响性能。当然了类似的产品很多了,比如Ganglia,我在老科长波哥曾经搭建过一个Ganglia系统监控科室十几台服务器,让我很是崇拜。本文重点介绍monit。
                  使用monit搭建一个监控系统
    monit是一个可以监控系统,进程,文件系统,目录,设备的监控软件,可以自动唤起那些异常退出的进程,还可定制你想监控的东西。同时monit提供了内置的WEB UI的功能,可以一目了然地了解监控项的情况。其中正常项为绿色,异常项为红色,很方便的告警,另外,monit还提供了发邮件通知的功能,对于紧急的异常情况可以发送邮件到指定邮箱。比如发生了coredump,发生了DB corrupt,daemon进程异常重启,可以第一时间邮件通知到管理员,呵呵很强大吧。片汤话我们不多讲,讲讲怎么用monit搭建一个监控系统。
    monit是一个很轻量级的程序,只需要一个可执行程序monit,一个配置文件monitrc即可工作,当然了我们还是要讲讲安装过程:
    Ubuntu系统下,安装一如既往的方便:

    sudo agt-get install monit

    CentOS系统下也是一样

yum install monit

    我比较喜欢源码安装,原因是我喜欢看下源码:

 wget http://mmonit.com/monit/dist/monit-5.5.tar.gz
    tar zxvf monit-5.5.tar.gz
    cd monit-5.5
    ./configure --prefix=/usr 
    make 
    make install

    注意configure的时候可能会报错:

checking for pam_start in -lpam... no
configure: error: PAM enabled but headers or library not found, install the PAM development support or run configure --without-pam

    当然了你可以加上–without-pam这个选项绕过这个问题,这个问题在Ubuntu下的解决办法是:

apt-get install libpam0g-dev

    这个问题过后,再次执行./configure又会出现SSL的报错:

checking for SSL library directory... Not found
Couldn't find your SSL library files.
Use --with-ssl-lib-dir option to fix this problem or disable the
SSL support with --without-ssl
 

    解决办法是:

sudo apt-get install libssl-dev

    安装了libssl之后,configure仍然报错,原因是它找不到libssl.so,你可以手工搜索libssl.so的位置,然后用 –with-ssl-lib-dir告知configure。
    比如在我的ubuntu下:

root@manu:/usr/lib/i386-linux-gnu# find / -name libssl.so
/usr/lib/i386-linux-gnu/libssl.so

    那么可以执行:

./configure --prefix=/usr --with-ssl-lib-dir=/usr/lib/i386-linux-gnu/

    OK,configure之后,可以执行make 和 make install 了。make install之后,将源码路径下的配置文件monitrc拷贝到/etc目录下:

mv monitrc /etc/monitrc
chown root:root /etc/monitrc 
chmod 0700 /etc/monitrc

    这些事情做好之后,monit就安装完毕了。我们尝试启动monit

root@manu:~/code/c/classical/monit-5.5# monit 
monit: generated unique Monit id 66c0021758d07ecffedadfa0bf5f768d and stored to '/root/.monit.id'
Starting monit daemon with http interface at [localhost:2812]

    前文讲过,monit内置了一个http,可以通过browser查看,我们先看下monitrc配置文件的http相关配置:  

set httpd port 2812 and
       use address localhost # only accept connection from localhost
       allow localhost # allow localhost to connect to the server and
       allow admin:monit # require user 'admin' with password 'monit'
       allow @monit # allow users of group 'monit' to connect (rw)
       allow @users readonly # allow users of group 'users' to connect readonly

    这部分内容是http相关的配置,port 2812是端口号,localhost是访问IP,allow localhost表示只允许本机访问,用户名密码是:admin/monit。这不太符合我们的需求,比如我们不可能每次都在服务器上用浏览器查看服务器的状态,这太假了,如果我们有闲情逸致登上服务器,何必要我们的监控系统。我们将此处的配置改为

set httpd port 2812 and
        use address 10.64.74.99 
        allow 0.0.0.0/0.0.0.0 
        allow manu:manu 

    我们可以用chrome浏览器输入 http://10.64.74.99:2812去查看输出。第三行的意思是我们允许任何机器登录我们UI,访问我们monit的数据,第四行表示登录需要用户名和密码:manu/manu。此时我们的monit监控系统如下所示:
     使用monit搭建一个监控系统
    此时还比较单薄,啥东西也没有,我们继续讲如何配置monitrc。

set daemon 60

    这个比较简单,多久检测一次。我们监控条目有若干,我们不能时时刻刻都做一遍检查,那就成了死循环了,对系统性能损耗太大了。60秒表示每60秒检查一次配置文件里面配置的监控项。这个好理解不多说。 

set logfile /var/log/monit.log

    这个配置项表示monit进程本身的log记录在/var/log/monit.log。
    使用monit搭建一个监控系统
    在web UI上也可以查看monit的log。点击monit首页的runnning,
    使用monit搭建一个监控系统
进入monit running status页面,然后点击最右下角的的view log。这个也不多说了。使用monit搭建一个监控系统
   
    我们讲述发mail的配置:

 set mailserver xxx.xx.xxx.xxx port 25 
                   with timeout 15 seconds
      set mail-format {
          from: BETA_SERVER_128@trend.com
          subject: monit alert --  $EVENT $SERVICE 
          message: $EVENT Service $SERVICE  
                Date:        $DATE   
                Action:      $ACTION  
                Host:        $HOST   
                Description: $DESCRIPTION             
            
               Your faithful employee,
               bean
       }

      set alert xxxx@trendmicro.com.cn                       # receive all alerts 设置收件人

    有很多人发不出邮件的关键不在monit程序,而在于没有一个SMTP Server,帮助你转发Mail,用所谓的163 或者google的SMTP Server始终没有成功过。我开始也是发不出Mail,后来有了一个不需要用户名密码的SMTP Server之后,自然就能发出邮件通知了。如何搭建一个SMTP Server这是另外一个话题了,我按下不表。我用的是我们公司内部的一个SMTP Server。收到的Mail如下图所示:
     使用monit搭建一个监控系统
    
    
发Mail问题解决之后,我们就能专注于定制我们自己需要的监控项了。

============================华丽的分割线=========================================

   1 监控进程    

   比如我们服务器上有Apache,我们要监控Apache的情况,如果Apache异常重启,需要Mail通知。

check process apache with pidfile /var/run/httpd.pid
          start program = "/etc/init.d/rcWebServer.sh start https"
          stop program = "/etc/init.d/rcWebServer.sh stop https"
          if changed pid then alert

    所有进程类的监控是一类,以check process abc打头,其中with pidfile是指进程的PID记录在/var/run/httpd.pid。我们知道apache的PID记录在/var/run/httpd.pid之中,monit通过这个pid文件就可以明白,我们要求它监控那个进程了。
    没有PID文件的进程咋办?
    这是个好问题,毕竟大多数的进程都是没有PID文件的。比如你的进程叫做test_abc,是你通过./test_abc叫起的进程,如何告诉monit我要监控这个进程。monit提供了新的方法。MATCHING,就是进程cmdline匹配到了test_abc,我就监控这个进程,监控项叫test_abc 

check process test_abc with MATCHING test_abc
          if changed pid then alert

    我们新增了监控进程,看下WEB UI的变化:
 使用monit搭建一个监控系统
    点击apache,可以看详细情形,这里就不赘述了。
     

    2 监控文件系统或者监控设备
    

    我们一般有存放数据的分区,也有存放日志的分区,如果日志分区使用空间到了90%,我们认为这是出了问题了,我们要注意这种事件的发生:

check device VAR_LOG with path /var/log
        if space usage > 85% then alert

   check filesystem tmpfs with path /var
         if space usage > 80% then alert

    上述语句表明tmpfs 挂载在/var目录下,如果空间使用了80%,表明出现了异常,需要发mail通知到管理员。
    
新增了文件系统监控项后,UI上会增加如下显示:
  使用monit搭建一个监控系统
  点击tmpfs 或者VAR_LOG可以进入二层页面看下文件系统的详细信息,我也不赘述了。

    3 监控文件 
    

    monit也可监控某个文件,监控文件的属性,比如我们的文件permission 是700,如果发生变化则发邮件通知:

check file monit_target with path /var/log/monit_target
        if failed permission 700 then alert
        if size > 1000 MB then exec "/usr/local/bin/rotate /var/log/monit_target

    假如我们关注的事情发生了,我们需要执行自己的脚本,可以用 then exec “your_action”的方式处理。
  

   4 监控program
   

   有很多的情况,不好归类,比如,我的系统里面如果产生coredump,我希望可以检测到,同时在WEB UI上显示并且给我发Mail。我可以自己写个查看有没有coredump的脚本,告诉monit系统,我期待的结果,如果执行脚本与我期待的结果不同,那么表示本监控项出了异常

check program COREDUMP_EXIST with path "/var/log/tool/coredump_exist.sh"
      if status != 0 then alert                                     #告诉monit 我们期待结果是0 ,如果返回值不是 0 ,那么表示出了异常
   #!/bin/sh
    corefile_num=`ls /home/manu/core/core* 2>/dev/null| wc -l`
    if [ $corefile_num -eq 0 ]
    then
        exit 0
    else
        exit 1
    fi

    我们前面一直没提到,如果监控项为异常,WEB UI该项为红色,否则,该项为绿色。我们现在看下监控program之COREDUMP_EXIST:
  使用monit搭建一个监控系统
    因为我们有coredump文件,所以该项为红色。

    5 监控主机   

    我们还可以监控其他host,比如我们可见ping某台host,如果多次没有回应,那么邮件通知我

check host my_brother with address XX.XX.XX.XX  
         if failed icmp type echo count 3 with timeout 3 seconds then alert

    介绍了很多用法,但是挂一漏万,终极的学习方法还是看手册 http://mmonit.com/monit/documentation/monit.html#connection_testing。这个基本介绍的很详细,我遇到的一些问题,也是从这里找的答案。


原文链接:http://www.haodaima.net/art/2648169

原创文章,作者:追马,如若转载,请注明出处:http://www.178linux.com/492

(0)
上一篇 2015-02-14 10:54
下一篇 2015-02-15 23:49

相关推荐

  • Linux系统程序包管理之RPM

    rpm包概述 RPM 是 Red at Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理工具;在Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用。 RPM包里面都包含什么?里面包含可执行的二进制程序,…

    Linux干货 2016-08-24
  • DNS and Bind

    DNS and Bind      DNS服务器所提供的服务是完成将主机名和转换为IP地址的工作。为什么需要将主机名转换为IP地址的工作呢?这是因为,当网络上的一台客户机访问某一服务器上的资源时,用户在浏览器地址栏中输入的是人类便于识记的主机名和域名。而网络上的计算机之间实现连接却是通过每台计算机在网络中拥有的惟一的IP地址来完…

    Linux干货 2017-06-01
  • 网络管理

    一、网络概念     什么是网络     资源共享的功能和优点         数据和应用程序         资源 &…

    Linux干货 2016-09-09
  • 4 How To Stalk Your On Line Date Without Getting Caught

    Challenging tools offered by our digital disposal, it’s no wonder your times tend to be behaving like cyber snoops before and after they satisfy you. In which will you draw t…

    Linux干货 2023-02-04
  • 文本处理相关工具

    文本工具       操作系统中,文本的处理这一操作,比如操作一些内容,查看一些内容等等这些东西在linux中都得借助工具来完成对文本的操作。下面来说说对文本处理的工具;  其中:        查看文件内容工具:more、less、cat     &nbsp…

    Linux干货 2016-08-05
  • 网卡别名的设置

    网卡别名的设置 设备网卡别名对虚拟主机的作用 可以将多个IP地址绑定到一个NIC上 eth0:1 eth0:2 eth0:3 ifconfig命令: 使用ipconfig命令来设置网卡别名 ifconfigeth0:0 192.168.1.100/24 up 使用ip命令来设置网卡别名 ipaddradd 172.16.1.2/…

    Linux干货 2016-09-06