《Elasticsearch实战与原理解析》原文和代码下载

1. 摘要

本文是牛冬的 《Elasticsearch实战与原理解析》的读书笔记。电子书还是看文字类的舒服,可以在PC上阅读,也可以在手机上阅读。看文章最后,提供原文链接和源代码链接。

目录如下:
第一部分 Elasticsearch 前传
第1 章 搜索技术发展史 2
1.1 正说搜索技术发展史 2
1.2 Elasticsearch 简介 . 5
1.3 Lucene 简介 . 5
1.4 知识点关联 . 7
1.5 小结 . 15

第2 章 搜索技术基本知识 16
2.1 数据搜索方式 . 16
2.2 搜索引擎工作原理 17
2.3 网络爬虫工作原理 18
2.4 网页分析 . 20
2.5 倒排索引 . 23
2.6 结果排序 . 26
2.7 中文分词实战 . 27
2.7.1 Ansj 中文分词 . 27
2.7.2 Jcseg 轻量级 Java 中文分词器 . 30
2.8 知识点关联 . 38
2.9 小结 . 39

第二部分 Elasticsearch 实战
第3 章 初识Elasticsearch 42
3.1 Elasticsearch 简介 . 42
3.2 Elasticsearch 的安装与配置 43
3.2.1 安装Java 环境 . 43
3.2.2 Elasticsearch 的安装 47
3.2.3 Elasticsearch 的配置 52
3.3 Elasticsearch 的核心概念 . 60
3.4 Elasticsearch 的架构设计 . 62
3.4.1 Elasticsearch 的节点自动发现机制 64
3.4.2 节点类型 66
3.4.3 分片和路由 66
3.4.4 数据写入过程 67
3.5 知识点关联 . 70
3.6 小结 . 75

第4 章 初级客户端实战 76
4.1 初级客户端初始化 76
4.2 提交请求 . 83
4.3 对请求结果的解析 89
4.4 常见通用设置 . 91
4.5 高级客户端初始化 95
4.6 创建请求对象模式 98
4.7 知识点关联 . 98
4.8 小结 . 100

第5 章 高级客户端文档实战一 . 101
5.1 文档 . 102
5.2 文档索引 . 103
5.3 文档索引查询 . 114
5.4 文档存在性校验 . 118
5.5 删除文档索引 . 121
5.6 更新文档索引 . 125
5.7 获取文档索引的词向量 131
5.8 文档处理过程解析 138
5.8.1 文档的索引过程 138
5.8.2 文档在文件系统中的处理过程 140
5.9 知识点关联 . 145
5.10 小结 . 146

第6 章 高级客户端文档实战二 . 147
6.1 批量请求 . 148
6.2 批量处理器 . 154
6.3 MultiGet 批量处理实战 158
6.4 文档ReIndex 实战 164
6.5 文档查询时更新实战 171
6.6 文档查询时删除实战 176
6.7 获取文档索引的多词向量 180
6.8 文档处理过程解析 185
6.8.1 Elasticsearch 文档分片存储 185
6.8.2 Elasticsearch 的数据分区 187
6.9 知识点关联 . 188
6.10 小结 . 189

第7 章 搜索实战 . 190
7.1 搜索API 191
7.2 滚动搜索 . 208
7.3 批量搜索 . 220
7.4 跨索引字段搜索 . 228
7.5 搜索结果的排序评估 235
7.6 搜索结果解释 . 243
7.7 统计 . 251
7.8 搜索过程解析 . 258
7.8.1 对已知文档的搜索 258
7.8.2 对未知文档的搜索 259
7.8.3 对词条的搜索 260
7.9 知识点关联 . 262
7.10 小结 . 262

