《Elastic Stack应用宝典》而系统地介绍了Elastic Stack应用与开发。Elastic Stack由一组处理和分析全文数据的组件构成,在日志、监控等领域中都有着广泛应用。本书在分析了Elastic Stack体系结构的基础之上,对Elastic Stack中的Elasticsearch、Logstash、Kibana和Beats组件分章节做了详细介绍。在讲解这些组件时,还列举了大量的应用实例,使读者可以在实践操作中迅速掌握这些组件的使用方法。
本书以Elastic Stack*新发布的版本7为基础编写,介绍了Elastic Stack中引入的新技术和新变化。本书适于有一定开发基础的软件编程人员,也可以做为架构师和运维人员的参考资料。
集中式日志分析平台Elastic Stack7.0全方位应用指南;
经典ELK Stack的全新版本;
70万字,Elasticsearch、Logstash、Kibana、Beats四大组件全收录;
370余段实例展示,循序渐进教你搭建自己的数据分析平台;
开发人员必备!
前 言
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的大门已经开启,快开始你的神奇旅程吧!
田雪松,北京航空航天大学硕士研究生,软件研发专家。深耕软件行业十多年,精通多种编程语言,并在中间件、微服务、大数据等方面有着丰富实战经验。参与过银行、石油、通信、卫生、安全等诸多领域的软件研发。曾主持设计和开发了多套互联网应用,一些应用在国内至今仍保持领先地位。曾为国内外众多知名企业进行研发技术专业培训,并实际参与到部分企业实际问题的解决当中,形成了较为完善的知识与实践讲授方法。
前言
第1章 初识Elastic Stack
1.1 从ELK到Elastic Stack
1.1.1 历史
1.1.2 版本演变
1.1.3 许可授权
1.1.4 应用场景
1.2 Elasticsearch概览
1.2.1 安装与配置
1.2.2 体验Elasticsearch
1.3 Kibana概览
1.3.1 安装与配置
1.3.2 连接Elasticsearch
1.3.3 体验Kibana
1.3.4 导入样例数据
1.4 Logstash概览
1.4.1 安装Logstash
1.4.2 启动Logstash
1.4.3 连接Elasticsearch
1.5 Beats概览
1.5.1 安装Filebeats
1.5.2 配置Filebeat
1.5.3 启动Filebeat
1.6 本章小结
第2章 Elasticsearch原理与实现
2.1 全文检索与倒排索引
2.1.1 全文检索
2.1.2 倒排索引
2.1.3 Elasticsearch索引
2.1.4 Elasticsearch映射
2.2 文档字段
2.2.1 字段索引
2.2.2 字段存储
2.2.3 字段参数
2.2.4 元字段
2.2.5 字段限制
2.3 字段数据类型
2.3.1 核心类型
2.3.2 衍生类型
2.3.3 多数据类型
2.4 分片与复制
2.4.1 分片与集群
2.4.2 路由
2.4.3 容量规划
2.4.4 副本
2.5 客户端API概览
2.5.1 REST接口
2.5.2 Painless脚本
2.5.3 Java API
2.6 本章小结
第3章 Elasticsearch索引与文档
3.1 索引别名与配置
3.1.1 索引别名
3.1.2 索引配置
3.2 动态映射与索引模板
3.2.1 动态字段
3.2.2 动态模板
3.2.3 索引模板
3.2.4 _mapping接口
3.3 容量控制与缓存机制
3.3.1 _split接口
3.3.2 _shrink接口
3.3.3 _reindex接口
3.3.4 缓存机制
3.3.5 查看运行状态
3.4 操作文档
3.4.1 索引文档
3.4.2 获取文档
3.4.3 删除文档
3.4.4 更新文档
3.4.5 批量操作
3.5 本章小结
第4章 Elasticsearch分析与检索
4.1 _search接口
4.1.1 基于URI
4.1.2 基于请求体
4.2 分页与排序
4.2.1 from/size参数
4.2.2 scroll参数
4.2.3 search_after参数
4.2.4 sort参数
4.3 字段投影
4.3.1 _source参数
4.3.2 stored_fields参数
4.3.3 docvalue_fields参数
4.3.4 script_fields参数
4.4 分析器与规整器
4.4.1 设置分析器
4.4.2 _analyze接口
4.4.3 _termvectors接口
4.4.4 规整器
4.5 内置分析器与中文分析器
4.5.1 standard分析器
4.5.2 stop分析器
4.5.3 pattern分析器
4.5.4 custom分析器
4.5.5 其它内置分析器
4.5.6 中文分析器
4.6 其它检索接口
4.6.1 _count接口
4.6.2 _msearch接口
4.6.3 _scripts接口
4.6.4 辅助接口
4.7 本章小结
第5章 叶子查询与模糊查询
5.1 基于词项的查询
5.1.1 term、terms和terms_set
5.1.2 range与exists
5.1.3 使用模式匹配
5.1.4 type与ids
5.1.5 停止词与common查询
5.2 基于全文的查询
5.2.1 词项匹配
5.2.2 短语匹配
5.2.3 查询字符串
5.2.4 间隔查询
5.3 模糊查询与纠错提示
5.3.1 Levenshtein与NGram
5.3.2 模糊查询
5.3.3 纠错与提示
5.4 本章小结
第6章 相关性评分与组合查询
6.1 相关性评分
6.1.1 相关度模型
6.1.2 TF/IDF
6.1.3 BM25
6.1.4 相关度解释
6.1.5 相关度权重
6.2 组合查询与相关度组合
6.2.1 bool组合查询
6.2.2 dis_max组合查询
6.2.3 constant_score查询
6.2.4 boosting查询
6.2.5 function_score查询
6.2.6 相关度组合
6.3 本章小结
第7章 聚集查询
7.1 度量聚集
7.1.1 平均值聚集
7.1.2 计数聚集与极值聚集
7.1.3 统计聚集
7.1.4 百分位聚集
7.2 使用范围分桶
7.2.1 数值范围
7.2.2 间隔范围
7.2.3 聚集嵌套
7.3 使用词项分桶
7.3.1 terms聚集
7.3.2 significant_terms聚集
7.3.3 significant_text聚集
7.3.4 样本
7.4 单桶聚集与聚集组合
7.4.1 单桶聚集
7.4.2 聚集组合
7.4.3 邻接矩阵
7.5 管道聚集
7.5.1 基于兄弟聚集
7.5.2 基于父聚集
7.5.3 矩阵聚集
7.6 本章小结
第8章 处理特殊数据类型
8.1 父子关系
8.1.1 join类型
8.1.2 has_child查询
8.1.3 has_parent查询
8.1.4 parent_id查询
8.1.5 children聚集
8.1.6 parent聚集
8.2 嵌套类型
8.2.1 nested类型
8.2.2 nested查询
8.2.3 nested聚集
8.3.4 reverse_nested聚集
8.3 处理地理信息
8.3.1 GeoHash
8.3.2 地理类型字段
8.3.3 geo_shape查询
8.3.4 geo_bounding_box查询
8.3.5 geo_distance查询
8.3.6 geo_polygon查询
8.3.7 geohash_grid与geo_distance
8.4 使用SQL语言
8.4.1 _sql接口
8.4.2 SQL语法
8.4.3 操作符与函数
8.5 本章小结
第9章 Kibana文档发现
9.1 索引模式
9.1.1 创建索引模式
9.1.2 管理模式字段
9.2 时间范围与过滤器
9.2.1 数据发现界面结构
9.2.2 使用时间过滤文档
9.2.3 自定义过滤器
9.3 使用查询语言
9.3.1 修改查询语言
9.3.2 使用Lucene语言
9.3.3 使用KQL语言
9.3.4 查询对象
9.4 文档展示与字段过滤
9.4.1 柱状图
9.4.2 文档展示
9.4.3 添加过滤器
9.4.4 分享
9.5 本章小结
第10章 Kibana文档可视化
10.1 二维坐标图
10.1.1 面积图
10.1.2 折线图与柱状图
10.1.3 度量叠加
10.1.4 桶型叠加
10.2 圆形与弧形
10.2.1 饼图配置
10.2.2 饼图叠加
10.2.3 目标
10.2.4 仪表
10.3 热度
10.3.1 热力图
10.3.2 标签云
10.3.3 坐标地图
10.3.4 区域地图
10.4 表格与控件
10.4.1 表格
10.4.2 控件
10.5 本章小结
第11章 Kibana综合展示
11.1 仪表盘
11.1.1 创建仪表盘
11.1.2 控件作用
11.1.3 分享
11.2 画布
11.2.1 使用workpad
11.2.2 管理图片资源
11.2.3 添加数据元素
11.3 监控
11.3.1 开启监控
11.3.2 查看监控图表
11.4 地图
11.4.1 叠加图层
11.4.2 使用聚集
11.4.3 矢量图层
11.5 本章小结
第12章 Logstash结构与配置
12.1 Logstash体系结构
12.1.1 插件
12.1.2 事件
12.1.3 队列
12.1.4 Logstash监控
12.2 管道配置
12.2.1 主管道配置
12.2.2 单管道配置
12.2.3 多管道配置
12.3 编解码器插件
12.3.1 plain编解码器
12.3.2 按行编解码
12.3.3 JSON编解码
12.3.4 序列化编解码
12.3.5 collectd编解码
12.3.6 cef编解码
12.4 本章小结
第13章 输入与输出
13.1 beats与elasticsearch
13.1.1 beats插件
13.1.2 elasticsearch插件
13.1.3 dead_letter_queue插件
13.2 面向文件的插件
13.2.1 事件属性
13.2.2 读取模式
13.2.3 SinceDB
13.2.4 多文件
13.2.5 配置参数
13.2.6 文件输出插件
13.3 面向关系型数据库的插件
13.3.1 连接与语句
13.3.2 执行状态
13.3.3 配置参数
13.4 面向消息中间件的插件
13.4.1 Kafka插件
13.4.2 Redis插件
13.4.3 RabbitMQ插件
13.5 面向通信协议的插件
13.5.1 TCP协议
13.5.2 HTTP协议
13.5.3 UDP协议
13.5.4 IMAP与SMTP协议
13.6 其它插件
13.6.1 执行命令
13.6.2 自动生成
13.6.3 云服务
13.6.4 未绑定插件
13.7 本章小结
第14章 过滤器
14.1 全文数据结构化
14.1.1 grok过滤器
14.1.2 dissect过滤器
14.2 处理半结构化文本
14.2.1 json过滤器
14.2.2 xml过滤器
14.2.3 csv过滤器
14.2.4 kv过滤器
14.3 事件聚集
14.3.1 task_id与code
14.3.2 map与map_meta
14.3.3 其它参数
14.4 使用外部资源
14.4.1 Elasticsearch
14.4.2 JDBC
14.4.3 IP地址
14.4.4 Memcached
14.4.5 HTTP
14.5 数据转换
14.5.1 mutate过滤器
14.5.2 de_dot过滤器
14.5.3 translate过滤器
14.5.4 date过滤器
14.5.5 urldecode与useragent
14.6 数据添加与删除
14.6.1 uuid与fingerprint
14.6.2 cidr过滤器
14.6.3 产生事件
14.6.4 截取
14.6.5 删除
14.6.6 限流
14.6.7 其它过滤器
14.7 本章小结
第15章 Beats原理与结构
15.1 Beats体系结构
15.1.1 共有组件
15.1.2 Beats配置
15.1.3 Beats与Kibana
15.2 Beats处理器
15.2.1 添加逻辑信息
15.2.2 添加基础信息
15.2.3 添加云信息
15.2.4 删除数据
15.2.5 转换数据
15.3 Beats输出组件
15.3.1 输出到Elasticsearch
15.3.2 输出到Logstash
15.3.3 输出到Kafka
15.3.4 输出到Redis
15.3.5 输出到文件
15.4 本章小结
第16章 输入组件
16.1 网络通信
16.1.1 安装配置
16.1.2 通信协议
16.1.3 通信流程
16.1.4 本地进程
16.1.5 事件属性
16.2 文件数据
16.2.1 输入类型
16.2.2 模块
16.2.3 文件读取
16.3 度量数据
16.3.1 Metricbeat
16.3.2 Heartbeat
16.3.3 Uptime
16.4 操作系统信息
16.4.1 Auditbeat
16.4.2 Journalbeat
16.4.3 Winlogbeat
16.5 本章小结