Elasticsearch实战(第2版)
上QQ阅读APP看书,第一时间看更新

1.4 Elasticsearch概述

Elasticsearch是一款开源的搜索和分析引擎。它是用Java开发的,基于流行的全文搜索库Apache Lucene 构建的超快速、高可用的搜索引擎。Elasticsearch通过提供具有RESTful接口的分布式系统对Lucene的强大功能进行了封装。Lucene是Elasticsearch的核心,而Kibana是管理和使用Elasticsearch的管理界面。在本书中,我们将通过Kibana的代码编辑器(Dev Tools)进行操作。

全文搜索是Elasticsearch作为现代搜索引擎所擅长的地方。它可以根据用户的搜索条件快速地找出相关的文档,用户也可以搜索精确的内容,如关键词、日期、数字范围或日期范围。Elasticsearch还拥有一系列高级功能,如相关性、“你是不是想找”的搜索建议、搜索内容自动补全、模糊搜索、地理空间搜索和高亮显示等。

除了在提供近实时搜索能力方面处于领先地位,Elasticsearch在大数据的统计聚合方面也表现不俗。当然,我们必须根据使用场景来考虑是否采用这款产品,因为Elasticsearch可能并不适合每种使用场景(参见 1.4.3 节)。除此之外,Elasticsearch 还拥有一系列值得称道的功能,如应用性能监控、预测分析和异常检测,以及安全威胁监控和检测等。

Elasticsearch专注于在收集的数据中发掘更深层次的含义。它可以聚合数据、完成统计计算,并在数据中发现有价值的信息。我们可以使用Kibana工具创建丰富的可视化图表和仪表板,并与他人共享。Elasticsearch可以计算平均值、总和、中位数和众数,还可以对数据进行复杂的分析,如在直方图中对数据进行分桶和其他分析功能。

此外,Elasticsearch还能在数据上运行有监督和无监督的机器学习算法。模型有助于检测异常、找到离群值和预测事件。在监督学习模式下,我们可以提供训练集,以便模型进行学习并做出预测。

Elasticsearch还具有通过监控网络中Web服务器的性能指标(如内存和CPU周期)来观察应用及其健康状况的能力。它让用户可以筛查数百万条Web服务器的日志,以便找到或调试应用的问题。Elasticsearch还投入时间和资源构建安全领域的解决方案,如安全威胁警报、IP过滤、端点防护等。

1.4.1 核心领域

Elastic是Elasticsearch背后的公司,这家公司主要关注3个核心领域,即搜索、可观测性和安全性,如图1-2所示。让我们依次看一看这些领域。

图1-2 Elasticsearch背后的Elastic公司的核心应用领域

1. Elastic企业搜索

无论是让用户在不同的内容提供商(如Slack、Confluence、Google Drive等)之间进行搜索,还是为应用、软件和网站启用搜索功能,Elastic企业搜索套件都有助于构建模型和定制化的搜索引擎。

搜索可以深度集成到各领域(业务、基础设施、应用等)众多应用中。用户可以创建由Elasticsearch支持的Web应用、由Elasticsearch支持的移动应用或者以Elasticsearch为核心的服务器端搜索服务。在本书的后面,我们将通过示例来学习如何将Elasticsearch作为搜索服务器集成到应用中。

2. Elastic可观测性

在基础设施上运行的应用会产生大量的指标数据,这些指标数据通常用于应用的可观测性和监控。我们可以在可观测性领域使用Elasticsearch,应用、服务器、机架和模块的状态都可以被监控、记录、跟踪和告警。我们还可以使用Elastic工具进行大规模的应用管理和监控。

3. Elastic安全性

Elastic可以在安全领域进行威胁检测和预防,并提供源头恶意软件移除、静态加密等高级功能。作为安全信息和事件管理(security information and event management,SIEM)工具,Elastic正在寻找自己的定位,并通过其先进的安全工具箱来保护组织。

1.4.2 Elastic Stack

Elasticsearch是搜索引擎的核心,而Elastic的几款产品对其进行了补充。这套产品称为Elastic Stack,包括Kibana、Logstash、Beats和Elasticsearch。(这套产品以前被称为ELK Stack,但在Beats被引入产品套件后更名为Elastic Stack。)

这4种产品的组合通过集成、消费、处理、分析、搜索和存储来自不同来源的各种数据集,来帮助构建企业级应用。如图 1-3 所示,Beats和Logstash将数据写入Elasticsearch,而Kibana则是对这些数据进行可视化的用户界面。

图1-3 Elastic Stack:Beats、Logstash、Elasticsearch和Kibana

在深入了解Elasticsearch的使用场景之前,我们简单地从宏观层面了解一下这些必要的组件。除Elasticsearch之外,其他组件在本书中不再讨论。

1. Beats

Beats是单一用途的数据传输工具,它们从各种外部系统加载数据并将其写入Elasticsearch。多种类型的Beats开箱即用,包括Filebeat、Metricbeat、Heartbeat等,每种都可以完成特定的数据消费任务。这些都是单一用途的组件,例如,Filebeat用于基于文件的传输,Metricbeat用于采集重要的机器和操作系统的内存及CPU信息。Beats的代理安装在服务器上,以便它们可以从来源消费数据并将其发送到目的地。

