Linux 监控

常见开源监控软件
cacti、nagios、zabbix、smokeping、open-falcon等等
cacti、smokeping偏向于基础监控,成图非常漂亮
cacti、nagios、zabbix服务端监控中心,需要php环境支持,其中zabbix和cacti都需要mysql作为数据存储,nagios不用存储历史数据,注重服务或者监控项的状态,zabbix会获取服务或者监控项目的数据,会把数据记录到数据库里,从而可以成图
open-falcon为小米公司开发,开源后受到诸多大公司和运维工程师的追捧,适合大企业,滴滴、360、新浪微博、京东等大公司在使用这款监控软件,值得研究
后续以介绍zabbix为主

1. zabbix 监控介绍

C/S架构,基于C++开发,监控中心支持web界面配置和管理; 单server节点可以支持上万台客户端; 最新版本3.4,官方文档https://www.zabbix.com/manuals

1.1 zabbix组件

  • zabbix-server 监控中心,接收客户端上报信息,负责配置、统计、操作数据;
  • 数据存储,存放数据(如:mysql);
  • web界面 也叫web UI,在web界面下操作配置是zabbix简单易用的主要原因;
  • zabbix-proxy 可选组件,它可以代替zabbix-server的功能,减轻server的压力;
  • zabbix-agent 客户端软件,负责采集各个监控服务或项目的数据,并上报。

1.2 zabbix监控流程图

zabbix监控linuxio使用情况_客户端

2. zabbix 安装

2.1 zabbix 服务端部署

2.1.1 zabbix 获取

官网下载地址:www.zabbix.com/download 获取zabbix的yum源库:wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm

2.1.2 安装zabbix

rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm //这个是安装zabbix的yum源仓库
yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql //会连带安装httpd和php

zabbix-agent 客户端软件;
zabbix-get 服务端的工具, (可以通过命令行的形式获取客户端的监控数据);
zabbix-server-mysql 安装一些和MySQL相关的数据;
zabbix-web web的界面;
zabbix-web-mysql Web界面和MySQL相关的插件

2.1.3 安装MySQL数据库

具体安装步骤:略

  • 修改MySQL配置文件,设置默认字符集
    vim /etc/my.cnf //需要增加配置
    character_set_server = utf8
  • 重启mysqld服务
  • 创建zabbix库:create database zabbix character set utf8;
  • 创建用户:grant all on zabbix.* to 'zabbix'@'127.0.0.1' identified by 'aming-zabbix';
  • 导入数据:
    cd /usr/share/doc/zabbix-server-mysql-3.2.7gzip -d create.sql.gzmysql -uroot -pxxx zabbix < create.sql
  • 启动apache
    systemctl start httpdsystemctl enable httpd
  • 修改zabbix配置
    vim /etc/zabbix/zabbix_server.conf //修改或增加
DBHost=127.0.0.1 //在DBName=zabbix上面增加
DBPassword=aming-zabbix //在DBuser下面增加
  • 启动zabbix服务
    systemctl start zabbix-server zabbix-agentsystemctl enable zabbix-server zabbix-agent
  • 检查、测试
    netstat -lntp |grep zabbix //查看监听端口
    浏览器访问http://ip/zabbix/ web界面下面配置zabbix(用户名Admin 密码zabbix); 进入后台第一件事情就是修改密码。
  • 忘记Admin密码如何做
    进入mysql命令行,选择zabbix库
    mysql -uroot -p zabbixupdate users set passwd=md5(‘newpasswd’) where alias=‘Admin’; // 这样就更改了Admin用户的密码

2.1.4 zabbix客户端部署

  • 获取yum源:wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
  • 安装yum源:·rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm
  • 安装zabbix客户端程序:yum install -y zabbix-agent
  • 修改zabbix客户端配置文件:vim /etc/zabbix/zabbix_agentd.conf //修改如下配置
Server=127.0.0.1修改为Server=192.168.133.130 //定义服务端的ip(被动模式)
ServerActive=127.0.0.1修改为ServerActive=192.168.133.130 //定义服务端的ip(主动模式)
Hostname=Zabbix server修改为Hostname=aming-123 //这是自定义的主机名,一会还需要在web界面下设置同样的主机名
  • 启动客户端程序
    systemctl start zabbix-agentsystemctl enable zabbix-agent

3. zabbix 配置使用

3.1 主动模式和被动模式

主动或者被动是相对客户端来讲

  • 被动模式,服务端会主动连接客户端获取监控项目数据,客户端被动地接受连接,并把监控信息传递给服务端;
  • 主动模式,客户端会主动把监控数据汇报给服务端,服务端只负责接收即可;
  • 主、被动模式适应的场景:当客户端数量非常多时,建议使用主动模式,这样可以降低服务端的压力;服务端有公网ip,客户端只有内网ip,但却能连外网,这种场景适合主动模式。

3.2 添加主机

先添加主机组web_group;再添加主机,主机名称和可见名称都写wbe_01,群组选择web_group;IP地址填写客户端的ip。

  • 主机组:配置-->主机群组-->创建主机群组;
  • 添加主机:配置-->主机--创建主机;

3.3 添加模板:可以自定义一个常用模板,方便给新增主机添加监控项目

  • 几个概念:应用集、监控项、触发器、图形、自动发现、web监测
  • 自定义web模板
    把其他自带模板里面的某些监控项目(比如cpu、内存等)复制到web模板里
  • 方法1. 将已有的模板导出,导出的为xml文件,对xml进行编辑,然后重新导入即可;(此方法不推荐使用,可能会出现错误)
  • 方法2. 配置-->模板-->创建模板;打开创建的模板-->链接的模板-->连接指示器,选择需要借鉴的模板,然后点击添加(添加一定要点击),然后点击更新;重新打开新建的模板,选择链接的模板-->链接的模板-->取消链接(不要点击取消链接并清理);点击更新,复制完成。(建议使用此方法复制模板,去自定义)
  • 定义触发器
  • 添加图形
  • 自动发现,找到Template OS Linux,点击右侧的自动发现,参考Mounted filesystem discovery和Network interface discovery定义规则;可以直接导出、导入模板,然后再删除不需要的对象

