深入理解Zabbix监控系统

978-7-115-55833-6
作者: 鲍光亚
译者:
编辑: 刘雅思

图书目录:

详情

Zabbix是一个开源监控系统,在我国各类信息技术企业和金融企业中被广泛应用。本书主要从源码和功能两个角度,分析Zabbix监控系统的底层工作机制。本书首先讲述跨进程的总体工作机制,然后按照监控数据的处理流程依次讲解Zabbix服务器端和Zabbix客户端各类进程的内部工作机制,最后讲述Zabbix Web应用的工作机制。本书能够帮助读者深入理解Zabbix系统的核心原理,有助于在运维工作中快速定位和解决问题。 本书适合具有一定Zabbix应用经验并想要进一步理解Zabbix工作机制的读者阅读,包括相关企业的运维人员、技术主管、架构师、产品经理和决策者等。

图书摘要

版权信息

书名:深入理解Zabbix监控系统

ISBN:978-7-115-55833-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


著    鲍光亚

责任编辑 刘雅思

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Zabbix是一个开源监控系统,在我国信息技术企业和金融企业中被广泛应用。本书主要从源码和功能两个角度,分析Zabbix监控系统的底层工作机制。本书首先讲述跨进程的总体工作机制,然后按照监控数据的处理流程依次讲述Zabbix服务器端和Zabbix客户端各类进程的内部工作机制,最后讲述Zabbix Web应用的工作机制。本书能够帮助读者深入理解Zabbix监控系统的核心原理,有助于在运维工作中快速定位和解决问题。

本书适合具有一定Zabbix应用经验并想要进一步理解Zabbix工作机制的读者阅读,包括相关企业的运维人员、技术主管、架构师、产品经理和决策者等。


很荣幸能为这本书作序。

本书是从源码级别对Zabbix开源监控系统进行全面解读的专业著述。我用5天的时间通读本书后,感觉获益匪浅,强烈推荐每一位Zabbix用户将其作为案头必备的工具书和参考手册。

近几年开源监控系统蓬勃发展,特别是Prometheus的势头正劲,但以前很多介绍Prometheus的文章或教程里,都会把Zabbix作为反面案例,而其中列举的一些例子其实是对Zabbix不了解或不熟悉而造成的误读。现在用户越来越理性,也越来越专业,会根据不同的业务应用场景,选择更符合实际需求的推荐方案。作为在工作中同时使用Zabbix和Prometheus的用户,我认为在基础设施即服务(infrastructure as a service,IaaS)监控领域里,Zabbix仍是最佳的开源监控解决方案。

开源监控系统要做好、做大、做强,离不开3点:一是商业支持,二是应用需求,三是开发迭代。上海宏时数据系统有限公司是Zabbix的母公司Zabbix SIA的大中华区原厂代表,全权负责Zabbix的原厂培训、咨询服务、市场推广和知识产权维护,是Zabbix中国生态的构建者、Zabbix中国峰会的创办者、Zabbix中文手册和书籍的编译者。经过其多年耕耘,Zabbix已经成功在国内的银行、电信、制造、保险、证券和零售等多个行业中成功应用。在每年举办的Zabbix中国峰会上,Zabbix的应用领域也越来越广泛、越来越成熟。但在代码开发方面,国内开发者却局限于Web页面的修改或扩展,不能不说是一大憾事。

我使用Zabbix已接近7年,从2.0版本开始使用,从3.0版本开始接触源码。我在使用中遇到Zabbix的很多问题,即使阅读官方文档也无法全部理解和解决,这时就必须通过源码来排查原因。但是,Zabbix源码的浩繁复杂阻碍了用户深入学习研究,也阻碍了用户对Zabbix进行重大、紧急bug的修复以及功能扩展。本书对目前正在逐步成为主流的Zabbix 5.0进行深入分析,恰好弥补了这个缺憾,是国内监控行业和软件开发领域的一大幸事。

Zabbix的后端源码主要用C语言编写。本书行文流畅,对源码的分析清晰而透彻。我在阅读本书的过程中就消除了好几个多年的疑惑,也对Zabbix有了更深刻的理解。

这本书首先从全局层面对Zabbix架构进行了介绍,并专门对从Zabbix 2.2到Zabbix 5.0的技术演进进行了比较,使读者可以更好地理解Zabbix功能模块组件不断变化和完善的原因;然后结合源码,对Zabbix 5.0的每个功能模块逐一进行了分析,对重要和常用的功能(比如缓存、各种功能进程和数据库表等)重点予以解释说明,其中关于Zabbix源码构建的部分可谓点睛之笔;最后对Zabbix的前端源码也进行了简要讲解,甚至给出了一个增加Web页面功能的小例子。可以说本书覆盖了Zabbix源码的方方面面。

相信通过对这本书的研读,无论是Zabbix的使用者还是Zabbix的开发者,都会对Zabbix有更全面、更深入的了解,并能更好地使用和完善Zabbix。

田川

海尔智家基础管理

2021年3月


Zabbix是一个开源监控系统(监控软件),在我国信息技术企业和金融企业中被广泛应用。但是,大部分Zabbix用户只是熟悉如何使用该软件,对该软件内部的工作机制却了解不多,无法灵活而深入地应用该软件。对于用户来说,要想充分发挥Zabbix本身的强大功能,一个基本前提就是全面、深入地理解该软件。

虽然Zabbix是一种开源软件,但是较少有图书系统性地介绍该软件的工作原理和内部结构。作者曾为多家不同规模的企业部署和维护Zabbix监控系统,在Zabbix的使用过程中发现,如果不理解底层工作机制,那么很多运维问题的解决都是临时性的,治标不治本。当Zabbix变成一个神秘的黑盒时,每一个运维人员在它面前都会很被动。

基于以上认识,作者决定总结自己多年来对Zabbix开源监控系统的理解和认知,编撰成书,目标是帮助读者不仅知其然,更知其所以然,希望对读者有所帮助。

本书依据Zabbix的系统架构进行分解讲述。总体上,Zabbix由多个组件构成,主要有Zabbix服务器、Zabbix客户端和Zabbix Web应用。每个组件内部主要采用多进程架构,以实现并行和并发。本书共19章,分为4部分。第一部分包括第1章至第6章,主要讲述Zabbix服务器端内部实现多进程架构所依赖的总体工作机制;第二部分包括第7章至第14章,主要讲述Zabbix 服务器端和Zabbix 代理端各种进程的详细工作过程,以及各进程如何处理监控数据;第三部分包括第15章至第17章,主要讲述Zabbix客户端的详细工作机制,以及Zabbix源码的编译和构建过程;第四部分包括第18章和第19章,主要讲述Zabbix Web API和Zabbix Web应用。

具体到每一章,其主要内容如下。

第1章讲述Zabbix的多进程特征以及不同Zabbix版本的系统架构演变,以帮助读者从技术演进的角度了解Zabbix的过去和现在。

第2章讲述Zabbix服务器端进程的分类以及多进程之间的通信与协调。Zabbix的每种进程所完成的任务是相对独立的,因此进程的分类在一定程度上说明了Zabbix如何对总体任务进行分解,以及如何解决进程之间的协作问题。

第3章讲述Zabbix中最常用的7种数据结构设计。数据结构在软件设计中总是处于核心地位,Zabbix对数据结构的设计决定了其处理数据的效率,同时决定了各个进程应该以何种方式和次序处理数据。

第4章讲述缓存的结构以及各进程如何使用缓存。Zabbix使用的缓存位于共享内存中,几乎所有进程都需要访问缓存才能正常工作,这就使缓存成为整个监控系统的数据核心,如果缓存出现问题,那么整个监控系统都将崩溃。

第5章讲述Zabbix本地进程和远程主机进程之间的套接字通信过程和通信协议,以及基于套接字通信的加密机制。

第6章讲述各进程如何通过日志跟踪自身的工作进度,以及如何使用Zabbix日志。

第7章讲述Zabbix服务器端的trapper类进程和poller类进程如何大规模地收集监控数据。Zabbix可以处理多种类型的监控数据,相应地,trapper进程和poller进程也分为多种类型,每种类型负责收集不同的监控数据,所使用的数据采集方式也有所不同。

第8章讲述预处理进程和LLD进程。这两种进程使用trapper进程和poller进程所收集的原始监控数据作为输入,对原始数据进行预处理,或者根据原始数据更新配置信息。

第9章讲述history syncer进程如何将预处理之后的数据存储到数据库中,并对监控数据进行快速计算,以生成事件并处理事件。history syncer进程是Zabbix服务器端最核心的进程,如果没有该进程的存在,Zabbix将无法保存监控数据,无法生成事件,也无法进行告警。

第10章讲述在history syncer进程生成事件之后,escalator进程、alert进程族和task manager进程如何处理事件以及如何发送告警。

第11章讲述Zabbix如何通过各种渠道获取自身状态信息,包括进程繁忙率、数据量和缓存负载等。

第12章讲述Zabbix代理在Zabbix的整体架构中所承担的角色,以及Zabbix代理端所特有的一些进程是如何工作的。

第13章讲述Zabbix服务器端的各种进程如何访问数据库以及具体访问数据库中的哪些表。本章内容可以帮助读者有针对性地分析数据与进程之间的对应关系。

第14章主要讲述Zabbix java gateway的作用、内部工作机制以及该进程与java poller进程之间的交互。

第15章讲述Zabbix客户端的3种进程,即collector进程、listener进程和active checks进程的内部工作机制,以及用于扩展Zabbix客户端功能的可加载模块如何实现加载。

第16章讲述Zabbix客户端各种进程如何处理每一种监控项,从而实现监控数据的收集和上传。Zabbix客户端原生支持多种监控项,深入了解这些监控项的具体采集方式可以解决用户使用过程中的很多困惑。

第17章讲述Zabbix使用的C语言源码的编译和构建过程,并简要介绍在修改源码后应如何自定义编译和构建过程。当用户试图自己修改源码来扩展Zabbix功能时,对构建过程进行修改是必不可少的。

第18章讲述Zabbix Web API如何使用面向对象编程的方式实现其功能,包括各个类的职责与关系、所采用的设计模式、如何调用API以及如何扩展API。很多用户都通过API实现Zabbix与外部系统的集成,对该模块进行深入了解有助于提高监控系统的集成质量和效率。

第19章主要讲述Zabbix Web应用的MVC框架,并简要介绍了如何实现Zabbix Web应用的扩展。Zabbix Web应用是最近几个版本的Zabbix中变动最为显著和频繁的部分。

虽然作者在工作中经常需要分析Zabbix源码,但是在编写本书的过程中,仍然发现有些知识在之前并未涉猎。适逢Zabbix发布了最新的5.0版本,系统架构发生了一些变化。Zabbix服务器端增加了与底层发现、告警和同步相关的3种进程,而Zabbix中此前只有Zabbix服务器端具备的预处理能力也得到了进一步加强。此外,Web前端的功能更加丰富,Web后端也进行了大量调整。面对这些变化,作者接受出版社编辑的建议,决定基于最新的Zabbix 5.0进行写作。为了保障内容的准确性,作者对Zabbix 5.0的所有源码重新进行了梳理和再阅读。这一任务的工作量虽然不及全新阅读一遍源码,但是仍然需要逐一确认有哪些源码发生了变更以及新增了哪些源码和功能。

本书所引用的Zabbix源码以及对Zabbix源码的修改均遵从GPL-2.0协议。

本书萌芽于作者在民生银行的工作经历,在此要特别感谢民生银行的张帆先生。在很多研究领域中,提出问题比解决问题更重要。对本书而言,张帆先生就是那个不可或缺的提出问题的人,而本书是对张帆先生所提问题的部分解答和延伸。张帆先生勇敢尝试对Zabbix的全方位应用,他对民生银行Zabbix监控项目的有效把控以及对Zabbix的不懈探究,都激励作者对Zabbix进行更全面、更深入的了解,其沉稳严谨的工作作风亦令人钦佩。张帆先生也从整体写作逻辑的角度为本书提出了宝贵建议。

特别感谢美国Apple公司的陈源博士对本书的慷慨推荐和细致建议。陈博士在京东美国硅谷研发中心工作期间,作者曾有幸辅助陈博士带领的项目团队完成大规模容器集群资源利用效率的优化工作。虽然该项目只是陈博士所负责的众多项目之一,于作者而言却是非常重要的经历。陈博士对作者的鼓励弥足珍贵,让作者有更大的勇气前进。

非常感谢宏时数据为本书提供的支持和帮助。作者曾参加宏时数据组织的Zabbix峰会,受益良多。宏时数据的工作人员和社区认证专家就本书的写作提出了重要意见,并不吝推荐本书。本书有幸得到Zabbix社区签约专家张世宏先生的肯定,同时感谢海尔智家的Zabbix资深专家田川先生应宏时数据之邀对本书进行了全面细致的评阅并作序,田川先生对本书评价颇高,这令作者倍感荣幸。

