linux 监控平台介绍
常见的开源监控软件
cacti、nagios、zabbix、smokeping、open-falcon等等。
cacti、smokeping偏向于基础监控,成图漂亮。
cacti、nagios、zabbix服务端监控中心,需要php环境支持,其中zabbix和cacti都需要mysql作为数据存储,nagios不用存储历史数据,注重服务或者监控项的状态;zabbix会获取服务或者监控项目的数据从而可以成图,zabbix把数据记录到数据库里,支持历史数据查询,而且zabbix可以非常方便的自定义监控项目。
open-falcon为小米公司开发,开源后受到诸多大公司和运维工程师的追捧,适合大企业,滴滴、360、新浪微博、京东等大公司在使用这款监控软件,值得研究。
本节学习以zabbix为例。
zabbix监控介绍
zabbix基于C++开发,是C/S(client/server)架构,即分为客户端和服务端,单个服务端节点可以支持上万台客户端。
五个组件
zabbix-server
zabbix-server是整个监控体系中最核心的组件,它负责接收客户端发送的报告信息,所有配置、统计数据及操作数据都由它组织。
数据存储(如:mysql)
监控过程中收集的所有信息都存储在这里
web界面
web界面,web UI。这是zabbix监控简单易用的主要原,因为我们可以在web界面中配置、管理各个客户端。运行web界面需要有PHP环境支持。
zabbix-proxy
zabbix-proxy为可选组件,用于监控节点非常多的分布式环境,它可以代理zabbix-server的功能,减轻zabbix-server的压力。(机器量很多的时候,可以使用)
zabbix-agent
zabbix-agent为部署在各个客户端上的组件,用于采集各个监控项目的数据,并把采集的数据传输给zabbix-proxy或zabbix-server。
zabbix官方文档:https://www.zabbix.com/manuals
zabbix监控流程图:
安装zabbix(上)
准备两台机器,一台做服务端,一台做客户端。两台机器上后安装zabbix。在官网下载对应的版本(https://www.zabbix.com/download)。
下载zabbix的rpm包:
[root@ma-1 ~]# wget http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
下载完之后,安装下载的zabbix的rpm包
[root@ma-2 ~]# 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%]
它实际上是安装了一个yum源仓库
有了源之后,就能直接yum安装zabbix
yum安装zabbix
[root@ma-1 ~]# yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql
#zabbix-agent:客户端程序
#zabbix-get:服务端上命令行获取客户端检测项目的工具
#zabbix-server-mysql:zabbix-server MySQL版
#zabbix-web:web界面
#zabbix-web-mysql:web界面MySQL相关
会连带安装php和httpd
在服务端:
安装mysql,之前有安装过,就不在安装了。
编辑MySQL的配置文件:
[root@ma-1 ~]# vi /etc/my.cnf
增加配置:
character_set_server = utf8
#将字符集设置为中文
保存退出
启动MySQL:
[root@ma-1 ~]# systemctl restart mysql
创建zabbix的数据库:
[root@ma-1 ~]# mysql -uroot -p111111
mysql> create database zabbix character set utf8;
Query OK, 1 row affected (0.00 sec)
创建用户:
mysql> grant all on zabbix.* to 'zabbix'@'127.0.0.1' identified by '111111';
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
导入数据:
[root@ma-1 ~]# cd /usr/share/doc/zabbix-server-mysql-3.2.11/
解压:
[root@ma-1 zabbix-server-mysql-3.2.11]# gzip -d create.sql.gz
[root@ma-1 zabbix-server-mysql-3.2.11]# ls
AUTHORS ChangeLog COPYING create.sql NEWS README
[root@ma-1 zabbix-server-mysql-3.2.11]# mysql -uroot -p111111 zabbix < create.sql
Warning: Using a password on the command line interface can be insecure
起动zabbix-server服务
[root@ma-1 ~]# systemctl start zabbix-server
启动httpd服务,再启动httpd服务时,先看一下Nginx服务启动没有,Nginx服务启动,会占用80端口,这时httpd启动不了。
[root@ma-1 ~]# systemctl start httpd
对zabbix, httpd 服务做开机启动
[root@ma-1 ~]# systemctl enable zabbix-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-server.service to /usr/lib/systemd/system/zabbix-server.service.
[root@ma-1 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
这时用ps查看状态,zabbix启动了,netstat查看端口,发现没有zabbix监听端口。
安装zabbix(中)
查看zabbix日志
[root@ma-1 ~]# tail /var/log/zabbix/zabbix_server.log
3584:20180131:204113.795 [Z3001] connection to database 'zabbix' failed: [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
zabbix无法连接MySQL
解决方法:
修改配置文件
[root@ma-1 ~]# vim /etc/zabbix/zabbix_server.conf
搜索DBHost
# Default:
# DBHost=localhost
DBHost=127.0.0.1
这里写数据库的IP,本次实验由于zabbix和MySQL安装在一台机器上,写127.0.0.1
DBName=zabbix
DBUser=zabbix
DBPassword=111111
保存退出
重启zabbix服务:
[root@ma-1 ~]# systemctl restart zabbix-server
查看监听端口:
[root@ma-1 ~]# netstat -lntp
正常情况,zabbix监听10051端口
配置web界面:
在浏览器上配置
http://192.168.176.135/zabbix/setup.php
点击下一步
是ok不用管,设置date.timezone
在PHP的配置文件中设置date.timezone
[root@ma-1 ~]# vi /etc/php.ini
找timezone
date.timezone =Asia/Shanghai
保存退出
重启httpd服务
[root@ma-1 ~]# systemctl restart httpd
1
2
刷新网页
下一步
下一步
完成。
登录界面:
管理员:admin
密码:zabbix
登录进去后,首先要更改密码
也可以把语言改成中文
这是zabbix的web监控界面
忘记admin密码如何做
更改MySQL数据库中的数据
进入MySQL:
[root@ma-1 ~]# mysql -uroot -p111111
进入zabbix库
mysql> use zabbix
密码在users表中
mysql> update users set passwd=md5('111111') where alias='Admin';
这时就可以用新密码登录zabbix
安装zabbix(下)
客户端安装:
下载yum 源,安装yum源。
yum安装zabbix-agent
[root@ma-2 ~]# yum install -y zabbix-agent
编辑配置文件:
[root@ma-2 ~]# vi /etc/zabbix/zabbix_agentd.conf
Server=192.168.176.135
#指定服务端的IP
ServerActive=192.168.176.135
Hostname=ma-2
#参数用于设定客户端主机的名字,用于服务端添加监控服务,服务端监控是哪台主机的状态
保存退出
启动zabbix-agent服务
[root@ma-2 ~]# systemctl start zabbix-agent
监听端口10050
主动模式和被动模式
主动模式和被动模式所针对的对象是客户端,意思是客户端主动向服务端上报数据和由服务端到客户端采集数据。数据的提交时间在监控中心设置。
主动模式,服务端的压力会小一些,监控服务器多,用主动,模式会好一些。
服务端有公网IP,客户端只有内网IP但是可以连接外网,这种场景适合使用主动模式。
只有几百台服务器,体量不大,主动,被动都没有问题。
添加监控主机
在浏览器上添加监控主机
主机群组:在此先创建主机群组,然后再添加要监控的机器到已有群组中。这样做的好处是,在不同的主机群组设置不同监控规则,然后可以把想要使用同样规则的主机添加到指定群组进行管理,避免为每台主机去配置规则。
模板:预设的监控规则模板
主机:在监控中的所有机器(对应的zabbix-agent服务的机器)
配置:
添加一个主机群主:
创建主机
指定客户端IP,如果该IP有对应的域名,则需要添加到“DNS名称”中,如果没有可以不填
应用集:监控项的组合集
监控项:监控项目
触发器:针对监控项触发的一个报警规则
图形:根据历史监控数据绘制的图表
自动发现规则:zabbix自动监控的文件系统的信息、网卡信息
web监测:监测某一个网站,网址,出现问题报警。
添加自定义模板
模板对于你自定义监控项目来说,很方便,易于管理。
添加模板:
添加监控项:
选择你要的监控项,复制到shuai模板里。
查看shuai模板
给shuai模板配置自动发现规则:
安照配置监控项的步骤,发现没有“复制”选项。
删除shuai模板中的所有监控项
在模板里点击shuai,点击链接的模板
添加之后,在点更新
这时,去到链接模板,取消链接,更新。
这时,这些监控项,自动检测,就都到shuai模板中了。
就可以根据自己的选择来删除监控项和应用集。(先删监控项,再删应用集)
删除应用集:
有监控项的应用集都不能删除
处理图形中的乱码
把弄好的shuai模板弄到ma-2主机里去
查看ma-2中CPU load图形预览
发现有些地方乱码
乱码:可能是字符集不对,但是,之前专门编辑配置文件,。
这里是缺少中文字库
在服务端上,打开配置文件
[root@ma-1 ~]# vi /usr/share/zabbix/include/defines.inc.php
搜索ZBX_FONTPATH
define('ZBX_FONTPATH', realpath('fonts')); // where to search for font (GD > 2.0.18)
字体所在的目录就是这个
/usr/share/zabbix/fonts/
查看:
[root@ma-1 ~]# ls /usr/share/zabbix/fonts
graphfont.ttf
[root@ma-1 ~]# ls -l !$
ls -l /usr/share/zabbix/fonts
总用量 0
lrwxrwxrwx. 1 root root 33 1月 31 19:21 graphfont.ttf -> /etc/alternatives/zabbix-web-font
这就是字体所在的文件
根据软连接一直找上去,找到真正的字体文件
[root@ma-1 ~]# ls -l /etc/alternatives/zabbix-web-font
lrwxrwxrwx. 1 root root 38 1月 31 19:21 /etc/alternatives/zabbix-web-font -> /usr/share/fonts/dejavu/DejaVuSans.ttf
该字库软链接到一个支持中文的字库中,在windows中找字库
找个中文字,放桌面上,然后用xftp传到linux上。
将移动到目录下
[root@ma-1 ~]# mv /root/simkai.ttf /usr/share/zabbix/fonts/
给做个软连接:
[root@ma-1 fonts]# mv graphfont.ttf graphfont.ttf.bak
[root@ma-1 fonts]# ln -s simkai.ttf graphfont.ttf
[root@ma-1 fonts]# ls -l
总用量 11512
lrwxrwxrwx 1 root root 10 2月 1 19:30 graphfont.ttf -> simkai.ttf
lrwxrwxrwx. 1 root root 33 1月 31 19:21 graphfont.ttf.bak -> /etc/alternatives/zabbix-web-font
-rw-r--r-- 1 root root 11785184 2月 1 19:23 simkai.ttf
在到浏览器段刷新:
自动发现
更改自动发现的数据更新时间间隔:
重启zabbix-agent服务和zabbix-server服务
查看网卡流量:
自定义监控项目
需求:监控web的80端口的连接数,并出图
两步:
1. zabbix监控中心创建监控项目
2. 针对该监控项目以图形展现
客户端机器配置:
在客户端编写脚本(estab.sh):
[root@ma-2 ~]# vim /usr/local/sbin/estab.sh
添加内容:
#!/bin/bash
##获取80端口并发连接数
netstat -ant |grep ':80 ' |grep -c ESTABLISHED
保存退出
修改脚本权限:
[root@ma-2 ~]# chmod 755 /usr/local/sbin/estab.sh
脚本使用zabbix-agent服务启动的,zabbix用户执行。
在客户端上编辑配置文件:
[root@ma-2 ~]# vim /etc/zabbix/zabbix_agentd.conf
搜索UnsafeUserParameters
添加UnsafeUserParameters=1
搜索UserParameter
添加UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh
自定义的监控项的键值为my.estabcount,后面的[*]里写脚本参数,如果没有参数可以省略,脚本为/usr/local/sbin/estab.sh
保存退出,重启zabbix-agent服务
[root@ma-2 ~]# systemctl restart zabbix-agent
验证:
在服务端,执行命令,获取80端口的连接数:
[root@ma-1 ~]# zabbix_get -s 192.168.176.134 -p 10050 -k 'my.estab.count'
0
在监控中性去配置监控项目
添加
创建图形:
创建触发器:
配置邮件警告
使用163邮箱或QQ邮箱发送告警邮件。
开启邮箱的POP3、IMAP、SMTP服务
创建媒体类型:
在服务端的配置文件中,已经规定了脚本要创建在那个目录下面。
在服务端查看配置文件
[root@ma-1 ~]# vi /etc/zabbix/zabbix_server.conf
搜索AlertScripts
创建mail.py脚本:
[root@ma-1 ~]# cd /usr/lib/zabbix/alertscripts
[root@ma-1 alertscripts]# vi mail.py
添加内容:
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import os,sys
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.163.com'
gport = 25
try:
msg = MIMEText(unicode(content).encode('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]
##定义邮箱的账号和密码,你需要修改成你自己的账号和密码(请不要把真实的用户名和密码放到网上公开)
sendqqmail('1111111111@163.com,'1111111111','111111111@163.com',to,subject,content)
if __name__ == "__main__":
main()
更改脚本权限:
[root@ma-1 alertscripts]# chmod 755 mail.py
给自己发一封邮件:
[root@ma-1 alertscripts]# python mail.py 1111111@163.com "shaui" "11111"
这说明发邮件脚本没有问题
创建一个用户,用来接收邮件
配置用户权限,要在用户组里设置
设置动作:
设置操作:
默认信息:
HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE} {EVENT.TIME}
LEVEL:{TRIGGER.SEVERITY}
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}
恢复操作: