
前言
2015年我在为公司做技术选型时就觉得有必要写一本全面介绍ELK的图书,因为彼时在国内图书市场上很难找到一本全面介绍ELK的书籍。但由于那时我正在创业,而后又加入了阿里巴巴,繁忙的工作使我根本没法腾出时间编写。但在此期间ELK却一直在以惊人的速度成长着,从Beats组件的加入到ELK更名为Elastic Stack,ELK在国内外的应用越来越广泛。与此形成鲜明对比的是,许多从事传统软件研发的编程人员和架构师对于大数据处理、全文检索等领域的知识还缺乏最基本的认识。2018年Elastic公司挂牌上市让更多的人知道了ELK,许多在软件行业工作的朋友纷纷向我问询ELK的相关知识。此时,我刚刚好有了一些空闲时间,所以最终下定决心开始编写本书。希望能借本书让更多的研发人员了解ELK及其背后的原理,让人们在大数据处理与应用中少走一些弯路。
由于ELK也是刚刚更名为Elastic Stack,中间还曾经叫过ELK Stack,所以ELK这个名称在国内的接受程度要远高于Elastic Stack。虽然使用ELK可能更利于本书在读者群中的传播,但为了与官方称谓保持一致,本书最终仍以Elastic Stack称呼这一套组件。不仅如此,为了保证本书的权威性,书中所述内容均与Elastic官方叙述保持一致。书中所有示例也都经过了实际验证,以保证它们可以在相应的环境中无误地运行。
无论以何种名称称呼这套组件,它们现在主要都是指代Elasticsearch、Logstash、Kibana和Beats等组件。它们是本书介绍的主要内容,并且天然地将本书划分为五大部分。
第一部分是本书第1章,主要从整体上介绍Elastic Stack家族成员,并且讲解了这些组件的安装和基本使用方法。虽然第一部分只有一章,但这一章是后续章节的基础。在这一部分中介绍了Elastic Stack的几种应用场景,并根据其中一个场景搭建了一套分布式的日志收集和存储系统。这套系统从整体上展示了Elastic Stack组件之间的协作,同时本书后续章节所有示例也都是基于这套系统。所以,读者最好按照该章介绍将这个系统完整地搭建起来,以保证后续章节的学习可以顺利展开。
第二部分是本书第2~8章,主要介绍了Elasticsearch的原理和应用。如果读者对Elasticsearch没有任何了解,建议一定要好好研读一下第2章。这一章将Elasticsearch的基本原理和重要概念做了非常详细的讲解,这包括全文检索与倒排索引的理论知识,以及在Elasticsearch中非常重要的索引、映射和文档等基本概念。除此之外,还有Elasticsearch支持大数据存储与容错的分片、副本等技术,它们是Elasticsearch能够高效且可靠运行的重要基石。第3、4章主要介绍Elasticsearch对外提供的REST接口,其中第3章介绍的主要是操作索引和文档的接口,而第4章介绍的则都是与文档检索相关的接口。第5、6章介绍的是在文档检索中使用的查询语言DSL,而第7章介绍的则是可以用于统计分析的聚集查询。此外,Elasticsearch还定义了一些比较特殊的数据类型,这些数据类型的DSL与聚集查询都有专门的用法,所以第8章将它们集中在一起讲解。Elasticsearch是Elastic Stack中的核心成员,在应用上相对于其他组件也更复杂一些,希望读者能够按照书中给出的示例耐心研习。
第三部分是本书第9~11章,主要介绍Kibana的文档发现、可视化、仪表盘和画布等功能。Kibana就像是Elasticsearch的图形化界面一样,可通过它操作Elasticsearch中的数据。第9章介绍的文档发现对应于Elasticsearch中的DSL,而第10章介绍的文档可视化则基于聚集查询。在第11章介绍的综合展示中,仪表盘由文档发现和文档可视化自由组合而成,而画布等功能则提供了更为丰富多彩的数据展示形式。Kibana使用起来并不难,但它却可以通过极为简单的配置操作将数据直观地展示出来。通过这些直观的展示,用户可以挖掘出深藏在数据背后的信息。
第四部分是本书第12~14章,主要介绍Logstash体系结构及四种插件。第12章介绍了Logstash的整体结构,以及其中的编解码器插件。由于Logstash输入插件与输出插件有许多相似之处,所以在第13章中按类型对它们统一做了介绍。由于过滤器插件种类繁多且完全独立于输入输出插件,所以在第14章中单独介绍。Logstash插件种类繁多,掌握好这些插件可以解决很多数据处理中的棘手问题。
第五部分是本书第15~16章,主要介绍Beats组件的共同框架Libbeat以及不同Beats类型的输入组件。第15章除了介绍Beats体系结构以外,还介绍了在Libbeat框架中实现的共有组件,这主要是处理器组件和输出组件。第16章则对Beats主要类型的输入组件做了介绍,包括Packetbeat、Filebeat、Metricbeat、Heartbeat、Auditbeat、Winlogbeat和Journalbeat等。Beats组件使用起来并不复杂,它们的出现极大地扩充了Elastic Stack的应用领域。
由于本书涉及的内容非常庞杂,其中的每一个组件其实都可以独立成书。所以要想在一本书中将它们全部讲解清楚,对我来说也是一个非常巨大的挑战。为了减少篇幅并方便读者学习,我在编写本书时将各种组件的知识做了合理的归纳和总结,将具有相似性的知识放在一起讲解以方便读者比较和记忆。此外,我还希望本书能够成为开发人员的一本参考手册,可以放在手边随时查看。所以在编写此书时,我尽可能地将所有涉及内容都讲解到,并以表格和示例的形式将它们罗列出来。但毕竟内容太过庞杂,有些内容因此也就没办法展开详细讲解,希望读者能够体谅。
为了节省篇幅,书中一些示例只展示了核心内容。比如在讲解Elasticsearch时,多数REST请求的示例都没有展示它们的返回结果,这需要读者自己动手在Kibana开发工具中执行查看。还有在Logstash、Beat等章节中讲解的配置文件也只列出了关键内容,需要读者自行补充完整。比如在讲解Logstash管道配置时,有相当一部分示例只列出了所要讲解插件的配置,读者在试验时要根据已经讲解的内容将其他必要插件补充完整。不过相信只要读者认真研读了章节的内容,这些补充工作就不会太复杂。总之,实践出真知,希望读者在研读的过程中一定要亲自动手操作,这样才能真正掌握所学内容。
另外需要说明的一点是,由于查询、检索和搜索这三个词在汉语中的含义基本相同,所以我在编写本书时做了一些区分。简单来说就是检索对应全文检索,查询对应关系型数据库,而搜索一般只在搜索引擎一词中出现。为了与人们的习惯保持一致,在全文检索的一些名词中也会使用查询,比如查询语句、查询条件等。尽管我在编写本书时已经尽可能做了区分,但由于本书篇幅巨大而不可避免地会出现一些混乱。如果确有让读者感到困惑的地方,可以将这三个词视为相同的含义。
最后要感谢我的父亲、妻子和一对儿女,由于编写此书几乎占据了我所有业余时间,陪伴他们的时间少了很多。感谢他们在此期间给予我的理解和照顾,最终才使本书得以顺利结稿。还要感谢为本书最终出版做了大量工作的编辑,是他们辛勤的付出让这本书提早问世。希望本书能够帮助正在学习或使用Elastic Stack的读者,可以更轻松、更全面地掌握这一家族中的组件。Elastic Stack的大门已经开启,快开始你的神奇旅程吧!
田雪松
2019年8月于北京