由衷感谢京东物流技术发展部运维专家史季强先生。史季强先生是作者曾经的同事,他在运维方面的经验和专业水平一直令作者仰望。作者向史季强先生提出为本书写几句评语的请求后,他慷慨应允。最后史季强先生不但大力推荐本书,还围绕本书提出了重要建议,这些建议也是作者今后新的努力方向。

更要感谢Zabbix,本书能够成书全然地基于Zabbix本身近乎完美的设计和实现,以及其持续、快速的成长。

技术类图书的写作应以严谨为第一要务。在本书写作过程中,对于任何内容,作者均不敢妄下结论,总是力求多角度验证和多次确认,唯恐做出错误判断。在此也感谢人民邮电出版社刘雅思编辑在本书写作过程中所提供的大量意见和建议。

感谢所有为本书的构思和写作提供过帮助的人,这本书也属于你们。


鲍光亚,本科毕业于山东大学,精通Zabbix和Prometheus监控软件,对IT系统和服务监控软件有深入研究。他在2014年至2019年就职于京东,从事Zabbix监控系统的运维和相关开发工作,对分布式、并行软件开发和项目管理具有浓厚的兴趣。他在工作期间始终践行终身学习理念,不断充实和提高自己,在2012年获得了中国社会科学院研究生院MBA学位。作者个人邮箱为bgy.cn@outlook.com。


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受您的建议后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/ contribute即可)。

如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社数十年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端和网络技术等。

异步社区

微信服务号


本部分介绍Zabbix的底层工作机制,这些工作机制作用于Zabbix的所有进程之中。通过本部分的学习,读者将能够理解Zabbix各个进程运行在什么样的基础之上,会受到哪些方面的制约和规范;同时也能够明白Zabbix的底层机制如何为Zabbix各个进程提供支持,并将这些进程组织成一个有机的整体。


Zabbix是在全球被广泛应用的一种开源监控系统,是一种设计严谨的、基于多进程的分布式系统。Zabbix由多种组件构成,包括Zabbix服务器、Zabbix代理、Zabbix java gateway和Zabbix客户端。本章主要介绍Zabbix的总体架构。

监控系统是一个非常宽泛的概念。根据监控对象和监控目标的不同,监控系统完成的任务千差万别。不过,归根到底,监控系统是一个数据采集和处理系统,它为了采集和处理各种监控数据而存在。Zabbix就是为了监控计算机及网络基础设施和软件而设计的。

当监控对象越来越多时,监控系统的规模会变得越来越庞大,因此监控系统要具备大规模扩展的能力。当监控的内容变得越来越细化时,监控系统需要能够以足够快的速度采集并处理数据。随着存储的监控数据越来越多,人们希望从监控数据中获得一些有用的信息,这就要求监控系统能够对监控数据进行深入的分析。

假如未来的某一天,全球所有汽车都实现了自动驾驶。当不需要人类驾驶员驾驶汽车时,人类就需要利用数据对汽车进行监管。虽然汽车自身可以在终端完成对大量数据的处理,但是每辆汽车在其行驶过程中仍然需要将一定量的数据传输到交通监管平台进行集中处理,这些数据可能用于监管车辆行驶状况、预测交通拥堵以及避免交通事故等。按照全球10亿辆汽车的保有量计算,即便存在1 000个监管平台,平均下来,每个平台仍然需要为逾100万辆汽车提供服务。行驶中的汽车可能会把每次急刹车、每次紧急并线、每次异常颠簸、每次抛锚和每次人类介入的数据都发送到监管平台。其中,有些数据是需要实时处理的,还有一些数据可能只需要持久化存储,另外一些数据可能需要经过简单处理以后再进行存储。这种场景对监控数据传输的可靠性、监控数据处理的实时性以及监控系统整体的可靠性都提出了很高的要求。

监控系统的意义在于,人们可以用数据更精确地描述事物的变化。在监控系统的帮助下,世界的模糊性得以降低,准确性大幅提升,人们可以减少根据感觉做出决策的不安感,而更多地依赖数据做出决策,人们甚至不需要做出决策,因为系统会代替人们做出决定。

