分布式监控Zabbix初入

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 clientzabbix server不在一个防火墙区域,则我们可以让另外的zabbix proxy来对主机进行数据收集之后再将数据交由给我们的zabbix server,在防火墙上也只需要配置放行proxy<-->server之间的流量即可,这就意味着我们的监控系统的扩展性更强。

zabbix架构和安装

架构

一个完整的监控系统至少应该具备下面四个组件:

  • 数据采集
    • SNMP,对于不能安装agent的设备,如路由器/交换机等,可以使用SNMP协议进行监控
    • Agent,对于不同的操作系统,Zabbix提供了不同平台的agent程序
    • Agent-less 形如ICMP/SSH/IPMI
  • 数据存储
    • Database(ZABBIX)
  • 数据展示(Web)
    • 采用对应的web平台,Zabbix自带了默认自带php页面
  • 报警
    • 当监控的指标触发阈值发送EMAIL/SMS等

zabbix的部署可以常见的有两种方式,集中式监控和分布式监控。本篇先讨论集中式监控,zabbix server通过SNMP/Zabbix-agent等方式来对设备进行监控。一张图来说是这样的:

工欲善其事必先利其器,首先我们先安装好zabbix,之后再看看zabbixweb GUI里面有什么,之后再聊聊它的架构,这样会更加直观一点

安装

由于zabbix是一个c/s结构的服务程序,先不考虑分布式的监控,所以其一般分为serveragent两个部分,所以需要分别对C/S进行安装

这里的agent其实就是一个安装在被监控端的客户端程序,它负责收集一些信息,并交给zabbix server。注意的是zabbix server除了自身的组件还需要对从agent获取的数据进行存储,这里选择MySQL

也就是说,我们需要三台CentOS 6.5 Linux主机,一台安装zabbix server,一台安装MySQL,一台安装zabbix agent

我们安装的顺序也是如此,当然agent本身上面应该运行一定的业务,如Load BalanceCacheWebDB等,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

可能出现的问题:

1
2
3
4
5
6
7
8
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

只需要安装依赖包

1
2
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所在的主机

1
2
3
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脚本

1
2
3
4
[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放行相应的端口并设置SELINUXpermissive

之后在zabbix server上修改zabbix-server的配置文件

1
2
3
4
DBName=zabbix
DBUser=zabbix_user
DBPassword=zabbix_pass
DBHost=192.168.162.1

之后启动zabbix-server

1
2
service zabbix-server start
netstat -tunlp|grep zabbix

查看zabbix-server是否在监听,并默认监听在tcp10051端口上,查看zabbix-server日志,保证mysql连接正常:

1
2
3
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

1
2
3
[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服务的启动脚本

1
2
[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的配置文件,别急先看看serverweb GUI

打开http://{zabbix_server_ip}/zabbix之后,使用admin/admin就可以登录了

术语

安装好zabbix我们就聊聊他的架构,先详细看下zabbix的重要术语:

上面提到了,zabbix是一个监控软件。被监控的主机我们需要在其种上agent,那么这个被监控的主机就是一个Host

在被监控的主机上我们关心它的一系列的指标,如CPU Load/MEM use/IO status等等,具体一点,一个监控指标,即free -m看到的每一项数值,就是一个指标:

1
2
3
4
5
[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,如物理内存的bufferCache,就可以放在一起展示,这个其展示的图就是一个Graph

那么对于相同的监控主机上多个Graph,如CPU/MEM等等放在一起展示,就成了一个Screen

OK,有了以上基础,理解其他术语就不难了,比如一个系统我们需要配置好多个ItemTriggerGraph等,无疑这种配置量是巨大的,所以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中增加:

1
2
UserParameter=memory.free,/usr/bin/free -m |awk '/^Mem/ {print $4}'
UserParameter=memory.usage[*],/bin/cat /proc/meminfo |awk '/$1:/ {print $$2}'

注意这里定义了一个KeyKey就是全局标识一个Item的存在,我们在WEB GUI中定义Item也需要定义Keykey包含了我们手动自定义的命令

定义UserParameter可以支持传入参数,传入的参数用$来进行索引,而原本需要索引的字段用$$来进行索引

之后在server端进行测试定义的key

1
2
3
4
[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 HostAdd HostGroup应用哪些模板

第三步:安装并配置客户端

1
2
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配置文件:

1
2
3
4
Server=192.168.162.144 #zabbix server ip
ServerActive=192.168.162.144 #zabbix agent自动注册的服务器地址
Hostname=lamp #制定hostname,会在zabbix server GUI中对应显示
HostMetadata=linux_server #自动注册的认证关键字

当然,这个配置文件应该是一些自动化的工具进行的配置推送。

之后启动zabbixagentservice zabbix-agent startOK,在zabbix server的GUI上查看效果

在一段时间之后,可以观看模板中定义的Graph


坚持原创技术分享,您的支持将鼓励我继续创作!