2. Logstash

Logstash是一个开源的数据处理引擎。它从多个来源提取数据并处理它们,然后将其发送到各种目的地。在数据处理过程中,Logstash会转换和丰富数据。它支持众多的来源和目的地,包括文件、HTTP、JMS、Kafka、Amazon S3、Twitter等几十种。它提出了一种管道架构,每个通过管道的事件都根据预配置的规则进行解析和处理,从而创建出一个实时的数据摄取管道。

3. Kibana

Kibana是一个多用途的Web控制台,提供了包括执行查询,开发仪表板、可视化图表,创建下拉列表和聚合等多种选项。然而,我们可以使用任何REST客户端与Elasticsearch通信来调用API,不限于Kibana。例如,我们可以使用cURL、Postman或各种语言的客户端来调用API。

1.4.3 Elasticsearch的使用场景

将Elasticsearch仅限定于某个特定的使用场景或领域是比较困难的。Elasticsearch在从搜索到分析再到机器学习的许多领域都无处不在。它被广泛应用于多个行业,包括金融、国防、交通、政府、零售、云计算、娱乐、航天等。下面我们大体看一下Elasticsearch是如何在一个组织中使用的。

1. 搜索引擎

Elasticsearch凭借其全文搜索能力成为首选技术。但它不局限于全文搜索,还可用于结构化数据和基于地理位置的搜索等。总的来说,客户在3个领域使用Elasticsearch,即应用搜索、企业搜索和网站搜索。

应用搜索中,Elasticsearch作为核心为应用提供搜索和分析功能。Elasticsearch支持的搜索服务可以设计为满足应用的搜索需求(如搜索客户、订单、发票、电子邮件等)的微服务。

在大多数组织中,数据分散在许多数据存储、应用和数据库中。例如,组织通常与Confluence、内网空间、Slack、电子邮件、数据库、云盘(iCloud drive、Google Drive等)等进行集成。对这些组织而言,整合并搜索来自各种来源的海量数据是一个挑战。这正是Elasticsearch可以用于企业搜索和数据组织的地方。

如果我们有一个已经积累了数据的在线商业网站,那么提供搜索功能就是吸引客户并让他们感到满意的基本条件。网站搜索是Elastic提供的一种软件即服务(SaaS)产品,一旦启动,它就会爬取给定的网站页面,抓取数据并构建由Elasticsearch支持的索引。爬取和索引完成后,网站就可以轻松地与搜索功能集成。网站搜索模块还可以帮助创建搜索栏和相关的代码片段。网站管理员将生成的代码片段嵌入网站的主页,就能轻松地启用搜索栏,从而使网站集成完整的搜索功能。

2. 业务分析

组织会从各种来源获取大量数据,而这些数据通常是其生存和成功的关键。Elasticsearch可以帮助组织从数据中提取趋势、统计和指标信息,为组织提供有关其运营、销售、营业额、利润等多个特征的信息,以便进行及时管理。

3. 安全分析以及威胁和欺诈检测

数据安全及潜在的漏洞是组织的噩梦。Elasticsearch的安全分析可以帮助组织分析每处信息——无论是来自应用、网络、终端还是来自云。这种分析可以提供对威胁和漏洞的洞察,让组织及时发现恶意软件和勒索软件,从而降低被黑客攻击的风险。

4. 日志和应用监控

应用会产生大量的应用日志和指标数据。这些日志可以洞察应用的健康状态。随着云计算和微服务时代的到来,日志分散在各个服务中,要进行有意义的分析变得十分烦琐。这时,Elasticsearch就成为我们的好帮手。Elasticsearch的一个常见使用场景就是索引并分析日志,以达到对应用进行调试和错误分析的目的。

虽然Elasticsearch是一个强大且灵活的搜索和分析引擎,但它并不适用于所有场景。下面就简要讨论一下我们可能遇到的问题和不适合使用Elasticsearch的场景。

1.4.4 不适合Elasticsearch的使用场景

Elasticsearch并非适用于每种使用场景。它是一个强大且灵活的搜索和分析引擎,但遗憾的是,这个工具也有其局限性。在选择Elasticsearch来满足需求之前,我们必须把这些局限性纳入考虑范围。下面是几种Elasticsearch可能不适用或效率不高的场景。

关系数据。当数据具有关系并且需要进行复杂的数据库连接时,Elasticsearch不是一个合适的选择。Elasticsearch不是为处理复杂的关系数据结构设计的。如果数据之间关系很强,那么像MySQL或PostgreSQL这样的关系数据库可能是更好的选择。大多数现代数据库(MySQL、PostgreSQL 等)也提供全文搜索功能,尽管这些功能并不像Elasticsearch这样的现代搜索引擎那样先进。

事务数据。Elasticsearch是一个“最终一致”的搜索引擎,这使得它不适合需要强一致性的应用场景,如金融交易。对于这些使用场景,可以考虑使用传统的关系数据库或像MongoDB这样的NoSQL数据库。