Zabbix包含多种组件,每种组件可以独立部署,组件内部采用多进程架构。这种结构设计使之非常便于实现分布式部署,也为架构调整打下了基础。Zabbix各组件之间的典型部署架构往往采用分层扩展模式,即每个Zabbix服务器(server)连接多个Zabbix代理(proxy),每个Zabbix代理进一步连接大量客户端(agent)(包括Zabbix客户端、SNMP客户端、JMX客户端和IPMI客户端),具体如图1-1所示。

图1-1 Zabbix各组件的典型部署架构

监控系统本质上是一个数据采集和处理系统,如果采集的数据的规模相对稳定,不会频繁波动,那么采用多进程架构是合适的,因为监控系统在这种情况下不需要动态地扩容和缩容,也就避免了频繁的进程创建和销毁。如果采集的数据的规模存在很大的波动,希望能够对监控系统进行动态扩容和缩容,那么采用多进程架构显然不太合适,因为进程的创建和销毁是很重的操作,频繁操作会产生较大开销。

Zabbix服务器是所有Zabbix组件中的核心,它负责最终接收监控数据并对数据进行计算,从而触发告警,并完成告警规则所触发的任务,包括发送通知和执行远程命令等,它还负责将监控数据写入数据库并进行持久化存储。

Zabbix服务器有多种进程,每种进程的数量可能是一个或者多个。Zabbix服务器的各个进程之间通过共享内存、Unix域套接字、信号、锁和信号量等机制进行协调和通信。代码清单1-1为某测试用Zabbix服务器的具体进程,每一个进程标题中的黑体部分为进程类型名,当同时存在多个同类型的进程时,进程类型名称后面会紧跟一个编号(例如timer #1)。在本例中,Zabbix共启动了21种进程。

代码清单1-1 Zabbix服务器的多进程

[root@VM-0-2-centos ~]# ps -ef|grep zabbix_server
zabbix    5554 17185  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server -f
zabbix    5556  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
configuration syncer [synced configuration in 0.142161 sec, idle 60 sec]
zabbix    5562  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
housekeeper [deleted 18929 hist/trends, 0 items/triggers, 132 events, 0 sessions,
0 alarms, 0 audit items, 0 records in 1.054934 sec, idle for 1 hour(s)]
zabbix    5563  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
timer #1 [updated 0 hosts, suppressed 0 events in 0.015839 sec, idle 59 sec]
zabbix    5564  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
http poller #1 [got 0 values in 0.004875 sec, idle 5 sec]
zabbix    5565  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
discoverer #1 [processed 1 rules in 0.022562 sec, idle 30 sec]
zabbix    5566  5554  0 14:18 pts/0    00:00:01 /usr/local/sbin/zabbix_server: 
history syncer #1 [processed 2 values, 2 triggers in 0.033340 sec, idle 1 sec]
zabbix    5567  5554  0 14:18 pts/0    00:00:02 /usr/local/sbin/zabbix_server: 
history syncer #2 [processed 0 values, 0 triggers in 0.000170 sec, idle 1 sec]
......
zabbix    5570  5554  0 14:18 pts/0    00:00:01 /usr/local/sbin/zabbix_server: 
escalator #1 [processed 0 escalations in 0.010427 sec, idle 3 sec]
zabbix    5571  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
proxy poller #1 [exchanged data with 0 proxies in 0.000286 sec, idle 5 sec]
zabbix    5572  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
self-monitoring [processed data in 0.000207 sec, idle 1 sec]
zabbix    5573  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
task manager [processed 0 task(s) in 0.004439 sec, idle 5 sec]
zabbix    5574  5554  0 14:18 pts/0    00:00:01 /usr/local/sbin/zabbix_server: 
poller #1 [got 0 values in 0.000366 sec, idle 1 sec]
zabbix    5575  5554  0 14:18 pts/0    00:00:01 /usr/local/sbin/zabbix_server: 
poller #2 [got 3 values in 0.997905 sec, idle 1 sec]
......
zabbix    5579  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
unreachable poller #1 [got 0 values in 0.000275 sec, idle 5 sec]
zabbix    5580  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
trapper #1 [processed data in 0.004273 sec, waiting for connection]
zabbix    5581  5554  0 14:18 pts/0    00:00:02 /usr/local/sbin/zabbix_server: 
trapper #2 [processed data in 0.006308 sec, waiting for connection]
......
zabbix    5585  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
icmp pinger #1 [got 0 values in 0.000219 sec, idle 5 sec]
zabbix    5586  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
alert manager #1 [sent 0, failed 0 alerts, idle 5.064280 sec during 5.064756 sec]
zabbix    5587  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
alerter #1 started
zabbix    5588  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
alerter #2 started
zabbix    5590  5554  0 14:18 pts/0    00:00:03 /usr/local/sbin/zabbix_server: 
preprocessing manager #1 [queued 0, processed 13 values, idle 5.004367 sec during 5.009661
sec]
zabbix    5591  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
preprocessing worker #1 started
zabbix    5592  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server:
preprocessing worker #2 started
zabbix    5594  5554  0 14:18 pts/0    00:00:00 /usr/local/sbin/zabbix_server: 
lld manager #1 [processed 0 LLD rules during 5.756562 sec]
zabbix    5595  5554  0 14:18 pts/0    00:00:02 /usr/local/sbin/zabbix_server: 
lld worker #1 [processed 1 LLD rules, idle 19.774921 sec during 20.021050 sec]
zabbix    5596  5554  0 14:18 pts/0    00:00:02 /usr/local/sbin/zabbix_server: 
lld worker #2 [processed 1 LLD rules, idle 19.749750 sec during 20.021420 sec]
zabbix    5597  5554  0 14:18 pts/0    00:00:01 /usr/local/sbin/zabbix_server: 
alert syncer [queued 0 alerts(s), flushed 0 result(s) in 0.012363 sec, idle 1 sec]