3.4 处理图形乱码

  • 问题:设置为中文后,zabbix图形的中文文字会显示小方框;
  • 解决:在windows字体库找到simfang.ttf(其实就是那个仿宋简体),路径为C:\Windows\Fonts\,,先把它复制到桌面上,然后上传到linux的/usr/share/zabbix/fonts/,并且改名为graphfont.ttf,即可。

设置为中文后,zabbix图形的中文文字会显示小方框;这是因为在zabbix的字体库中没有中文字体,需要从windows上借用一个过来;
vim /usr/share/zabbix/include/defines.inc.php //搜索ZBX_FONTPATH,它定义的路径是“fonts”,它是一个相对路径,绝对路径为/usr/share/zabbix/fonts,而字体文件为ZBX_GRAPH_FONT_NAME所定义的graphfont,它是一个文件,绝对路径为/usr/share/zabbix/fonts/graphfont

3.5 添加自定义监控项目

  • 需求:监控某台web的80端口连接数,并出图
  • 两步:
    1. zabbix监控中心创建监控项目
    2. 针对该监控项目以图形展现
  • 客户端定义脚本vim /usr/local/sbin/estab.sh //内容如下
#!/bin/bash
##获取80端口并发连接数
netstat -ant |grep ':80 ' |grep -c ESTABLISHED
  • 设置权限 chmod 755 /usr/local/sbin/estab.sh
  • 客户端上编辑配置文件vim /etc/zabbix/zabbix_agentd.conf//增加
UnsafeUserParameters=1  //表示使用自定义脚本
UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh
//自定义监控项的key为my.estab.count,后面的[*]里面写脚本的参数,如果没有参数则可以省略,脚本为/usr/local/sbin/estab.sh
  • 重启zabbix-agent服务systemctl restart zabbix-agent
  • 服务端验证,执行命令zabbix_get -s 192.168.133.132 -p 10050 -k 'my.estab.count' 然后在zabbix监控中心(浏览器)配置增加监控项目,键值写my.estab.count;添加该项目后,到“监测中”“最新数据”查看刚添加的项目是否有数据出现;有了数据就可以添加图形,“配置-->主机-->图形-->创建图形”。

3.6 配置告警

使用163或者QQ邮箱发告警邮件,首先登录你的163邮箱,设置开启POP3、IMAP、SMTP服务,开启并记录授权码;
然后到监控中心设置邮件告警“管理-->报警媒介类型-->创建媒体类型”。

  • 脚本参数:
    {ALERT.SENDTO}{ALERT.SUBJECT}{ALERT.MESSAGE}
  • zabbix监控linuxio使用情况_服务端_02

  • 创建报警脚本mail.pyvim /usr/lib/zabbix/alertscripts/mail.py //内容参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.pychmod 755 /usr/lib/zabbix/alertscripts/mail.py //设置脚本权限
  • mail.py 脚本内容
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import os,sys
reload(sys)
sys.setdefaultencoding('utf8')
import getopt
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from  subprocess import *
#
def sendqqmail(username,password,mailfrom,mailto,subject,content):
    gserver = 'smtp.qq.com'
    gport = 25
#
    try:
        # msg = MIMEText(unicode(content).encode('utf-8')) //如果发送的邮件有乱码,可以尝试把这行改成如下:
        msg = MIMEText(content,'plan','utf-8')
        msg['from'] = mailfrom
        msg['to'] = mailto
        msg['Reply-To'] = mailfrom
        msg['Subject'] = subject
#
        smtp = smtplib.SMTP(gserver, gport)
        smtp.set_debuglevel(0)
        smtp.ehlo()
        smtp.login(username,password)
#
        smtp.sendmail(mailfrom, mailto, msg.as_string())
        smtp.close()
    except Exception,err:
        print "Send mail failed. Error: %s" % err
#
#
def main():
    to=sys.argv[1]
    subject=sys.argv[2]
    content=sys.argv[3]
##定义QQ邮箱的账号和密码,你需要修改成你自己的账号和密码(请不要把真实的用户名和密码放到网上公开,否则你会死的很惨)
    sendqqmail('1234567@qq.com','aaaaaaaaaa','1234567@qq.com',to,subject,content)
#
if __name__ == "__main__":
    main()
#
#
#####脚本使用说明######
#1. 首先定义好脚本中的邮箱账号和密码
#2. 脚本执行命令为:python mail.py 目标邮箱 "邮件主题" "邮件内容"
  • 创建一个接受告警邮件的用户,“管理-->用户-->创建用户-->报警媒介-->类型选择“baojing”;注意用户的权限,如果没有需要到用户组去设置权限,
  • 设置动作,“配置-->动作-->创建动作”,名称写“sendmail”(自定义),“新的触发条件”,A维护状态 非在 维护,B触发器示警度>=未分类
  • “操作-->消息内容”页面,内容如下
HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE}  {EVENT.TIME} 
LEVEL:{TRIGGER.SEVERITY} 
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}

“操作-->新的”,选择发送的用户为刚创建的用户,仅送到选择“baojing”
切换到“恢复操作”,把信息改成如下

HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE}  {EVENT.TIME}
LEVEL:{TRIGGER.SEVERITY}
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}

点击“新的-->操作”,选择发送的用户为刚创建的用户,仅送到选择“baojing”

  • 测试告警