第8 章 索引实战 . 263
8.1 字段索引分析 . 264
8.2 创建索引 . 271
8.3 获取索引 . 277
8.4 删除索引 . 282
8.5 索引存在验证 . 285
8.6 打开索引 . 289
8.7 关闭索引 . 292
8.8 缩小索引 . 296
8.9 拆分索引 . 299
8.10 刷新索引 . 303
8.11 Flush 刷新 306
8.12 同步Flush 刷新 . 310
8.13 清除索引缓存 . 314
8.14 强制合并索引 . 317
8.15 滚动索引 . 322
8.16 索引别名 . 326
8.17 索引别名存在校验 330
8.18 获取索引别名 . 333
8.19 索引原理解析 . 337
8.19.1 近实时搜索的实现 337
8.19.2 倒排索引的压缩 337
8.20 知识点关联 . 338
8.21 小结 . 339

第三部分 Elasticsearch 生态
第9 章 Elasticsearch 插件 342
9.1 插件简介 . 342
9.2 插件管理 . 343
9.3 分析插件 . 346
9.3.1 分析插件简介 346
9.3.2 Elasticsearch 中的分析插件 347
9.3.3 ICU 分析插件 349
9.3.4 智能中文分析插件 360
9.4 API 扩展插件 367
9.5 监控插件 . 368
9.6 数据提取插件 . 368
9.7 常用插件实战 . 369
9.7.1 Head 插件 369
9.7.2 Cerebro 插件 385
9.8 知识点关联 . 393
9.9 小结 . 394

第10 章 Elasticsearch 生态圈 395
10.1 ELK 395
10.1.1 Elastic Stack . 395
10.1.2 Elastic Stack 版本的由来 396
10.1.3 ELK 实战的背景 . 397
10.1.4 ELK 的部署架构变迁 . 397
10.2 Logstash . 400
10.2.1 Logstash 简介 400
10.2.2 Logstash 的输入模块 402
10.2.3 Logstash 过滤器 403
10.2.4 Logstash 的输出模块 404
10.3 Kibana 405
10.3.1 Kibana 简介 . 405
10.3.2 连接Elasticsearch 406
10.4 Beats 410
10.4.1 Beats 简介 410
10.4.2 Beats 轻量级设计的实现 412
10.4.3 Beats 的架构 412
10.5 知识点关联 . 413
10.6 小结 . 414

第一部分 Elasticsearch 前传

第1 章 搜索技术发展史

(1)Elasticsearch基于Java编写,其内部使用Lucene做索引与搜索。

(2)2019年4月10日,Elasticsearch发布了7.0版本。该版本的重要特性包含引入内存断路器、引入Elasticsearch的全新集群协调层——Zen2、支持更快的前k个查询、引入Function score 2.0等。

第2 章 搜索技术基本知识

3,第二部分 Elasticsearch 实战

第3 章 初识Elasticsearch

(1)如何检查Elasticsearch是否已运行正确?

curl http://localhost:29200
{
 "name" : "node-1",
 "cluster_name" : "my-es",
 "cluster_uuid" : "xbE6G3BcQQKcQwCT8tWI_A",
 "version" : {
 "number" : "6.6.0",
 "build_flavor" : "default",
 "build_type" : "tar",
 "build_hash" : "a9861f4",
 "build_date" : "2019-01-24T11:27:09.439740Z",
 "build_snapshot" : false,
 "lucene_version" : "7.6.0",
 "minimum_wire_compatibility_version" : "5.6.0",
 "minimum_index_compatibility_version" : "5.0.0"
 },
 "tagline" : "You Know, for Search"
}

(2)安全设置elasticsearch.keystore

有些设置是敏感的,依赖文件系统权限来保护它们的值是不够的。对于这个用例,Elasticsearch提供了一个密钥存储库和一个Elasticsearch -keystore工具来管理密钥存储库中的设置。

注意:elasticsearch密钥库目前只提供混淆。未来将增加密码保护。

帮助文档:

../bin/elasticsearch-keystore --help
A tool for managing settings stored in the elasticsearch keystore
​
Commands
--------
create - Creates a new elasticsearch keystore
list - List entries in the keystore
add - Add a string setting to the keystore
add-file - Add a file setting to the keystore
remove - Remove a setting from the keystore

创建密钥存储库

使用create命令来创建elasticsearch.keystore

bin/elasticsearch-keystore create

文件elasticsearch.keystore将创建于elasticsearch.yml的目录位置。

列出密钥存储库中的设置

可以通过list命令获得密钥存储库中的设置列表:

bin/elasticsearch-keystore list

添加字符串设置

可以使用add命令添加敏感的字符串设置,比如云插件的身份验证凭据:

bin/elasticsearch-keystore add the.setting.name.to.set

该工具将提示设置的值。要通过stdin传递该值,请使用--stdin标志:

cat /file/containing/setting/value | bin/elasticsearch-keystore add --stdin the.setting.name.to.set

删除设置

要从密钥库中删除设置,请使用remove命令:

bin/elasticsearch-keystore remove the.setting.name.to.remove

(3)Elasticsearch的核心概念

Elasticsearch的核心概念有Node、Cluster、Shards、Replicas、Index、Type、Document、Settings、Mapping和Analyzer,其含义分别如下所示。

Node

即节点。节点是组成Elasticsearch集群的基本服务单元,集群中的每个运行中的Elasticsearch服务器都可称之为节点。

Cluster

即集群。Elasticsearch的集群是由具有相同cluster.name (默认值为elasticsearch)的一个或多个Elasticsearch节点组成的,各个节点协同工作,共享数据。同一个集群内节点的名字不能重复,但集群名称一定要相同。

在Elasticsearch集群中,节点的状态有Green、Yellow和Red三种,分别如下所述。

① Green:绿色,表示节点运行状态为健康状态。所有的主分片和副本分片都可以正常工作,集群100%健康。

② Yellow:黄色,表示节点的运行状态为预警状态。所有的主分片都可以正常工作,但至少有一个副本分片是不能正常工作的。此时集群依然可以正常工作,但集群的高可用性在某种程度上被弱化。

③ Red:红色,表示集群无法正常使用。此时,集群中至少有一个分片的主分片及它的全部副本分片都不可正常工作。虽然集群的查询操作还可以进行,但是也只能返回部分数据(其他正常分片的数据可以返回),而分配到这个有问题分片上的写入请求将会报错,最终导致数据丢失。

Shards

即分片。当索引的数据量太大时,受限于单个节点的内存、磁盘处理能力等,节点无法足够快地响应客户端的请求,此时需要将一个索引上的数据进行水平拆分。拆分出来的每个数据部分称之为一个分片。一般来说,每个分片都会放到不同的服务器上。

进行分片操作之后,索引在规模上进行扩大,性能上也随之水涨船高的有了提升。Elasticsearch依赖Lucene,Elasticsearch中的每个分片其实都是Lucene中的一个索引文件,因此每个分片必须有一个主分片和零到多个副本分片。

在Elasticsearch中,默认为一个索引创建5个主分片,并分别为每个主分片创建一个副本。

Replicas

即备份,也可称之为副本。副本指的是对主分片的备份,这种备份是精确复制模式。每个主分片可以有零个或多个副本,主分片和备份分片都可以对外提供数据查询服务。当构建索引进行写入操作时,首先在主分片上完成数据的索引,然后数据会从主分片分发到备份分片上进行索引。

当主分片不可用时,Elasticsearch会在备份分片中选举出一个分片作为主分片,从而避免数据丢失。

Index

即索引。在Elasticsearch中,索引由一个和多个分片组成。在使用索引时,需要通过索引名称在集群内进行唯一标识。

Type

即类别。类别指的是索引内部的逻辑分区,通过Type的名字在索引内进行唯一标识。在查询时如果没有该值,则表示需要在整个索引中查询。

Document

即文档。索引中的每一条数据叫作一个文档,与关系数据库的使用方法类似,一条文档数据通过_id在Type内进行唯一标识。

Settings

Settings是对集群中索引的定义信息,比如一个索引默认的分片数、副本数等。

Mapping

Mapping表示中保存了定义索引中字段(Field)的存储类型、分词方式、是否存储等信息,有点类似于关系数据库(如MySQL)中的表结构信息。

在Elasticsearch中,Mapping是可以动态识别的。如果没有特殊需求,则不需要手动创建Mapping,因为Elasticsearch会根据数据格式自动识别它的类型。一个索引的Mapping一旦创建,若已经存储了数据,就不可修改了。

Analyzer

Analyzer表示的是字段分词方式的定义。一个Analyzer通常由一个Tokenizer和零到多个Filter组成。在Elasticsearch中,默认的标准Analyzer包含一个标准的Tokenizer和三个Filter,即Standard Token Filter、Lower Case Token Filter和Stop TokenFilter。

(4)Elasticsearch的架构设计

ES架构图.png

我们将Elasticsearch的架构自底向上分为五层,分别是核心层、数据处理层、发现与脚本层、协议层和应用层。

发现与脚本层主要是Discovery(节点发现)模块、Script(脚本)模块和第三方插件模块。Discovery模块是Elasticsearch自动发现节点的机制。Script模块支持脚本的执行,脚本的应用使得我们能很方便的对查询出来的数据进行加工处理,目前Elasticsearch支持JavaScript、Python等多种语言。第三方插件模块表示Elasticsearch支持安装很多第三方的插件,如elasticsearch-ik分词插件、elasticsearch-sql插件等。

协议层是Elasticsearch中的数据交互协议。目前Elasticsearch支持Thrift、Memcached和HTTP三种协议,默认的是HTTP。JMX指的是在Elasticsearch中对Java的管理框架,用来管理Elasticsearch应用。

应用层指的是Elasticsearch的API支持模式。Elasticsearch的特色之一就是RESTFul风格的API,这种API接口风格也是当前十分流行的风格之一。

(5) Elasticsearch的节点自动发现机制

Elasticsearch内嵌自动发现功能,主要提供了4种可供选择的发现机制。其中一种是默认实现,其他都是通过插件实现的,具体如下所示。

(1)Azure discovery插件方式:多播模式。

(2)EC2 discovery插件方式:多播模式。

(3)Google Compute Engine(GCE)discovery插件方式:多播模式。

(4)Zen Discovery,默认实现方式,支持多播模式和单播模式。

Zen Discovery是Elasticsearch内置的默认发现模块。发现模块用于发现集群中的节点及选举主节点(又称master节点)。Zen Discovery提供单播模式和基于文件的发现,并且可以扩展为通过插件支持其他形式的发现机制。

(6)节点类型

在Elasticsearch中,每个节点可以有多个角色,节点既可以是候选主节点,也可以是数据节点。

其中,数据节点负责数据的存储相关的操作,如对数据进行增、删、改、查和聚合等。其中,数据节点负责数据的存储相关的操作,如对数据进行增、删、改、查和聚合等。正因为如此,数据节点往往对服务器的配置要求比较高,特别是对CPU、内存和I/O的需求很大。

候选主节点是被选举为主节点的节点,在集群中,只有候选主节点才有选举权和被选举权,其他节点不参与选举工作。

(7)分片和路由

片的数量和副本数量都可以通过创建索引时的Settings来配置,Elasticsearch默认为一个索引创建5个主分片,并分别为每个分片创建一个副本。配置的参数如下所示:

index.number_of_shards:5
index.number_of_replicas:1

对文档的新建、索引和删除请求等写操作,必须在主分片上面完成之后才能被复制到相关的副本分片。Elasticsearch为了加快写入的速度,写入过程往往是并发实施的。为了解决在并发写的过程中出现的数据冲突的问题,Elasticsearch通过乐观锁进行控制,每个文档都有一个version(版本号),当文档被修改时版本号递增。

(8)数据写入过程

分段存储

索引数据在磁盘上的是以分段形式存储的。“段”是Elasticsearch从Lucene中继承的概念。在索引中,索引文件被拆分为多个子文件,其中每个子文件就叫作段,每个段都是一个倒排索引的小单元。段具有不变性,一旦索引的数据被写入硬盘,就不能再修改。

延迟写策略

在Elasticsearch中,索引写入磁盘的过程是异步的。因此,为了提升写的性能,Elasticsearch并没有每新增一条数据就增加一个段到磁盘上,而是采用延迟写策略。

虽然延迟写策略可以减少数据往磁盘上写的次数,提升Elasticsearch的整体写入能力,但文件缓存系统的引入同时也带来了数据丢失的风险,如机房断电等。为此,Elasticsearch引入事务日志(Translog)机制。事务日志用于记录所有还没有持久化到磁盘的数据。

段合并

在Elasticsearch自动刷新流程中,每秒都会创建一个新的段。这自然会导致短时间内段的数量猛增,而当段数量太多时会带来较大的资源消耗,如对文件句柄、内存和CPU的消耗。而在内容搜索阶段,由于搜索请求要检查到每个段,然后合并查询结果,因此段越多,搜索速度越慢。为此,Elasticsearch引入段合并机制。段合并机制在后台定期进行,从而小的段被合并到大的段,然后这些大的段再被合并到更大的段。

在段合并过程中,Elasticsearch会将那些旧的已删除文档从文件系统中清除。被删除的文档不会被拷贝到新的大段中,当然,在合并的过程中不会中断索引和搜索。

第5章 高级客户端文档实战一

...

[待补充]

3,第三部分 Elasticsearch生态

第9章 Elasticsearch插件

(1) 分析插件

一般分析器会包含三个部分:

(1)character filter:分词之前的预处理,过滤HTML标签、特殊符号转换等。

(2)tokenizer:用于分词。

(3)token filter:用于标准化输出。

第10章 Elasticsearch生态圈

(1)ELK和部署架构变更

ELK Stack指的就是Elastic Stack。

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash和Kibana,如图10-1所示。当然,这并非是Elastic Stack的全部,读者可以根据需要在生态中添加Redis、Kafka、Filebeat等软件。

ELK产品.png

在当前的软件开发过程中,业务发展节奏越来越快,服务器梳理越来越多,随之而来的就是各种访问日志、应用日志和错误日志。这时ELK就可以“隆重登场”啦!

首先,我们使用Logstash进行日志的搜集、分析和过滤。一般工作方式为C/S架构,Client端会被安装在需要收集日志的主机上,Server端则负责收集的各节点的日志数据,并进行过滤、修改和分析等操作,预处理过的数据会一并发到Elasticsearch上。

随后将Kibana接入Elasticsearch,并为Logstash和Elasticsearch提供日志分析友好的Web界面,帮助用户汇总、分析和搜索重要数据的日志。

ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。

1. 最简单的一种ELK部署架构方式

4.ELK部署架构1.png

首先由分布于各个服务节点上的Logstash搜集相关日志和数据,经过Logstash的分析和过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储,并提供多种API供用户进行查询操作。用户还可以通过配置Kibana Web Portal对日志进行查询,并根据数据生成报表。

该架构最显著的优点是搭建简单,易于上手。但缺点同样很突出,因为Logstash消耗资源较大,所以在运行时会占用很多的CPU和内存。并且系统中没有消息队列缓存等持久化手段,因而存在数据丢失隐患。因此,一般这种部署架构通常用于学习和小规模集群。

2. 消息队列机制的ELK架构

4.ELK部署架构2.png

位于各个节点上的Logstash客户端先将数据和日志等内容传递给Kafka,当然,也可以用其他消息机制,如各类MQ(Message Queue)和Redis等。Kafka会将队列中的消息和数据传递给Logstash,经过Logstash的过滤和分析等处理后,传递给Elasticsearch进行存储。最后由Kibana将日志和数据呈现给用户。在该部署架构中,Kafka的引入使得即使远端Logstash因故障而停止运行,数据也会被存储下来,从而避免数据丢失。

第二种部署架构解决了数据的可靠性问题,但Logstash的资源消耗依然较多

3. 引入Logstash-forwarder架构

4.ELK部署架构3.png

Logstash-forwarder将日志数据搜集并统一后发送给主节点上的Logstash,Logstash在分析和过滤日志数据后,把日志数据发送至Elasticsearch进行存储,最后由Kibana将数据呈现给用户。这种架构解决了Logstash在各计算机点上占用系统资源较多的问题。与Logstash相比,Logstash-forwarder所占系统的CPU和内存几乎可以忽略不计。而且,Logstash-forwarder的数据安全性更好。Logstash-forwarder和Logstash之间的通信是通过SSL加密传输的,因此安全有保障。

4. Beats引入的架构

4.ELK部署架构4.png

在实际使用中,Beats平台在满负荷状态时所耗系统资源和Logstash-forwarder相当,但其扩展性和灵活性更好。Beats平台目前包含Packagebeat、Topbeat和Filebeat三个产品,均为Apache 2.0 License。同时用户可以根据需要进行二次开发。

与前面三个部署架构相比,显然第四种架构更灵活,可扩展性更强。

(2)Logstash组件

Logstash由三部分组成,即输入模块(INPUTS)、过滤器模块(FILTERS)和输出模块(OUTPUTS),如图10-6所示。

5.logstach框架.png

Logstash能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用Grok从非结构化数据中派生出结构,从IP地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。

1. Logstash的输入模块

Logstash支持各种输入选择,可以在同一时间从众多常用来源捕捉事件,能够以流式传输方式,轻松地从用户的日志、指标、Web应用、数据存储及各种AWS服务中采集数据。

为了支持各种数据输入,Logstash提供了很多输入插件,汇总如下。

(1)azure_event_hubs:该插件从微软Azure事件中心接收数据。读者可访问GitHub官网,搜索logstash-input-azure_event_hubs获取插件。

(2) beats:该插件从Elastic Beats框架接收数据。读者可访问GitHub官网,搜索logstash-input-beats获取插件。

(3)cloudwatch:该插件从Amazon Web Services CloudWatch API中提取数据。读者可访问GitHub官网,搜索logstash-input-cloudwatch获取插件。

(4)couchdb_changes:该插件从CouchDB更改URI的流式处理事件中获取数据。读者可访问GitHub官网,搜索logstash-input-couchdb_changes获取插件。

(5)dead_letter_queue:该插件从logstash的dead letter队列中读取数据。读者可访问GitHub官网,搜索logstash-input-dead_letter_queue获取插件。

(6)elasticsearch:该插件从ElasticSearch群集中读取查询结果。读者可访问GitHub官网,搜索logstash-input-elasticsearch获取插件。

(7)exec:该插件将shell命令的输出捕获为事件,并获取数据。读者可访问GitHub官网,搜索logstash-input-exec获取插件。

(8)file:该插件从文件流式处理中获取数据。读者可访问GitHub官网,搜索logstash-input-file获取插件。

(9)ganglia:该插件通过UDP数据包读取ganglia中的数据包来获取数据。读者可访问GitHub官网,搜索logstash-input-ganglia获取插件。

(10)gelf:该插件从graylog2中读取gelf格式的消息获取数据。读者可访问GitHub官网,搜索logstash-input-gelf获取插件。

(11)http:该插件通过HTTP或HTTPS接收事件获取数据。读者可访问GitHub官网,搜索logstash-input-http获取插件。

(12)jdbc:该插件通过JDBC接口从数据库中获取数据。读者可访问GitHub官网,搜索logstash-input-jdbc获取插件。

(13)kafka:该插件从Kafka主题中读取事件,从而获取数据。读者可访问GitHub官网,搜索logstash-input-kafka获取插件。

(14)log4j:该插件通过TCP套接字从Log4J SocketAppender对象中读取数据。读者可访问GitHub官网,搜索logstash-input-log4j获取插件。

(15)rabbitmq:该插件从RabbitMQ数据交换中提取数据。读者可访问GitHub官网,搜索logstash-input-rabbitmq获取插件。https://github.com/logstash-plugins/logstash-input-rabbitmq

(16)redis:该插件从redis实例中读取数据。读者可访问GitHub官网,搜索logstash-input-redis获取插件。

2. Logstash过滤器

Logstash过滤器用于实时解析和转换数据。

在数据从源传输到存储库的过程中,Logstash过滤器能够解析各个数据事件,识别已命名的字段,构建对应的数据结构,并将它们转换成通用格式,以便更轻松、更快速地进行分析,实现商业价值。