Zabbix服务器可以与Zabbix代理、Zabbix java gateway和Zabbix客户端进行远程通信,通信过程由poller进程和trapper进程负责。

Zabbix服务器在启动时创建共享内存,配置信息、监控数据和趋势数据等需要多个进程访问的数据会被存储到共享内存中。多个进程同时访问共享内存时,通过互斥锁和读写锁来实现访问的协调,避免冲突。Unix域套接字的使用则一定程度上减轻了共享内存的访问压力,它实现了一组关系紧密的进程之间的通信。

Zabbix服务器端众多种类的进程分别负责不同的任务,各进程相互之间会通过多种机制进行通信。图1-2所示为Zabbix服务器端进程、共享内存、Unix域套接字以及数据库之间的关系,本书介绍的所有Zabbix服务器进程都包含在图1-2中,在阅读本书后面章节的内容时,读者可对照图1-2进行理解。

图1-2 Zabbix服务器的内部架构

Zabbix代理(Zabbix proxy)可以被理解为去掉了底层发现(Low Level Discovery,LLD)进程(参见第8章)和告警功能的Zabbix服务器,它的作用是代替Zabbix服务器完成监控数据的采集和预处理工作,并将预处理后的监控数据批量发送到Zabbix服务器端,以这种方式分担Zabbix服务器端的压力。

Zabbix代理可以存在多个,并且支持主动模式和被动模式。在主动模式下,Zabbix代理主动发起连接,通过data sender进程和configuration syncer进程与Zabbix服务器进行通信。在被动模式下,Zabbix代理只负责通过trapper进程监听来自Zabbix服务器的连接请求[1]

Zabbix java gateway(简称ZJG)相当于一个Java管理扩展(Java Management Extensions,JMX)代理,它接收由Zabbix服务器端或Zabbix代理端的poller进程发送的消息,并按照消息内容向JMX远程服务器请求监控数据,再将获取的监控数据返还Zabbix服务器或Zabbix 代理。ZJG组件采用Java语言开发,在运行时采用线程池架构实现并发,可以与Zabbix服务器或Zabbix代理分别独立部署。

Zabbix客户端(Zabbix agent)通常运行在被监控的主机上,负责实际完成监控数据的采集,并将监控数据发送到Zabbix服务器或者Zabbix代理。Zabbix客户端也通过多进程架构来完成任务,包括collector、listener和active checks 3种进程。其中,collector进程是一种后台进程,负责对某些监控项进行持续的数据采集,采集的数据被存储在共享内存中,供listener进程和active checks进程使用。

Zabbix客户端同时支持主动型监控项和被动型监控项。因此,它既可以主动采集监控项,主动向Zabbix服务器或Zabbix代理发送数据,也可以接收Zabbix服务器或Zabbix代理的请求,被动地采集监控数据并返还请求方。主动型监控项由active checks进程处理,被动型监控项则由listener进程处理。

