Why Moniter
首先我们聊聊为什么需要监控?
在SRE Google运维解密
中指出,监控一个系统有多个原因:
- 分析长期的趋势,如每日活动用户的数量增长的速度
- 跨时间范围的比较/或是观察实验组和控制组的区别,如随着新系统的上线,
memcache
的缓存率是否增加?网站是否比上周的速度慢 - 报警,这个很容易理解,如我们的物理内存即将耗尽,到达50%发送一个级别较低的告警信息,当内存只剩下20%发送一个级别更高的告警信息
- 构建监控台页面,更加方便的对系统问题直观考察
- 临时性的回溯分析/在线调试
众所周知,无论公司有多大,我们都需要一套监控系统来保障业务的正常运行,快速发现问题并解决问题是运维存在的价值,只有在问题出现之前将问题提前解决,才能体现出运维的更高的价值,这就需要一个完整的监控系统。
监控系统说白了最重要的是让我们透过现象看本质,所谓现象就是什么东西故障了或存在故障的可能性,以及为什么出现故障。
比如,现象:服务器响应很慢?本质:CPU
被某个复杂度很高的程序跑满,数据库/web连接数过大典型如TIME-WAIT
一个好的监控系统就像信道一样,要有很高的信噪比才行,我们要更多的可用有价值的信息,才能帮助我们进行故障排查,运维不背锅
介绍
Zabbix
是由Alexei Vladishev
开发的一种网络监视、管理系统,和常用的其他软件架构类似,其是一种基于C/S(client/server)结构的开源软件
Zabbix
是一种可以监控系统/网络等基础设施的服务软件,其可以采集一些性能指标数据,它不仅为运维人员原生提供了一系列科学通用的监控选项,也支持ops自定义我们更加感兴趣的一些性能指标。也就是说,zabbix
可以解放我们自己动手去关注采集一系列的信息,从而降低了运维成本,针对不同的业务环境,zabbix
官方也提供了对应的推荐的模板可供使用
zabbix server
可以将我们感兴趣的数据进行采集并存储到RDBMS
中,如常用的MySQL
。这些数据可以供我们后期对业务数据进行分析,便于后期的故障回溯、容量规划等考量
zabbix server
也提供了便捷的WEB GUI
从而方便运维人员对监控系统进行配置、数据展示,我们也可以定义graph、screen等更加全局的对我们系统的性能有个直观的了解
zabbix server
还提供了报警功能,我们可以针对某个性能指标定义当其超过一定的阈值,便触发相应的动作,如实现我们的告警,当然也可以自动去执行某些命令
zabbix
自身是一个分布式监控解决方案,zabbix server
可以指定代理来实现主机的发现和数据采集,当zabbix client
和zabbix server
不在一个防火墙区域,则我们可以让另外的zabbix proxy
来对主机进行数据收集之后再将数据交由给我们的zabbix server
,在防火墙上也只需要配置放行proxy<-->server
之间的流量即可,这就意味着我们的监控系统的扩展性更强。
<!– more –>
zabbix架构和安装
架构
一个完整的监控系统至少应该具备下面四个组件:
- 数据采集
- SNMP,对于不能安装
agent
的设备,如路由器/交换机等,可以使用SNMP协议进行监控 - Agent,对于不同的操作系统,
Zabbix
提供了不同平台的agent
程序 - Agent-less 形如ICMP/SSH/IPMI
- SNMP,对于不能安装
- 数据存储
- Database(ZABBIX)
- 数据展示(Web)
- 采用对应的web平台,
Zabbix
自带了默认自带php页面
- 采用对应的web平台,
- 报警
- 当监控的指标触发阈值发送EMAIL/SMS等
zabbix的部署可以常见的有两种方式,集中式监控和分布式监控。本篇先讨论集中式监控,zabbix server
通过SNMP/Zabbix-agent
等方式来对设备进行监控。一张图来说是这样的:
工欲善其事必先利其器,首先我们先安装好zabbix
,之后再看看zabbix
的web GUI
里面有什么,之后再聊聊它的架构,这样会更加直观一点
安装
由于zabbix
是一个c/s结构的服务程序,先不考虑分布式的监控,所以其一般分为server
和agent
两个部分,所以需要分别对C/S进行安装
这里的agent
其实就是一个安装在被监控端的客户端程序,它负责收集一些信息,并交给zabbix server
。注意的是zabbix server
除了自身的组件还需要对从agent
获取的数据进行存储,这里选择MySQL
。
也就是说,我们需要三台CentOS 6.5 Linux
主机,一台安装zabbix server
,一台安装MySQL
,一台安装zabbix agent
我们安装的顺序也是如此,当然agent
本身上面应该运行一定的业务,如Load Balance
、Cache
、Web
,DB
等,zabbix server
后期会根据对应的服务从而定义不同的感兴趣的东西,OK, go ahead!
zabbix server
首先我们先去zabbix
官网下载这么几个rpm
包
zabbix/zabbix-get/zabbix-server/zabbix-web/zabbix-server-mysql/zabbix-web-mysql
下载完成之后,在rpm
包目录下使用yum -y localinstall *.rpm
,这里*
表示当前目录下所有的rpm
包
可能出现的问题:
Error: Package: zabbix-server-mysql-2.2.16-1.el6.x86_64 (/zabbix-server-mysql-2.2.16-1.el6.x86_64)
Requires: libiksemel.so.3()(64bit)
Error: Package: zabbix-server-2.2.16-1.el6.x86_64 (/zabbix-server-2.2.16-1.el6.x86_64)
Requires: iksemel
Error: Package: zabbix-server-2.2.16-1.el6.x86_64 (/zabbix-server-2.2.16-1.el6.x86_64)
Requires: fping
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
只需要安装依赖包
yum install -y epel-release
yum install -y iksemel fping libiksemel
观察/etc/rc.d/init.d/
目录下是否有zabbix-server
启动脚本即可。
设置MySQL
安装mysql
就不再赘述了,可以使用yum
也可以自行编译安装
要让这台mysql
作为zabbix server
所能存储信息的数据库,需要进行一定的初始化操作,首先需要在这台主机上中创建一个zabbix
的数据库,并将其授权zabbix server
所在的主机
mysql> CREATE DATABASE zabbix CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix_user'@'%' IDENTIFIED BY 'zabbix_pass';
mysql> FLUSH PRIVILEGES;
此时应该在zabbix server
这台主机上尝试是否可以连接到对应的数据库上
从zabbix server
拷贝初始化zabbix database
所需要的sql
脚本
[root@zabbix_server create]# pwd
/usr/share/doc/zabbix-server-mysql-2.2.16/create
[root@zabbix_server create]# ls
data.sql images.sql schema.sql
先导入schema.sql
,再导入image.sql
,最后导入data.sql
。
至此,mysql
就初始化完成,注意iptables
放行相应的端口并设置SELINUX
为permissive
之后在zabbix server
上修改zabbix-server
的配置文件
DBName=zabbix
DBUser=zabbix_user
DBPassword=zabbix_pass
DBHost=192.168.162.1
之后启动zabbix-server
service zabbix-server start
netstat -tunlp|grep zabbix
查看zabbix-server
是否在监听,并默认监听在tcp10051端口上,查看zabbix-server
日志,保证mysql
连接正常:
19615:20170423:085141.690 using configuration file: /etc/zabbix/zabbix_server.conf
19615:20170423:085141.694 current database version (mandatory/optional): 02020000/02020001
19615:20170423:085141.694 required mandatory version: 02020000
使用浏览器打开zabbix 的WEB GUI
,可以在线安装zabbix
,这里就不赘述了,注意填好zabbix database
的配置参数即可
zabbix agent
接下来安装zabbix-agent
,我们也是要在zabbix
官网下载这么几个rpm
包
[root@zabbix_agent zabbix_agent]# ls
zabbix-2.2.16-1.el6.x86_64.rpm zabbix-sender-2.2.16-1.el6.x86_64.rpm
zabbix-agent-2.2.16-1.el6.x86_64.rpm
也是使用yum -y localinstall *.rpm
即可,之后便可发现zabbix-agent
服务的启动脚本
[root@zabbix_agent zabbix_agent]# ls /etc/rc.d/init.d/zabbix-agent
/etc/rc.d/init.d/zabbix-agent
OK,至此一个server-agent
架构的集中式监控zabbix
安装完成
但是需要注意的是,目前我们的zabbix-server
还不能发现我们的被监控主机,我们还需要修改zabbix-agent
的配置文件,别急先看看server
的web GUI
打开http://{zabbix_server_ip}/zabbix
之后,使用admin/admin
就可以登录了
术语
安装好zabbix
我们就聊聊他的架构,先详细看下zabbix
的重要术语:
上面提到了,zabbix是一个监控软件。被监控的主机我们需要在其种上agent
,那么这个被监控的主机就是一个Host。
在被监控的主机上我们关心它的一系列的指标,如CPU Load/MEM use/IO status
等等,具体一点,一个监控指标,即free -m
看到的每一项数值,就是一个指标:
[root@zabbix_agent zabbix_agent]# free -m
total used free shared buffers cached
Mem: 980 802 177 0 127 431
-/+ buffers/cache: 243 737
Swap: 1983 0 1983
如 total Mem
为980就是一个监控指标,那么这个就是一个Item。
而Mem status
物理内存的信息,包含总共/使用的/剩下的/共享内存/buffer/cached等等这些值都描述了物理内存的情况,可以将多个Item
归个类,这就是一个 Applications
我们都知道,当物理内存耗尽,kernel
会启动一个oom killer
来杀死某些进程来释放内存,甚至会经常杀死我们的mysql
服务,这可不得了,当我们监控的一个Item
如内存free
这个指标,所以当其降低到一定的值比如30%,让它执行一个send message
来告警
这就需要一个trigger触发器来对MEM free
这个指标进行监视,那么降低到30%由Trigger
触发一个Event,当这个Event
产生,执行一个Action,这个动作可以是send message
也可以定义成step by step
,比如先执行远程命令,再告警,我们也可以针对一个Item
定义多个触发器,这样就可以实现不同级别的告警了
我们的agent
会定时根据Item
来进行数据的采集并将其发送给zabbix server
,所以我们的zabbix server
会将它的数据进行汇总并收集,会产生一个流量图。
那么对于多个监控类型相同的Item
,如物理内存的buffer
和Cache
,就可以放在一起展示,这个其展示的图就是一个Graph
那么对于相同的监控主机上多个Graph
,如CPU/MEM等等放在一起展示,就成了一个Screen
OK,有了以上基础,理解其他术语就不难了,比如一个系统我们需要配置好多个Item
,Trigger
,Graph
等,无疑这种配置量是巨大的,所以zabbix官方为我们提供了模板Template,一个被监控主机可以关联一个或多个template
,这样就免去了很多的重复劳动
还有我们的Host
有很多,那么我想让相同业务的监控主机一起操作,就可以将这些主机加入一个主机组Host Group
我们还想自动发现一些主机,当我们的被监控主机带着pupet
推送的配置文件上线了,可以自动将这些主机进行监控,并自动关联模板。那么就需要Discovery,当主机上线,会触发Discovery
事件,这个event
定义的action
就是关联模板等操作。这是不是很运维~~~
好了,我们总结下
ZABBIX 术语 | 描述 |
---|---|
Host | 一台被监控的设备,服务器,网络设备等。 |
Item | 一个监控指标,比如cpu 中断数,cpu 上下文切换的次数,内存free值 |
Applications | 多个Item所组成的集合 |
Trigger | 触发器(报警点),比如Mem free小于300,触发器状态由OK–>Problem,并触发一个Event。 |
Action | trigger触发后的动作,比如发邮件 |
Event | trigger每次状态(比如cpu load数据每次收到数据,都会针对trigger比较,并记录状态) |
Graph | 可以自定义的图表,不同item,坐标轴,图的类型等 |
Screen | graph的集合,需要手动维护 |
History | 每个item的每次获取的数据 |
Trend | 针对每个item,每小时的min,max,avg值。 |
Template | 模板,类似host,上面可以有item, trigger, action等。host如果属于某个template,那么template上的所有内容会“复制”到host上。 |
Zabbix Server | Zabbix中央服务器 |
Zabbix Proxy | Zabbix代理,分布式中使用 |
VPS | Value Per Second,每秒处理数据量。这个值从数据库计算而出。可以定量的衡量server的压力。 |
它们的关系是这样的:
配置
手动配置一个Host
保存之后就可以再去定义一些Item
,系统自己提供了部分的Item
,当然你也可以自己定义一个Item
,不过直接套用模板也是最省事的做法了。
自定义Item
当模板不够用的时候,就需要我们自己定义Item
,这里演示下如何自定义Item,在Agent
的配置文件/etc/zabbix/zabbix_agentd.conf
中增加:
UserParameter=memory.free,/usr/bin/free -m |awk '/^Mem/ {print $4}'
UserParameter=memory.usage[*],/bin/cat /proc/meminfo |awk '/$1:/ {print $$2}'
注意这里定义了一个Key
,Key
就是全局标识一个Item
的存在,我们在WEB GUI
中定义Item
也需要定义Key
。key
包含了我们手动自定义的命令
定义UserParameter
可以支持传入参数,传入的参数用$
来进行索引,而原本需要索引的字段用$$
来进行索引
之后在server
端进行测试定义的key
:
[root@zabbix_server ~]# zabbix_get -s 192.168.162.50 -k "memory.free"
122
[root@zabbix_server ~]# zabbix_get -s 192.168.162.50 -k "memory.usage[Buffers]"
109172
之后我们就可以自定义Item
了
Agent自动注册
接下来我们重新启动一个主机,实现让它上线后自动被zabbix-server
发现并关联模板实现监控
server端
第一步:创建一个不包含任意主机的主机组HOST GROUP
第二步:添加自动注册操作规则
在configuration->Action
中添加一个动作:
设置Action
的名字
设置condition
,设置Host Metadata
,如为linux_server
,意思是当Agent
过来注册的时候,匹配客户端配置文件中的HostMetadata的值
设置oprations,添加了三个触发操作内容:Add Host
、Add HostGroup
、 应用哪些模板
第三步:安装并配置客户端
scp root@192.168.162.50:/usr/local/src/zabbix/* /usr/local/src/zabbix/
cd /usr/local/src/zabbix/ && yum -y local install *.rpm
修改agentd.conf
配置文件:
Server=192.168.162.144 #zabbix server ip
ServerActive=192.168.162.144 #zabbix agent自动注册的服务器地址
Hostname=lamp #制定hostname,会在zabbix server GUI中对应显示
HostMetadata=linux_server #自动注册的认证关键字
当然,这个配置文件应该是一些自动化的工具进行的配置推送。
之后启动zabbix
的agent
:service zabbix-agent start
OK,在zabbix server
的GUI上查看效果
在一段时间之后,可以观看模板中定义的Graph
作者:朱晓飞 链接:http://www.jianshu.com/p/dc10ac52ac0f 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。