三十次课
文章目录
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)。
// 服务器与客户端最好关闭防火墙与SELINUX
Zabbix服务器:
主机名:zabbix-server
IP:10.1.1.30
需要预先安装epel扩展源和mysql服务,当然mysql也可以使用其他的主机上的mysql服务
Zabbix客户端:被监控的主机
主机名:zabbix-agent
IP:10.1.1.31
安装配置
安装Zabbix服务器的环境
// 这里使用yum安装的方式来安装Zabbix服务
// yum源里面的Zabbix服务版本比较老,所以需要先安装Zabbix官方的yum源
# wget https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
# rpm -ivh zabbix-release-3.4-2.el7.noarch.rpm
// 这个需要注意版本号
yum安装Zabbix服务
// 这个会自动的安装Httpd服务和PHP服务,并且自动的配置好运行环境
# yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql
在服务端:安装mysql,之前有安装过,就不在安装了。
编辑MySQL的配置文件:
# vi /etc/my.cnf
增加配置:
character_set_server = utf8
#将字符集设置为中文
启动MySQL
# systemctl restart mysql
登录进入mysql命令行创建 zabbix 库和用户
# mysql -uroot -p123456
mysql> create database zabbix;
mysql> grant all on zabbix.* to 'zabbix'@'127.0.0.1' identified by '123456';
// 退出mysql命令行,导入zabbix初始化数据
mysql> exit
Bye
# cd /usr/share/doc/zabbix-server-mysql-3.4.11/ //需注意版本号的
// 解压初始化数据
# gzip -d create.sql.gz
// 将解压出来的数据库脚本导入 zabbix 库中
# mysql -uroot -p123456 zabbix < create.sql
Warning: Using a password on the command line interface can be insecure
Zabbix服务相关设置
// 修改Zabbix的配置文件/etc/zabbix/zabbix_server.conf
// 修改或增加下面grep匹配到的4行内容,需要注意顺序,
# cd /etc/zabbix/
# grep -E '^DBHost|^DBName|^DBUser|^DBPassword' zabbix_server.conf
DBHost=127.0.0.1 //表示数据库的IP地址,这个跟创建zabbix用户是指定的ip含义不同,
DBName=zabbix //表示数据库的库名
DBUser=zabbix //mysql的用户名, 库和用户名都是刚才创建好的
DBPassword=123456 //刚才创建的mysql用户的密码
# 注:DBHost指定的IP和创建数据库的zabbix用户时指定的IP含义不同,
# 如果Zabbix服务和mysql服务不是在同一台主机上,
# 创建用户时指定的ip是Zabbix服务器的ip。而DBHost则是指定mysql服务器的IP
启动服务
// 这里需要启动的服务有两个 hhtpd 和 zabbix-server
// 需要将这两个服务加入开机自启动列表
# systemctl enable httpd zabbix-server
// 然后启动这两个服务
# systemctl start httpd zabbix-server
// 查看端口和服务是否正常,Zabbix服务默认监听10051端口
# netstat -lntp | grep zabbix
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 12223/zabbix_server
tcp6 0 0 :::10051 :::* LISTEN 12223/zabbix_server
# netstat -lntp | grep httpd
tcp6 0 0 :::80 :::* LISTEN 12316/httpd
# ps -ef | egrep 'zabbix' | wc -l
37
测试
Windows下用浏览器访问 zabbix-server服务的地址 http://10.1.1.30/zabbix
这里点击Next step会报错:Time zone for PHP is not set (configuration parameter “date.timezone”).
需要修改PHP的配置文件,设置时区,修改/etc/php.ini 配置文件
# vi /etc/php.ini
//找timezone
date.timezone =Asia/Shanghai
然后重启httpd服务,刷新浏览器的页面
# systemctl restart httpd
然后点击Next step,设置数据库信息
Database type # 保持默认的 MySQL
Database host # 填写mysql服务器的地址
Database port # 0就表示默认的mysql端口3306,如果数据库自定义了其他端口需要填写具体的端口号
Database name # 填写前面在mysql里面创建的库名zabbix
User # 填写在前面mysql里面创建的zabbix用户
Password # 填写创建zabbix用户时设定的密码
点击Next step 设置zabbix服务的相关信息
Host和Port保持默认即可,Name可以随意定义
再次点击Next Step,可以检查刚才所填写的信息是否有问题,如果没问题直接点Next step即可
成功安装了Zabbix 前端
然后点击Finish就会跳转到登录界面,输入默认的账号:Admin 密码:zabbix 即可登录
登陆后的界面
登录后的第一件事是修改Admin账号的密码
依次点击页面上的Administration>Users>Admin
再点击页面中Password后面的Change password ,然后填入新的密码,需要填写两次相同的密码,还可以在此页面修改webUI显示的语言,将Language 改为 Chinese (zh_CN) 就可以显示中文了。
修改完点击下方的UPdate,然后刷新一下就可以看到中文的页面了,同时密码也更改了
忘记Admin密码如何做
// 在mysql命令行里面重置Admin的密码
// 进入mysql命令行
# mysql -uroot -p123456
// 切换到zabbix库
mysql> use zabbix;
// 修改user表中 alias 字段为Admin 的passwd字段的数据
mysql> update users set passwd=md5('new_password') where alias='Admin';
// 这样操作后就可以用new_password 来登录 Zabbix 的 web 页面了
主动模式和被动模式
-
主动模式和被动模式所针对的对象是客户端,意思是客户端主动向服务端上报数据和由服务端到客户端采集数据。数据的提交时间在监控中心设置。
-
主动模式,服务端的压力会小一些,监控服务器多,用主动,模式会好一些。
服务端有公网IP,客户端只有内网IP但是可以连接外网,这种场景适合使用主动模式。 -
只有几百台服务器,体量不大,主动,被动都没有问题。
# 主动模式和被动模式是相对于agent的
# Zabbix客户端有两个模式,主动模式,和被动模式
# 主动模式:表示Agent会主动的向服务器上报监控项的信息,如此可以减少服务器的压力
# 被动模式:需要服务器去提醒每一台Agent进行信息上报 ,会增加服务器的资源消耗
# 如果监控的Agent非常多,就必须得用主动模式了,不然服务器的压力会非常大
# 如果zabbix-server有独立的公网IP,但是被监控的agent是使用的NAT上公网,那也只能使用主动模式了
定义主动模式或被动模式
在webUI中一次点击 配置 > 模板或者主机 > 监控项 > 监控项的名称
然后会加载类似下图的页面,
图里面的红框中 Zabbix 客户端表示被动模式,
Zabbix 客户端(主动式)就表示主动模式
添加监控主机
安装zabbix-agent服务
安装
// 被监控的主机就是zabbix-agent,
// 安装zabbix-agent也需要先安装zabbix官方的yum源
# wget https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
# rpm -ivh zabbix-release-3.4-2.el7.noarch.rpm
// 安装好yum源之后执行:
# yum -y install zabbix-agent
zabbix-agent安装好之后还需要修改配置文件
# vim /etc/zabbix/zabbix_agentd.conf //修改如下配置
# 定义服务端的ip(被动模式)
Server=127.0.0.1 修改为 Server=10.1.1.30
# 定义服务端的ip(主动模式)
ServerActive=127.0.0.1 修改为 ServerActive=10.1.1.30
# 这是自定义的zabbix-agent主机名,一会还需要在web界面下添加主机的时候需要用到这个主机名
Hostname=Zabbix server 修改为 Hostname=zabbix-agent-01
启动zabbix-agent服务
# systemctl start zabbix-agent
# systemctl enable zabbix-agent
添加主机
添加主机前需要创建一个主机组
依次点击web页面的 配置 > 主机群组 > 创建主机群组
然后填写一个组名,点击添加即可
添加主机
点击web界面的 配置 > 主机 > 创建主机
然后填写一些agent的信息
主机名和可见名称可以定义为相同的,填写的是前面的zabbix-agent配置文件里面定义的Hostname
群组选择刚才创建的群组,在右边的群组选中刚才添加的群组,点击中间的左方向的箭头就可以了
agent代理程序的接口就填写zabbix-agent主机的ip地址
端口保持默认的10050就OK
其他的信息暂时先不用管,填写好之后勾选最下面的一启用,然后点击添加,这样就完成了添加一台agent
添加自定义模板
在Zabbix-server中有许多自带的监控模板,也可以我们自己添加自定义的模板
模板是一些配置的集合,它可以应用在多个主机上,便于配置管理。
一个模板中包含以下的配置
- 应用集
- 监控项
- 触发器
- 图形
- 聚合图形:
- 自动发现:
- web监测
使用链接自带模板的方式添加自定义模板
依次点击web界面的 配置 > 模板 > 创建模板
然后填写模板名,和可见名, 群组需要选择Templates,设置好这些就可以点击添加了
刚创建的模板里面是空的
模板的监控项可以从其他模板复制过来
在模板列表里找到 Template OS Linux,点击它的监控项
然后勾选需要复制到新模板的监控项,再点击复制
目标类型:选择模板,群组:Templates,目标:勾选test_template,
然后再点击复制,完城后web页面会出现 监控项复制 的提示
找到先前创建的模板,就可以看到模板下已经有监控项了
但是自动发现规则并不能使用这种复制的方式。因为它没有复制的选项
这样的话还可以将相关的模板导出成xml的配置文件, 进行修改之后再导入到新模板中
但是这种方式相对比较复杂,
还有另外一种方式,链接到指定的模板,然后删除用不到的配置。
1:进入先前创建的模板,点击链接的模板
2:点击链接指示器后面的选择,勾选 Template OS Linux ,然后点击最下面的选择
3:点击链接指示器下面的添加,点击添加后,Template OS Linux 会出现在链接的模板那个框里
4:点击更新,完成后就可以看到模板中应用集,监控项等都有配置了
5:还需要修改一下链接模板的配置,进入链接模板的页面,点解取消链接,不要点到链接并清理
这一步是为了能修改和删除这个模板中的东西,
如果不取消链接,就不能在这个模板中修改和删除东西,只能去源模板里面操作。
如上如,点击取消链接,可以保留所有的配置,如果点击取消链接并清理就会删除链接创建的配置。
点击取消链接后,记得点更新,
然后就可以删除test-template这个模板中我们用不上的监控项。
如下图勾选上用不到的监控项,然后点击删除就OK了
注意:如果报错Error in query [INSERT INTO…. 需要重新创建zabbix库,在创建库的时候指定字符集为utf8
然后还可以删除应用集中没有监控项的应用集
然后将前面添加的主机 zabbix-agent-01 添加到这个模板中
进入test_template模板,在主机/模板区块中添加zabbix-agent-01这台主机
处理图形中的乱码
问题描述
进入test_template的图形的页面,任意点击一个图形的名称,然后点击预览,
可以看到预览图形的下方有一些不明所以的小方块
原因
这是因为我们使用了中文的web页面,但是图形所使用的字库只是一个英文字库,所以才显示为小方块。
需要将图形使用的字库更换为中文字库,才能解决这个问题
解决办法
更换字库
// 需要找一个中文的字库文件,可以在Windows的 C:/windows/fonts 文件夹下面找到字库文件
// 这里我选择楷体字库,将字库文件复制到桌面或者其他地方,然后上传到zabbix-server主机里。
# ls -dl simkai.ttf
-rw-r--r--. 1 root root 11787328 Dec 4 2017 simkai.ttf
// 在 /usr/share/zabbix/include/defines.inc.php 搜索ZBX_FONTPATH
# grep 'ZBX_FONTPATH' /usr/share/zabbix/include/defines.inc.php
define('ZBX_FONTPATH', realpath('fonts')); // where to search for font (GD > 2.0.18)
// 它定义的路径是“fonts”,它是一个相对路径,绝对路径为/usr/share/zabbix/fonts,
// 而字体文件为“ZBX_GRAPH_FONT_NAME”所定义的“graphfont”,
# grep 'ZBX_GRAPH_FONT_NAME' /usr/share/zabbix/include/defines.inc.php
define('ZBX_GRAPH_FONT_NAME', 'graphfont'); // font file name
// 它是一个软链接文件,绝对路径为/usr/share/zabbix/fonts/graphfont.ttf
// 指向的文件是/etc/alternatives/zabbix-web-font
# ls -dl /usr/share/zabbix/fonts/graphfont.ttf
lrwxrwxrwx. 1 root root 33 Jul 25 23:07 /usr/share/zabbix/fonts/graphfont.ttf -> /etc/alternatives/zabbix-web-font
// 而/etc/alternatives/zabbix-web-font文件也是一个软连接文件
// 它指向了正在的字库文件/usr/share/fonts/dejavu/DejaVuSans.ttf
# ls -dl /usr/share/fonts/dejavu/DejaVuSans.ttf
-rw-r--r--. 1 root root 720012 Feb 27 2011 /usr/share/fonts/dejavu/DejaVuSans.ttf
// 将刚上传的字库文件移动到 /usr/share/fonts/dejavu/ 这个目录下
# cd /usr/share/fonts/dejavu/
# mv /root/simkai.ttf .
// 备份原来的字库文件DejaVuSans.ttf
# mv DejaVuSans.ttf DejaVuSans.ttf.bak
// 然后将刚才移动过来的中文字库文件重命名为DejaVuSans.ttf
# mv simkai.ttf DejaVuSans.ttf
重试
重新打开一个图形预览页面,可以看到中文已经正常显示了。
自动发现
更改自动发现规则的更新时间
默认的自动发现规则更新时间为1个小时,为了更块看到效果,可以将更新时间更改为30s
点击test_template模板的自动发现
然后点击 Network interface discovery这个自动发现规则。
将更新时间的 1h 更改为 30s 然后点击更新
然后等待30秒后,图形中就会出现一个新的图形,这个就是监控网卡流量的图形
在zabbix-agent主机上下载一个大一点的文件(比如mysql的二进制包),来查看这个图形的效果
添加自定义监控项目
需求
监控某台主机的tcp状态处于TIME_WAIT连接数,并出图
解决方案
客户端相关配置
# 需要两步:
1)zabbix监控中心创建监控项目;
2)针对该监控项目以图形展现
# 对于第一步,需要到客户端定义脚本 /usr/local/sbin/estab.sh //内容如下
#!/bin/bash
##获取处于TIME_WAIT状态链接数
netstat -ant |grep -c 'TIME_WAIT'
# 给与脚本执行权限
chmod 755 /usr/local/sbin/estab.sh
# 客户端上编辑配置文件 /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 10.1.1.31 -p 10050 -k 'my.estab.count'
18 //能输出正确的数字就表示客户端配置没问题。
在Zabbix 监控中心 web 页面添加监控项目
依次点击 模板 > test_template模板的监控项 > 创建监控项
然后填写相关信息,
名称随便定义,
类型保持默认,
键值填写 my.estab.count 需要与客户端配置文件中定义的UserParameter相同
其他的保持默认即可,配置完点击添加就好。
然后依次点击 监测中 > 最新数据 , 用过滤筛选出刚才添加的监控项看看是否有数据
如果有数据,就可以建立图形了。
依次点击 配置 > 模板 > test_template模板的图形 > 创建图形
然后填入图形的名称,再点击最下面的监控项的添加,添加刚才创建的TCP_TIME_WAIT监控项
其他保持默认,绘图风格和颜色,可以根据自己的喜好进行修改。配置完点击最下面的添加按钮。
配置完成就可以在 监测中 > 图形 查看到这个图形了(注意需要在红框中进行筛选才能看到)
配置邮件告警
准备一个邮箱
如果使用163或者QQ邮箱发告警邮件,首先需要登录你的163或者QQ邮箱,到设置里面开启POP3、IMAP、SMTP服务,开启并记录授权码。
监控中心设置邮件告警
监控中心设置邮件告警
点击 管理 > 报警媒介类型 > 创建媒体类型
然后填写相关信息:
名称(自定义),类型选择脚本,后面会在主机上编写一个发邮件的脚本
依次添加三个脚本参数,需要注意顺序 {ALERT.SENDTO} ,{ALERT.SUBJECT},{ALERT.MESSAGE}
然后点击添加按钮
编写脚本
在主机上编写一个发邮件的python脚本
// 在 /usr/lib/zabbix/alertscripts 目录下创建一个脚本文件 mail.py
//这个目录是zabbix存放自定义脚本的目录
# touch /usr/lib/zabbix/alertscripts/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.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]
##定义QQ邮箱的账号和密码,你需要修改成你自己的账号和密码(请不要把真实的用户名和密码放到网上公开,否则你会死的很惨)
sendqqmail('[email protected]','password','[email protected]',to,subject,content)
if __name__ == "__main__":
main()
#####脚本使用说明######
#1. 首先定义好脚本中的邮箱账号和密码,password是邮箱的授权码
#2. 脚本执行命令为:python mail.py 目标邮箱 "邮件主题" "邮件内容"
给脚本执行权限
# chmod 755 chmod 755 /usr/lib/zabbix/alertscripts/mail.py
测试脚本能否发邮箱
# python /usr/lib/zabbix/alertscripts/mail.py [email protected] 'testmail' 'this is a test mail'
检查邮箱是否有收到邮件,如果可以收到邮件,表示脚本已经没问题了。
创建一个接受告警邮件的用户
点击 管理 > 用户 > 创建用户 先填写一些用户的基本信息
然后点击 报警媒介,添加一条报警媒介
类型选择“Baojing”
还需要注意用户的权限,如果没有需要到用户组去设置权限
用户群组中点击 Zabbix administrators ,然后点权限,再点击下面图中的选择按钮,
然后在弹出的窗口中勾选所有的主机群组,再点击选择,
还需要选中读写的权限。然后点击添加,不点击添加不会生效。
点击添加后
再点击上图的更新,然后查看sendmail用户的权限
设置动作
动作是在触发报警条件以后执行的一些操作。
依次点击 配置 > 动作 > 创建动作
名称写“sendmail”(自定义),添加两个条件如图
“操作”页面,标题默认,消息内容如下
HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE} {EVENT.TIME}
LEVEL:{TRIGGER.SEVERITY}
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}
点击操作框的 ’新的‘ 创建具体操作,创建完点操作细节框最下面的添加,才表示创建完毕
恢复操作页面,操作创建完点操作细节框最下面的添加,才表示创建完毕
确认操作页面,创建完点操作细节框最下面的添加,才表示创建完毕
最后点击最下面的添加按钮完成动作的创建,
测试告警
给主机zabbix-agent-01创建一个触发器
依次点击 配置 > 主机 > zabbix-agent-01的触发器 > 创建触发器
然后填写信息,名称随意,严重性:未分类
添加表达式,监控项选择先前添加的 TCP_TIME_WAIT ,
功能选择 最新的值 < N
最后一个(T) 就保持为 时间
间隔 30s , N值,这里因为我的TCP_TIME_WAIT的值一直是小于20的 所有将N值设置为25就很容易就报警了
然后其他的选项保持默认就好,然后点击最下面的添加按钮完成创建触发器
接下来稍等一会就可以在仪表盘中的问题栏看见问题
出现问题发送的邮件成功,然后修改触发器将T值改为大于N
问题恢复的邮件也发送成功,
最后确认了问题已恢复,确认问题恢复的邮件也发送成功
发送失败的那个是我在动作的配置中有问题,不应该添加发送消息给用户群组,后面修改了就没有问题了
邮箱中的3封邮件
拓展
zabbix监控交换机(思科) http://tryrus.blog.51cto.com/10914693/1789847
zabbix远程执行命令 http://www.ywnds.com/?p=6610
zabbix分布式部署 http://sfzhang88.blog.51cto.com/4995876/1364399
zabbix监控tomcat(版本有点老,大家只需要参考步骤,不能照搬) http://www.fblinux.com/?p=616