Zabbix agent 2是Zabbix 5.0版本新增的组件,使用Go语言开发。该组件很大程度上提高了Zabbix客户端的性能和并发能力。在Zabbix客户端中,active checks进程是唯一的,所以主动型监控项只能以串行方式逐个采集,当需要处理的主动型监控项较多时,会影响采集数据的及时性。而Zabbix agent 2实现了主动型监控项的并发采集,突破了Zabbix在这方面的性能限制。

随着每次新版本的发布,Zabbix服务器的技术架构也在不断演进。本节主要介绍Zabbix 2.2、Zabbix 3.0、Zabbix 4.0和Zabbix 5.0版本的Zabbix服务器技术架构。

在Zabbix 2.2版本中,Zabbix服务器端的进程共有20种,具体如下:

在Zabbix 2.2版本中,还没有采用Unix域套接字通信。另外,进程间协调所使用的锁机制还是信号量,而非互斥锁。

Zabbix 3.0版本的进程种类数比Zabbix 2.2版本少一个,删除了node watcher进程。从此版本开始,分布式部署只能使用代理方式。

在性能方面,Zabbix 3.0版本中的history syncer进程和配置信息缓存(ConfigCache)的访问性能得到了很大提升。escalator进程从原来的单进程修改为最多允许启动100个进程。缓存类型中则增加了历史数据索引缓存(HistoryIndexCache),提高了历史数据缓存(HistoryCache)的访问速度。

相较于Zabbix 3.0版本,Zabbix 4.0版本增加了告警管理者(alert manager)、ipmi manager、预处理管理者(preprocessing manager)、预处理工作者(preprocessing worker)和任务管理者(task manager)共5种进程。alert manager进程与alerter进程协作,用于发送告警消息。ipmi manager进程与ipmi poller进程协作实现IPMI监控项的数据采集。相较于Zabbix 3.0版本,Zabbix 4.0版本增加了非常重要的监控数据预处理功能,使用两种预处理(preprocessing)进程实现对监控数据的预处理。task manager进程则从其他进程中接管了对远程命令的处理。此外,对触发器表达式中的时间函数的计算也从timer进程转移到history syncer进程中。可见这个版本在进程功能划分方面进行了较大的调整。

在进程间通信方面,Zabbix 4.0版本引入了基于Unix域套接字的进程间通信(Interprocess Communication,IPC)服务机制。上面提到的管理者(manager)进程和工作者(worker)进程之间的通信均采用进程间通信服务机制。进程间协调所一直使用的信号量机制在Zabbix 4.0版本中也改为采用pthread互斥锁和读写锁的方式,从而提高了进程的性能。

在进程种类数方面,相较于Zabbix 4.0版本,Zabbix 5.0版本增加了lld manager、lld worker和alert syncer 3种进程。其中,lld manager进程和lld worker进程协作,完成对LLD监控项的处理,从而提高了LLD功能方面的处理能力;alert syncer进程用于将数据库中的告警消息同步到alert manager进程,在一定程度上缓解了alert manager进程的压力。

此外,在Zabbix 5.0版本中,preprocessing manager进程和preprocessing worker进程可以运行在Zabbix代理端,减轻了大量预处理任务给Zabbix服务器带来的压力。

本章讲述了Zabbix的多种组件构成,包括Zabbix服务器、Zabbix代理、Zabbix java gateway、Zabbix客户端(Zabbix agent)以及Zabbix agent 2。这些组件分别担任不同的角色,组件之间通过分工协作来完成整体的监控任务。

Zabbix服务器作为核心组件,总体上一直沿用多进程架构,但是在多进程的基础上仍然发生了多次系统架构的演变。从早期的Zabbix 2.2版本到最近的Zabbix 5.0版本,Zabbix的进程种类数逐渐增加,功能也更加丰富;此外,Zabbix服务器与Zabbix代理之间的功能分配也进行了一些调整,达到了更好的均衡。

[1] Zabbix代理的主动与被动模式是相对于Zabbix服务器来讲的。


相关图书

推荐系统:产品与算法解析
推荐系统:产品与算法解析
程序员的制胜技
程序员的制胜技
面向电子鼻的复合光气体传感方法
面向电子鼻的复合光气体传感方法
程序设计竞赛专题挑战教程
程序设计竞赛专题挑战教程
Serverless核心技术和大规模实践
Serverless核心技术和大规模实践
深入浅出Windows API程序设计:编程基础篇
深入浅出Windows API程序设计:编程基础篇

相关文章

相关课程