在数据从源传输到存储库的过程中,Logstash过滤器能够解析各个数据事件,识别已命名的字段,构建对应的数据结构,并将它们转换成通用格式,以便更轻松、更快速地进行分析,实现商业价值。

为了处理各种各样的数据源,Logstash提供了丰富多样的过滤器库,常用的过滤器插件汇总如下。

(1)aggregate:该插件用于从一个任务的多个事件中聚合信息。读者可访问GitHub官网,搜索logstash-filter-aggregate获取插件。

(2)alter:该插件对mutate过滤器不处理的字段执行常规处理。读者可访问GitHub官网,搜索logstash-filter-alter获取插件。

(3)bytes:该插件将以计算机存储单位表示的字符串形式,如“123MB”或“5.6GB”,解析为以字节为单位的数值。读者可访问GitHub官网,搜索logstash-filter-bytes获取插件。

(4)cidr:该插件根据网络块列表检查IP地址。读者可访问GitHub官网,搜索logstash-filter-cidr获取插件。

(5)cipher:该插件用于对事件应用增加或移除密钥。读者可访问GitHub官网,搜索logstash-filter-cipher获取插件。

(6)clone:该插件用于复制事件。读者可访问GitHub官网,搜索logstash-filter-clone获取插件。

(7)csv:该插件用于将逗号分隔的值数据解析为单个字段。读者可访问GitHub官网,搜索logstash-filter-csv获取插件。

(8)date:该插件用于分析字段中的日期,多用于事件日志中存储的时间戳。读者可访问GitHub官网,搜索logstash-filter-date获取插件。

(9) dns:该插件用于执行正向或反向DNS查找。读者可访问GitHub官网,搜索logstash-filter-dns获取插件。(10)elasticsearch:该插件用于将Elasticsearch日志事件中的字段复制到当前事件中。读者可访问GitHub官网,搜索logstash-filter-elasticsearch获取插件。

(11)geoip该插件用于添加有关IP地址的地理信息。读者可访问GitHub官网,搜索logstash-filter-geoip获取插件。

(12)json:该插件用于解析JSON事件。读者可访问GitHub官网,搜索logstash-filter-json获取插件。

(13)kv:该插件用于分析键值对。读者可访问GitHub官网,搜索logstash-filter-kv获取插件。

(14)memcached:该插件用于提供与memcached中数据的集成。读者可访问GitHub官网,搜索logstash-filter-memcached获取插件。

(15)split:该插件用于将多行消息拆分为不同的事件。读者可访问GitHub官网,搜索logstash-filter-split获取插件。

3. Logstash的输出模块

Logstash的输出模块用于将目标数据导出到用户选择的存储库。

在Logstash中,尽管Elasticsearch是Logstash官方首选的,但它并非唯一选择。

(1) csv:该插件以CVS格式将结果数据写入磁盘。读者可访问GitHub官网,搜索logstash-output-csv获取插件。

(2) mongodb:该插件将结果数据写入MongoDB。读者可访问GitHub官网,搜索logstash-output-mongodb获取插件。

(3)elasticsearch:该插件将结果数据写入Elasticsearch。读者可访问GitHub官网,搜索logstash-output-elasticsearch获取插件。

(4)email:该插件将结果数据发送到指定的电子邮件。读者可访问GitHub官网,搜索logstash-output-email获取插件。

(5)kafka:该插件将结果数据写入Kafka的Topic主题。读者可访问GitHub官网,搜索logstash-output-kafka获取插件。

(6)file:该插件将结果数据写入磁盘上的文件。读者可访问GitHub官网,搜索logstash-output-file获取插件。(7)redis:该插件使用redis中的rpush命令将结果数据发送到redis队列。读者可访问GitHub官网,搜索logstash-output-redis获取插件。

(3)Kibana组件

Kibana是一个基于Web的图形界面,可以让用户在Elasticsearch中使用图形和图表对数据进行可视化。

在实际使用过程中,Kibana一般用于搜索、分析和可视化存储在Elasticsearch指标中的日志数据。Kibana利用Elasticsearch的REST接口检索数据,不仅允许用户创建自己的数据定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。可以说从跟踪、查询、负载到理解请求如何流经整个应用,Kibana都能轻松完成。