地理空间数据。虽然Elasticsearch内置了对地理空间数据的支持,但它可能不是大规模地理空间分析场景最高效的解决方案。对于这些使用场景,可以考虑使用专用的地理空间数据库(如PostGIS)或地理空间分析平台(如ArcGIS)。

高写入负载。Elasticsearch可以支持高读取负载,但它并没有为高写入负载进行优化。如果需要实时索引大量数据,可以考虑使用专用的索引引擎,如Apache Flume或Apache Kafka。

联机分析处理(online analytical processing,OLAP)数据。如果需要对大数据集进行复杂的多维分析,传统的OLAP数据库(如Microsoft Analysis Services或IBM Cognos)可能比Elasticsearch更适合。

大型二进制数据。虽然Elasticsearch可以处理大量的文本数据,但它可能不是索引和搜索大型二进制数据(如视频或图像)的最佳解决方案。对于这些使用场景,使用专用的二进制数据存储可能更好,如Hadoop分布式文件系统(HDFS)、Amazon S3或Azure Files。

实时分析。Elasticsearch非常适合对大数据集进行实时搜索和分析,但它可能不是实时数据处理和分析的最佳解决方案。相反,可以考虑使用专门的实时分析平台,如Apache Spark或Apache Flink。

对延迟敏感的应用。尽管Elasticsearch是为处理高容量的搜索和分析查询设计的,但在处理大量数据时它仍然可能出现延迟。对于需要亚毫秒级响应的应用,像Apache Solr这样的专用搜索引擎或者像Apache Cassandra这样的列式数据库可能更适合。

其他类型。Elasticsearch不是处理时间序列数据(一般也称时序数据)、图数据、内存数据和一些其他类型数据的首选解决方案。如果需要存储和分析时间序列数据,像InfluxDB或TimescaleDB这样专用的时间序列数据库可能更适合。同理,像Neo4j这样的图数据库可能更适合处理图数据。

在选择Elasticsearch作为技术解决方案之前,评估具体的使用场景和需求非常重要。下面我们就讨论Elasticsearch作为一个工具、技术和搜索解决方案的常见误解。

1.4.5 误解

关于Elasticsearch的一个主要误解是认为它是传统的关系数据库,还有一个常见的误解是觉得设置Elasticsearch很容易,而实际上,设置一个中等规模的集群需要在默认配置的基础上做许多调整。此外,Elasticsearch通常会被认为是专门用于文本搜索的技术,而事实上它可以用于广泛的搜索和分析场景。下面列举了关于Elasticsearch的一些常见误解。

设置和管理Elasticsearch很容易。虽然Elasticsearch的安装和入门相对简单,但随着数据增长和使用场景增加,管理和扩展可能变得具有挑战性。尽管 Elasticsearch 的一切都是开箱即用的,这让工程师的工作变得很轻松,但将 Elasticsearch 用于生产环境还需要做很多功课。我们可能需要调整集群配置、调整内存分配、处理节点故障,甚至随着数据的增长,还需要扩展集群以处理高达PB量级的数据等。

Elasticsearch是关系数据库。Elasticsearch不是关系数据库,不支持传统关系数据库的特性,如事务、外键和复杂的连接操作等。例如,不能在 Elasticsearch 中强制检查引用的完整性或进行复杂的连接操作。如果需要这些特性,像MySQL或PostgreSQL这样成熟的关系数据库是最佳解决方案。

Elasticsearch可以处理所有类型的数据。Elasticsearch功能丰富,可以处理多种数据类型,但它并不是可以同样轻松地处理每种类型的数据。例如,它可能不是实时数据处理和分析或者处理大型二进制数据的最佳解决方案。如果需要存储和处理大型二进制数据,如视频或图像,可以考虑使用专用的二进制数据存储,如HDFS或Amazon S3。

Elasticsearch只能用于文本搜索。虽然Elasticsearch非常适合文本搜索,但它也可以对结构化数据和非结构化数据进行复杂的分析。例如,可以使用Elasticsearch聚合、分析日志数据,并使用Kibana对数据进行可视化。

Elasticsearch可以替代所有其他技术。Elasticsearch是一个强大且灵活的技术,但并不是一个万能的解决方案,也不是每种使用场景的最佳选项。例如,它永远不能替代传统的关系数据库。

Elasticsearch总是比其他技术更快。Elasticsearch确实是为高性能设计的,并且预期在高负载下仍能表现良好。然而,Elasticsearch能做的只有这么多,其性能高低主要取决于系统工程师对它微调的程度。

Elasticsearch只处理大数据。Elasticsearch可以处理PB量级的大数据集,但它在处理GB量级的小数据集时同样表现良好。例如,可以使用Elasticsearch搜索和分析一个组织的小型电子邮件数据库或一个初创公司的数据,而不需要付出太多额外的努力。

这些只是关于Elasticsearch的一些常见误解的例子。如前所述,在选择Elasticsearch或任何其他技术之前,必须仔细评估具体的需求和使用场景。