深入理解Zabbix监控系统
上QQ阅读APP看书,第一时间看更新

前 言

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本身近乎完美的设计和实现,以及其持续、快速的成长。

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

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