Kibana提供了基本内容服务、位置分析服务、时间序列服务、机器学习服务,以及图表和网络服务。

(1)基本内容服务:指的是Kibana核心产品中搭载的一批经典功能,如基于筛选数据绘制柱形图、折线图、饼图、旭日图等。

(2)位置分析服务:主要借助Elastic Maps探索位置数据。另外,还可以获得创意,对定制图层和矢量形状进行可视化。

(3)时间序列服务:借助Kibana团队精选的时序数据UI,对用户所用Elasticsearch中的数据执行高级时间序列分析。因而,用户可以利用功能强大、简单易学的表达式来描述查询、转换和可视化。

(4)机器学习服务:主要是借助非监督型机器学习功能检测隐藏在用户所用Elasticsearch数据中的异常情况,并探索那些对用户有显著影响的属性。

(5)图表和网络服务:凭借搜索引擎的相关性功能,结合Graph关联分析,揭示用户所用Elasticsearch数据中极其常见的关系。

此外,Kibana还支持用户把Kibana可视化内容分享给他人,如团队成员、老板、客户、合规经理或承包商等,进而让每个人都感受到Kibana的便利。除分享链接外,Kibana还有其他内容输出形式,如嵌入仪表板,导出为PDF、PNG或CSV等格式文件,以便把这些文件作为附件发送给他人。

KIBANA示例图:

6.KIBANA示例图.png

(4)Beats组件

Logstash在数据收集上并不出色,而作为代理,其性能也并不达标。于是,Elastic官方发布了Beats系列轻量级采集组件。

Beats平台集合了多种单一用途的数据采集器。它们从成百上千台机器和系统向Logstash或Elasticsearch发送数据。

Beats是一组轻量级采集程序的统称,如图10-14所示。

7.beats组件.png

Beats中包括但不限于以下组件:

(1)Filebeat:该组件会进行文件和目录的采集,主要用于收集日志数据。

(2)Metricbeat:该组件会进行指标采集。这里说的指标可以是系统的,也可以是众多中间件产品的。主要用于监控系统和软件的性能。

(3)Packetbeat:该组件通过网络抓包和协议分析,对一些请求响应式的系统通信进行监控和数据收集,可以收集到很多常规方式无法收集到的信息。

(4)Winlogbeat:该组件专门针对Windows的event log进行数据采集。

(5)Audibeat:该组件用于审计数据场景,收集审计日志。

(6)Heartbeat:该组件用于系统间连通性检测,如ICMP、TCP、HTTP等的连通性监控。

(7)Functionbeat:该组件用于无须服务器的采集器。

官方支持的7种组件与ELK的数据流转关系如图10-15所示。

8.beats组件与ELK的关系.png

Beats轻量级设计的实现

Beats是一组轻量级采集程序的统称,那么Beats是如何做到轻量级的呢?

(1)数据处理简单。在数据收集层面,Beats并不进行过于复杂的数据处理,只是将数据简单的组织并上报给上游系统。

(2)并发性好、便于部署。Beats采用Go语言开发而成。

因此,Beats的性能显著好于Logstash。

Beats架构设计

Beats之所以有上乘的性能及良好的可扩展性,能获得如此强大的开源支持,其根本原因在于它有一套设计良好的代码框架。Beats的架构设计如图10-16所示。

9.Beats架构设计.png

libbeat是Beats的核心包。在Beats架构中,有输出模块(Publisher)、数据收集模块(Logging)、配置文件模块(Configuration)、日志处理模块和守护进程模块(Daemon/service)。其中,输出模块负责将收集到的数据发送给Logstash或者Elasticsearch。

因为Go语言天然就有channel,所以收集数据的逻辑代码与输出模块都是通过channel通信的。也就是说,两个模块的耦合度最低。

4.参考

(1) 《Elasticsearch实战与原理解析》
https://weread.qq.com/web/reader/01a32c5071d7c79a01a0831

(2)配套源代码
http://www.broadview.com.cn/file/resource/003179083145134038138254251183181156060026092118

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267