常见开源监控软件
cacti、nagios、zabbix、smokeping、open-falcon等等
cacti、smokeping偏向于基础监控,成图非常漂亮
cacti、nagios、zabbix服务端监控中心,需要php环境支持,其中zabbix和cacti都需要mysql作为数据存储,nagios不用存储历史数据,注重服务或者监控项的状态,zabbix会获取服务或者监控项目的数据,会把数据记录到数据库里,从而可以成图
open-falcon为小米公司开发,开源后受到诸多大公司和运维工程师的追捧,适合大企业,滴滴、360、新浪微博、京东等大公司在使用这款监控软件,值得研究
后续以介绍zabbix为主
zabbix监控介绍
C/S架构,基于C++开发,监控中心支持web界面配置和管理
单server节点可以支持上万台客户端
最新版本3.4,官方文档https://www.zabbix.com/manuals
5个组件
• zabbix-server 监控中心,接收客户端上报信息,负责配置、统计、操作数据
• 数据存储 存放数据,比如mysql
• web界面 也叫web UI,在web界面下操作配置是zabbix简单易用的主要原因
• zabbix-proxy 可选组件,它可以代替zabbix-server的功能,减轻server的压力
• zabbix-agent 客户端软件,负责采集各个监控服务或项目的数据,并上报
监控流程图
安装zabbix
准备工作
两台机器,一台作为服务端(监控中心),另外一台作为它的客户端
背景
zabbix,可以直接yum安装,但需要安装epel扩展源,在epel扩展源里面安装的zabbix的版本,最高是2.2版本,比较旧,所以使用官方提供的repo源
wget http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
在两台机器都需要下载它
A机器
[root@harry-01 ~]# wget wget http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
B机器
[root@harry-01 ~]# wget wget http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
下载完之后,安装rpm包(实际上就是安装了一个yum源仓库)
[root@harry-01 ~]# rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm
警告:zabbix-release-3.2-1.el7.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID a14fe591: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zabbix-release-3.2-1.el7 ################################# [100%]
[root@harry-01 ~]# rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm
查看/etc/yum.repos.d/目录下面会看到增加了一个zabbix.repo
再有了这个zabbix.repo源之后,就可以yum安装zabbix了,并安装下面的包
# yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql
zabbix-agent //客户端软件
zabbix-get //服务端用的一个工具,这个工具可以通过命令行的形式,获得客户端某些监控项目的数据
zabbix-server-mysql //这个是服务端跟mysql打交道相关的组件
zabbix-web //webUI ,web界面
zabbix-web-mysql //web和mysql相关组件
在服务端是需要安装这些所有的包,而在客户端仅仅需要安装 zabbix-agent 包即可
A机器
[root@harry-01 ~]# yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql
B机器
[root@harry-01~]# yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql
zabbix 是基于php环境的,也就是说用的是php 的代码编写的web界面,也就说这个zabbix 相当于一个站点
安装mysql
修改mysql的配置文件,修改/etc/my.cnf文件,设定默认的字符集
A机器
[root@harry-01 ~]# vim /etc/my.cnf
在[mysqld]下添加字符集
character_set_server = utf8
保存退出
如果不设置字符集,那么zabbix的web界面,设置成中文的话,可能就会出现乱码
修改完mysql的配置文件后,重启mysql服务
[root@harry-01 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[root@harry-01 ~]#
重启mysqld服务后,进入mysql命令行,创建zabbix库,并指定编码为utf8
#create database zabbix character set utf8;
[root@harry-01 ~]# mysql -uroot -p
Enter password:
mysql> create database zabbix character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql>
再创建用户,这个用户是需要让web(php)代码连接mysql的,监控中心zabbix mysql服务,启动的前提就是要连接mysql;客户端采集了数据,需要把这些数据传递给服务端,那么服务端怎么把这些数据写入到MySQL去,这时就涉及到了mysql 的用户,涉及到了mysql 的数据库;用哪一个用户,去写入那一个库。
mysql> grant all on zabbix.* to 'zabbix'@'127.0.0.1' identified by 'zabbix';
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
[root@harry-01 ~]#
退出mysql的命令行后,导入原始的数据,若缺少这些数据,zabbix就没有办法工作,就没有办法在web界面下展现给我们
zabbix-server-mysql-3.2.11 这块用tab键补全,有可能版本号不同
[root@harry-01 ~]# cd /usr/share/doc/zabbix-server-mysql-3.2.11/
在/usr/share/doc/zabbix-server-mysql-3.2.11/目录下有一个create.sql.gz压缩包,将它解压,解压完之后生成了一个.sql的文件
[root@harry-01 zabbix-server-mysql-3.2.11]# ls
AUTHORS ChangeLog COPYING create.sql.gz NEWS README
[root@harry-01 zabbix-server-mysql-3.2.11]# gzip -d create.sql.gz
[root@harry-01 zabbix-server-mysql-3.2.11]# ls
AUTHORS ChangeLog COPYING create.sql NEWS README
[root@harry-01 zabbix-server-mysql-3.2.11]#
然后拿到create.sql文件,将它导入到zabbix库里面去
[root@harry-01 zabbix-server-mysql-3.2.11]# mysql -uroot -p
Enter password:
启动zabbix服务
#systemctl start zabbix-server
[root@harry-01 zabbix-server-mysql-3.2.11]# systemctl start zabbix-server
启动httpd服务,在启动http服务之前,先查看nginx服务是否启动,若启动了nginx,就监听了80端口,就需要去停掉nginx服务,再去启动httpd服务
查看zabbix服务进程
查看zabbix监听的端口
[root@harry-01 zabbix-server-mysql-3.2.11]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:36272 0.0.0.0:* LISTEN 4242/rpc.statd
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 4243/rpc.mountd
tcp 0 0 0.0.0.0:33426 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4229/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 4675/master
tcp6 0 0 :::2049 :::* LISTEN -
tcp6 0 0 :::54151 :::* LISTEN 4242/rpc.statd
tcp6 0 0 :::3306 :::* LISTEN 5564/mysqld
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::20048 :::* LISTEN 4243/rpc.mountd
tcp6 0 0 :::36051 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN 4229/sshd
tcp6 0 0 ::1:25 :::* LISTEN 4675/master
这里看到服务启动了,但并没有zabbix监听的端口
查看zabbix并没有监听端口后,首先检查zabbix的错误日志,错误日志路径/var/log/zabbix/zabbix_server.log
虽然zabbix服务有进程,但没有彻底的起来,说明不能够连接mysql,所以还需要更改zabbix的配置文件
更改zabbix的配置文件,配置文件为/etc/zabbix/zabbix_server.conf
A机器
[root@harry-01 ~]# vim /etc/zabbix/zabbix_server.conf
搜索/DBHost
在DBName=zabbix上面增加
DBHost=127.0.0.1
DBuser=root
DBPassword=123123
保存退出
因为mysql和zabbix装在同一台机器上,这里的 DBHost可以写localhost 或者127.0.0.1;如果是在生产环境上,有时候为了提升zabbix的性能,可能会把MySQL装在其他机器上,这是的DBHost,就需要写上mysql的ip
更改完zabbix配置文件,restart重启下即可
[root@harry-01 zabbix-server-mysql-3.2.11]# systemctl restart zabbix-server
[root@harry-01 zabbix-server-mysql-3.2.11]#
这时再来查看下zabbix进程,有29个(正常情况下,都是这么多进程)
接下来就是配置web界面了(需要关闭防火墙和规则,否则浏览器无法访问)
- 在浏览器输入IP地址(即监控中心的IP地址),如192.168.31.137/zabbix 去访问
设置php的timezone时区,在php的配置文件中设置,默认php的配置文件在/etc/php.ini 里面
A机器
[root@harry-01 ~]# vim /etc/php.ini
搜索 /timezone
将 ;date.timezone 改为如下
date.timezone = Asia/Shanghai
保存退出
在定义完php的配置文件,还需要重启apache
[root@harry-01 zabbix-server-mysql-3.2.11]# systemctl restart httpd
Next step ,来配置数据库相关信息
- host :MySQL所在机器IP
- port:0为默认端口3306,如果有改动就修改
- name:库的名字
- user:库的用户
- password:用户的密码
- host:站点主机名
- port:端口,如果有改动就改,没改动,默认就是10051
- name:站点的名字
登录管理页,默认的账号是Admin,密码为zabbix
在登录进zabbix之后,首先需要去更改密码(因为默认的密码大家都知道的),若是在线上环境不更改密码,很容易被别人拿到后台权限
更改密码,先选择 Administration ,然后选择 Users
然后找到Admin,并点进去,选择 Change password 修改密码和选择语言(支持中文),然后保存退出
这时候密码改了,但看到界面还是英文版,刷新浏览器即可,会看到变成中文版
这时在退出zabbix,再重新进入下,使用新的密码,会看到重新进入了,这就是zabbix的web界面了
客户端安装zabbix(B机器)
•在客户端上也需要下载zabbix的yum源
• wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
• rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm
• yum install -y zabbix-agent
• vim /etc/zabbix/zabbix_agentd.conf //修改如下配置
Server=127.0.0.1修改为Server=192.168.31.137 //定义服务端的ip(被动模式)
ServerActive=127.0.0.1修改为ServerActive=192.168.31.137 //定义服务端的ip(主动模式)
Hostname=Zabbix server修改为Hostname=harry-zabbix //这是自定义的主机名,一会还需要在web界面下设置同样的主机名
• systemctl start zabbix-agent
• systemctl enable zabbix-agent''
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界面下设置同样的主机名
这样客户端的zabbix就配置完成
忘记Admin密码如何做 ?
主动模式和被动模式
•主动或者被动是相对客户端来讲的
• 被动模式,服务端会主动连接客户端获取监控项目数据,客户端被动地接受连接,并把监控信息传递给服务端
• 主动模式,客户端会主动把监控数据汇报给服务端,服务端只负责接收即可。
• 当客户端数量非常多时,建议使用主动模式,这样可以降低服务端的压力。
• 服务端有公网ip,客户端只有内网ip,但却能连外网,这种场景适合主动模式
添加监控主机
先添加主机组 Linux-test
再添加主机,主机名称和可见名称都写Linux-02
群组选择Linux-test
IP地址填写客户端的ip 192.168.31.139
几个概念:应用集、监控项、触发器、图形、自动发现、web监测
添加自定义模板
可以自定义一个常用模板,方便给新增主机添加监控项目(点击配置->点击模板->创建模板)
自定义centos模板
把其他自带模板里面的某些监控项目(比如cpu、内存等)复制到centos模板里
我们可以复制别的模板,这里复制的就是监控项,把Template OS Linux的监控项模板复制到了centos模板中:
但是这样做自动发现项没法复制,所以我们可以用链接模板,选择Template OS Linux的模板,记得要按添加才能保存。
这样模板就全部复制过来
但是我们没法去删除监控项那些东西,因为模板后面链接的是Template OS Linux,所以我们需要去取消链接,点击xie->链接模板->取消链接(如果点击取消并清理就会把监控项,应用集等等全部删除),取消链接然后点击更新。
模板后面的灰色Template OS Linux链接就没了
然后我们就可以删除我们不需要的监控项,只留下如下的监控项,应用集里没有数字的都可以删除:
把我们弄的这个centos模板弄到Linux-02的主机里
处理图形中的乱码
设置为中文后,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
windows字体路径为“C:\Windows\Fonts\”,找到“simfang.ttf”(其实就是那个仿宋简体),先把它复制到桌面上,然后上传到linux的/usr/share/zabbix/fonts/,把原来的graphfont.ttf改名拷贝起来,并且做软链接ln -s SIMLI.TTF graphfont.ttf
自动发现
自动发现规则可以修改数据的更新时间,点击自动发现规则,修改时间间隔:
更新之后图形会出现网卡的流量图形:
我们可以在图形中点击网卡图形来查看网卡流量的图形:
型(配置->模板->组名对应的自动发现规则->图形原型1)
添加自定义监控项目
很多监控项目是在模版里面配置体现出来的,但有时候会有一些个性化的需求,比如就是想知道某一个业务的数据,运营人员想知道网站注册量,和会员活动每天的活跃度,这些数据实际上是可以通过数据库里面的表体现出来的,但是在Zabbix不可以提供这么详细的监控项目,当遇到这种需求怎么办? 当遇到这种需求需要一个在客户端写一个shell脚本,把这个数值展现出来,通过一个监控项目,再去形成图表,给运营人员分析每星期的数值,以及每个月的数值趋势走向. zabbix在这点上还是不错的,可以自定义去监控一个项目
需求:监控某台80端口的连接数,并出图
首先是要获得这个连接数,拿到数值后到zabbix中心创建监控项目,然后针对这个项目做一个图形.
到客户端上定义一个脚本:
[root@harry-01 ~]# vim /usr/local/sbin/estab.sh
#! /bin/bash
## 获取80端口并发连接数
netstat -ant |grep ':80' |grep -c ESTABLISHED
注:netstat -ant 是可以查看连接数的.
# 赋予执行权限
[root@harry-01 ~]# chmod 755 /usr/local/sbin/estab.sh
注:其实是赋予zabbix用户 执行权限,因为最终是zabbix用户执行这个脚本
编辑客户端的配置文件
[root@harry-01 ~]# vim /etc/zabbix/zabbix_agentd.conf
UnsafeUserParameters=1 --> 表示使用自定义脚本,(0表示关闭使用自定义脚本,1表示使用自定义脚本)
UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh --> 定义脚本路径, 后面的[*]里面写脚本的参数,如果没有参数则可以省略.
#修改配置文件后,重启zabbix-agent服务
[root@harry-01 ~]# systemctl restart zabbix-agent
测试客户端写的脚本是否有效(在服务端测试)
[root@harry-01 ~]# zabbix_get -s 192.168.31.139 -p 10050 -k 'my.estab.count'
0
[root@harry-01 ~]#
增加监控项目(Zabbix监控中心配置)
点击配置 --> 主机 --> 选择harry-zabbix的监控项 -->点击创建监控项
名称(自定义) --> 键值 -->添加
给添加的并发连接数监控项目做图形
点击图形 --> 创建图形 -->名称 --并发连接数 --> 添加 -->选中并发连接数 -->选择 -->添加
给并发连接数监控项目做个触发器
点击触发器 -->创建触发器 --> 名称 :并发连接数 --> 严重性 -- 选择告警 -->表达式 --添加 --> 监控项目 --点击选择--> 选中并发连接数 --> 功能 选择 最新的T值
配置邮件告警
需要准备一个邮箱作为告警用 (可以使用163邮箱),要想这个邮箱发邮件,也就是在第三方平台上,比如在服务器上调用163的邮箱发邮件,需要开启POP3/SMTP/IMAP服务.
Zabbix监控中心设置报警媒介类型
点击设置-->告警媒介类型 -->创建报警媒介类型 --> 名称 自定义 --> 类型 选择脚本 -->脚本名称 自定义 -->添加 -->定义脚本参数 --添加
脚本参数含义:
{ALERT.SENDTO} -- 发邮件给谁
{ALERT.SUBJECT} -- 邮件标题
{ALERT.MESSAGE} -- 邮件内容
创建告警脚本
脚本放在哪里,在服务端的配置文件是定义的.
[root@root-01 ~]# vim /etc/zabbix/zabbix_server.conf
搜索/AlertScripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts --> 这就是定义脚本所放路径 (这不需要我们定义,自带的)
# 在/usr/lib/zabbix/alertscripts目录下创建mail.py脚本
说明:脚本内容去以下网址下载:
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
[root@root-01 ~]# cd /usr/lib/zabbix/alertscripts
[root@root-01 alertscripts]# vim mail.py
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
import sys
mail_host = 'smtp.163.com'
mail_user = '[email protected]'
mail_pass = '123466'
mail_postfix = '163.com'
def send_mail(to_list,subject,content):
me = "zabbix 监控告警平台"+"<"+mail_user+"@"+mail_postfix+">"
msg = MIMEText(content, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = me
msg['to'] = to_list
try:
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(me,to_list,msg.as_string())
s.close()
return True
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1], sys.argv[2], sys.argv[3])
#给mail.py脚本设置权限
[root@root-01 alertscripts]# chmod 755 mail.py