原文地址:http://goquxiao.com/posts/2015/02/17/ji-yu-zabbix-dockerkai-fa-de-jian-kong-xi-tong/)
背景
团队所开发的持续监测网站/APP的产品,需要有一项监控功能,具体来说就是,对URL/域名进行周期性(小于1分钟)监测,并且能对异常事件进行实时告警。在最近这几个月,我一直将大部分时间和精力花在了设计开发这套系统上面,一共经历了两个大版本。下文就对这套监控系统进行介绍,分享给大家。
自己之前没有这类系统的开发设计经验,于是问了下周围同事。和同事讨论的结果是:既然现在人手不够(就我一个人),我之前也没开发过这类系统,时间又比较紧迫(领导给的排期是“越快越好”……),那么找一个已有的开源监控系统进行二次开发,应该是一个不错的选择。那么,选择哪种开源监控系统呢?根据同事以往的经验,可以考虑zabbix,自己也调研过一段时间zabbix,它的优点有如下几条:
- 架构简单、清晰
- 文档丰富,代码注释十分详细
- agent/server部署方便
- 包含整套监控流程:包括采集、触发、告警
- agent支持用户自定义监控项
- 触发器表达式丰富
- 暴露了一套HTTP + JSON的接口
另外,除了以上这样,还有一个比较重要的一个原因:团队中的同事之前也调研过zabbix。在人手不足、时间又紧的情况下,这一个因素的权重就显得相对较高。所以,最终选择了在zabbix基础上进行二次开发。
至于使用docker,是考虑到监控的对象,会因为用户的增长、以及用户的操作,有动态的变化。作为设计者,自然希望有一种机制,能够可编程地、动态地控制zabbix agent的数量。我们既不让某一个agent(具体应该是agent的端口)有过多的监控项,导致监控项无法在一个周期内完成数据采集;又不想有生成过多的agent,造成系统资源的浪费。目前势头正劲的docker,怎能不进入我的视野?社区活跃、文档完善、相对其他虚拟化技术又很轻,都成为了我选择docker的原因。
需求
这个监控系统的设计目标是:希望能够提供秒级时间粒度的监控服务,实时监控用户网页的可用性指标,做到快速反馈。
具体的需求为:当用户在我们的产品中创建持续监测任务,对于用户输入的URL进行两种类型的监控,即HTTP返回码以及PING返回时间。当某一类监控的采样数据异常时——例如HTTP返回500、PING超时——就会在用户界面上返回告警事件,用以提醒用户;采样数据正常时,再返回告警事件的状态。
第一个版本
架构
第一个版本中,系统的设计特点为:
- 一台物理服务器对应一个zabbix的host
- 监控项使用被动采集方式
- 每个zabbix agent处于一个docker container内,每生成一个container,就在物理机上面开放一个端口,并生成一个对应的zabbix agent interface
- 对于上游的每个监控任务,会在每个IDC节点各生成了一组zabbix采集监控任务,具体对应关系为:
(groupid, hostid, interfaceid, itemid, triggerid)
- 告警事件的生成,采用了轮询trigger状态的方式,当上游监控任务对应的处于PROBLEM状态的节点数大于总节点数时,产生告警事件;当所有节点均为OK状态时,产生告警恢复事件
第一个版本的架构,如下图所示:
Monitor Web
模块,作为后端的接口供前端来调用,主要提供监测任务添加、修改、删除,告警事件列表返回、告警事件删除等功能。Monitor Syncer
模块,用于定期检查每个监测任务对应的zabbix trigger的状态,根据trigger的状态,来生成告警事件以及告警恢复事件。Zabbix Server
和Zabbix Agent
就构成了监控系统的核心服务。其中,一台物理机器中,包含了多个Docker container,每个container中运行这一个zabbix agent。
流程
以创建监控任务为例,当前端发出创建监测任务时,Monitor Web
模块接收到该请求,进行如下操作:
- 在每一个IDC(对于zabbix中的group)中,各创建一个container,在container中启动zabbix agent,记录其对外开放的端口
- 根据得到的端口,在zabbix host中,创建zabbix interface(和agent的端口一一对应)
- 根据得到的interface,创建HTTP和PING两种类型的zabbix item和trigger,分别监控URL的HTTP返回码,以及host的PING返回值。zabbix server开始进行数据采集和监控
- 在业务数据库表中添加该条监测任务记录
Monitor Syncer
每隔一个周期(30s),扫描一遍目前所有监测任务,再从zabbix数据库中查找到对应trigger的状态。如果trigger状态为PROBLEM的超过了半数,那么该监控任务就处于了告警状态,最后再根据该任务目前是否处于告警状态,来决定是否需要添加告警事件;那么对应的,如果trigger状态均为OK,并且目前任务处于告警状态,那么则需要为告警事件添加对应的恢复状态。
这样,就完成了添加任务 -> 告警 -> 恢复的整个监控系统的典型流程。
性能
对第一个版本进行了性能测试,得到了以下性能指标:
(3台服务器,1台部署Zabbix Server,2台部署Docker + Zabbix Agent。服务器配置:Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz X 24,128G 内存,千兆网卡)
- 样本采集项:1111 item
- 样本采集频率:60s
- 最大入口流量: 68 kbps
- 最大出口流量: 270 kbps
- 每秒下发采集请求: ~19 qps
存在的不足
因为开发时间所限,以及对于新技术的调研不够深入,第一个版本有不少不足,主要体现如下:
- zabbix agent采用的是被动模式,每次采集数据zabbix server都需要向zabbix agent查询监控项,网络出口数据量较大
- 由于数据采集都是进行需要发起网络操作,而每个采集数据的频率又较高,因此会出现数据采集不完整、无法连续采集的现象
- 采用轮询方式探测故障事件,效率较低,实时性不高,同时也有单点问题
- 任务请求没有进行持久化,如果因为模块问题而丢失或操作失败,无法回滚
第二个版本
升级点
针对第一版本发现的问题,在设计上做了一些升级,具体升级点和设计上面的特点如下:
- 不再采用物理机器和Zabbix Host一一对应的关系,而是采用Docker container和Zabbix Host一一对应(这里的Zabbix Host就是一个虚拟Host的概念)
- 采用etcd进行分布式状态管理,动态自主注册Zabbix Host
- 采集项使用Agent自主上传方式
- Zabbix Host和监控项之间的比例可配置,即配置每个Zabbix Host上最多进行的监控项数量
- 监控项自动转移,如果一个Zabbix Host出现异常,系统可以将上面的监控项迁移至其他健康的Zabbix Host
- 借助Zabbix Action,将异常状态的改变实时传递给系统,而不是由系统进行轮询
- 任何请求将进行持久化,方便查看以及请求的回滚
第二版的架构变成了这样:
上图中,Monitor Web
一方面接收前端的请求,它收到请求做的唯一的事情就是将请求数据写入数据库进行持久化;另一方面,它还会接收来自Zabbix Server
的事件请求,这里的事件表示trigger状态的改变。
Monitor Admin
有两个职责:1)定期检测未完成的请求(添加/删除监控任务),拿到请求之后通过Zabbix API在对应的Zabbix Agent中添加/删除监控项(item + trigger);2)侦听ETCD中的key状态变化,进行相应地Zabbix Host创建/删除,以及监控项的迁移。
每当启动一个Docker container,就会将物理机的IDC、ETCD Server地址、Zabbix Server地址等参数传递至container,然后在内部启动zabbix_agentd
,并且定期检查zabbix_agentd
是否存活,如果存活的话,则生成一个唯一的key,向ETCD发起key创建/更新请求;如果不存活,则key会自然的过期。这样,Monitor Admin
就通过ETCD得知了各个zabbix_agentd
的健康状况,并且在内存中存储一份agent的拓扑结构。
启动了多个container,在Zabbix Server中就对应了多个Zabbix Host,如下图所示:
其他方面调优
除了整体架构的升级,还在了许多方面(主要是Zabbix)进行了调优,比如:
尽量增加agent的超时时间
因为我们的监控采集项,都是需要对URL或者域名进行网络操作,这些操作往往都会比较耗时,而且这是正常的现象。因此,我们需要增加在Zabbix agent的采集超时,避免正常的网络操作还没完成,就被判断为超时,影响Server的数据获取。
### Option: Timeout
# Spend no more than Timeout seconds on processing
#
# Mandatory: no
# Range: 1-30
# Default:
# Timeout=3
Timeout=30
不要在采集脚本中加上超时
既然Zabbix agent中已经配置了采集超时时间,就不需要在采集脚本中添加超时了。一方面增加了维护成本,另一方面如果配置不当,还会造成Zabbix agent中的超时配置失效。(之前在脚本中使用了timeout
命令,由于设置不正确,导致采集项总是不连续,调试了好久才查明原因。)
增加Zabbix Server的Poller实例
默认情况,用于接收Zabbix agent采集数据的Poller实例只有5个。对于周期在1分钟内、数量会达到千级别的采集项来说,Poller实例显然是不够的,需要增大实例数,充分利用好服务器资源。例如:
### Option: StartPollers
# Number of pre-forked instances of pollers.
#
# Mandatory: no
# Range: 0-1000
# Default:
# StartPollers=5
StartPollers=100
利用好Zabbix trigger expression
如果只把trigger expression理解为“判断某个item value大于/小于某个阈值”,那就太低估Zabbix的trigger expression了,它其实可以支持很多复杂的逻辑。比如,为了防止网络抖动,需要当最近的连续两个采集项异常时,才改变trigger的状态,表达式可以写成:(假设item_key<0
为异常)
{host:item_key.last(#1)}<0&{host:item_key.last(#2)}<0
再举个例子,同样是为了防止采集的服务不稳定,我们可以规定,当目前trigger的状态为PROBLEM,并且最近5分钟的采集数据均正常的时候,才可以将trigger状态改为OK,表达式可以这样写:
({TRIGGER.VALUE}=0&{host:item_key.last(#1)}<0&{host:item_key.last(#2)}<0) | ({TRIGGER.VALUE}=1&{host:item_key.min(5m)}<0)
具体可以参考Trigger expression
性能
测试环境:
3台服务器,硬件参数与之前保持一致
- Zabbix Server * 1
- 监控服务器 * 1
- ETCD Server * 1
- Docker container * 500 (在1台物理机中)
性能指标:
- 样本采集项:7100
- 样本采集频率:60s
- Zabbix Server每秒处理监控项: 130 个监控项 / 秒 (第一版为~19 qps)
- 平均入口流量:454.25 kbps
- 最大入口流量:916.12 kbps (第一版为68 kbps)
- 平均出口流量:366.65 kbps
-
最大出口流量:1.68 Mbps (第一版为270 kbps)
部分性能指标的监测图如下:
Zabbix Server每秒处理监控项数目
Zabbix Server网卡入口流量
Zabbix Server网卡出口流量
可以看出,跟第一版相比,最大可采集的数据量是原来的近7倍,Zabbix Server的进出口流量有明显的提升,监控项的处理吞吐率也和采集项数量有了一致的提高,是原来的6.8倍,并且没有出现监控项在一个周期内无法采集到的情况(如果再增加监控项,则会不定期出现采样不连续的情况),性能提升还是比较明显的。
系统截屏
故障事件列表
短信报警
总结
本文从架构上介绍了如果基于Zabbix以及Docker,构建一个监控系统。
(广告时间,感兴趣的朋友可以登录我们的官网进行注册,使用我们的评测/监测/加速等服务,并且通过添加PC持续监测任务来对网站进行实时监控。)
当然,目前的版本仍然不够完美,目前“抗住”了,然后需要考虑“优化”,年后预计会有较大改动,架构上以及技术上,自己已经在考量中。
相关推荐
### 基于Prometheus和Zabbix实现容器云平台整体监控方案—最佳实践 #### 一、背景介绍 随着云计算的普及以及企业数字化转型的深入,容器化技术因其高效的资源利用、灵活的服务编排能力而成为了当前IT领域的热门...
在本文中,我们将深入探讨如何在CentOS 7系统上安装Zabbix 6.4.6,这是一个功能强大的版本,包含了丰富的监控特性和改进。 首先,我们需要确保系统是最新的,可以通过运行以下命令来更新: ```shell sudo yum ...
6. **运维实践**: 运维实践中,Python和Django可以结合Ansible、SaltStack等工具进行配置管理,使用Nagios、Zabbix等进行监控,利用Docker和Kubernetes实现容器化部署。 7. **学习资源与实践**: 学习Python和Django...
Zabbix或Prometheus等工具则用于系统监控。配置管理可以借助Spring Cloud Config或HashiCorp Consul。 6. **服务调用模块**: 分布式系统中的服务调用模块涉及微服务间的通信。Java的RMI(远程方法调用)或者基于...
Redis原始日志源:ElasticSearch监控数据源:zabbix初步代码库:gitlab容器化平台:Kubernetes + Docker + Harbor初步编译:jenkins登录鉴权:cas操作系统:CentOS 7+ Ansible版本:2.6+ web运行:Nginx + Gunicron...
wgcloud-v3.2.6是一款基于Java和Go语言开发的微服务架构分布式监控系统,主要用于运维自动化,提供丰富的监控和告警功能。接下来,我们将详细解读wgcloud-v3.2.6系统的核心特点及主要功能。 核心特点: 1. 轻量级...
WGCLOUD是一款基于微服务架构(SpringBoot)的分布式运维监控系统,采用Java和Go语言开发,具备轻巧实用、部署简单的特点。该系统支持多种监控核心模块,如CPU和温度监控、内存监控、主机硬件信息、数据监控、服务...
例如,对于使用CoreOS或RHEL的云环境,或者基于Fedora的开发环境,Dockbix-Agent-XXL都能提供一致的监控体验。对于Boot2docker和Photon OS这样的轻量级容器主机,其小巧的体积和高效的性能使得监控更为便捷。而对于...
我们还使用了多种监控工具,包括 Nagios 监控系统、Zabbix 监控系统等。这些工具帮助我们快速地监控系统的运行状态。 Conclusion 基于 SpringBoot 框架和 Vue 框架的洗衣店订单管理系统是一个功能强大且实用的系统...
过去,Cacti、 Whatsup Gold 和 Zabbix 等传统监控系统由于其难以扩展、二次开发困难和多套系统的异构性,逐渐无法满足现代企业的需求。因此,寻找一种现代化、具有高度可扩展性和易于二次开发的监控解决方案成为了...
WGCloud的主要监控模块包括主机监控、ES状态监控、CPU与温度监控、内存监控、主机硬件信息、数据监控、服务心跳检测、应用进程管理、磁盘空间和IO监控、系统负载监控、自动网络拓扑图、端口监控、日志文件监控以及...
13. 监控与维护:通过日志系统监控运行状态,使用Zabbix等工具进行性能监控,及时发现并解决问题。 综上,基于SSM的微信小程序游泳馆管理系统是现代游泳馆管理的有力工具,它结合了强大的后端开发框架和便捷的...
包含完整工程, 最近几年,容器技术在国内外发展的非常迅速,国外已经形成了相对成熟的生态圈。........ 完整毕设 目录:= 摘 要 I 第一章 绪 论 1 ...4.2.1 安装初始化Zabbix监控实例 13 4.2.2 安装初始化Jump
综上,PMM在数据库性能监控方面表现出色,适合展示性能图表,但报警功能建议结合Zabbix,对于监控系统的扩展和自定义需求,可能需要更多定制化工作。使用PMM时,要注意其特定的使用场景和潜在问题,以充分利用其优势...
8. **监控与日志**:通过Zabbix、ELK Stack等工具对系统进行实时监控和日志分析,及时发现并解决问题,保证系统的健康运行。 9. **持续集成与交付(CI/CD)**:自动化测试、构建和部署流程,如Jenkins、GitLab CI/CD...
因此,企业应转向构建一体化的监控平台,整合多个监控子系统,例如Zabbix用于基础设施、系统、数据库和业务监控,KCMM专注于Windows界面元素的系统监控,而TM则用于交易性能分析。告警集成和性能集成是关键,通过...
由于没有具体的标签和子文件详细列表,我将基于通常的自动化运维管理系统的组成部分进行讲解。 自动化运维管理系统的核心目标是减少人工干预,通过软件和脚本自动化执行日常运维任务,如服务器配置、监控、更新、...
新奥家电连锁网络系统是一个基于Java技术开发的综合性管理平台,专为家电零售行业的连锁经营设计。这个系统旨在提升家电连锁企业的运营效率,优化业务流程,实现信息化管理。以下是该系统的一些关键知识点: 1. **...
8. 监控和自动化部署工具:文档中提到了Zabbix和Ansible,Zabbix是一个基于Web的开源监控工具,用于监控各种网络服务、服务器和网络硬件。Ansible是一个自动化运维工具,通过简单的配置文件,可以实现对服务器的自动...