《深入理解ElasticSearch》——1.2 ElasticSearch简介-阿里云开发者社区

开发者社区> 华章出版社> 正文

《深入理解ElasticSearch》——1.2 ElasticSearch简介

简介:

本节书摘来自华章计算机《深入理解ElasticSearch》一书中的第1章,第1.2节,作者:[美] 拉斐尔·酷奇(Rafa Ku) 马雷克·罗戈任斯基(Marek Rogoziński)更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.2 ElasticSearch简介

虽然读者可能已经对ElasticSearch有所了解,至少已经了解了它的一些核心概念和基本用法。然而,为了全面理解该搜索引擎是如何工作的,我们最好简略地讨论一下它。
ElasticSearch是一个可用于构建搜索应用的成品软件。它最早由Shay Banon创建并于2010年2月发布。之后的几年ElasticSearch迅速流行开来,成为商业解决方案之外且开源的一个重要选择,也是下载量最多的开源软件之一,每月下载量超过20万次。
1.2.1 ElasticSearch的基本概念
现在,让我们了解一下ElasticSearch的基本概念及其特征。
索引
ElasticSearch将它的数据存储在一个或多个索引(index)中。用SQL领域的术语来类比,索引就像数据库,可以向索引写入文档或者从索引中读取文档,并通过在ElasticSearch内部使用Lucene将数据写入索引或从索引中检索数据。需要注意的是,ElasticSearch中的索引可能由一个或多个Lucene索引构成,具体细节由ElasticSearch的索引分片(shard)、复制(replica)机制及其配置决定。
文档
文档(document)是ElasticSearch世界中的主要实体(对Lucene来说也是如此)。对所有使用ElasticSearch的案例来说,它们最终都可以归结为对文档的搜索。文档由字段构成,每个字段有它的字段名以及一个或多个字段值(在这种情况下,该字段被称为是多值的,即文档中有多个同名字段)。文档之间可能有各自不同的字段集合,且文档并没有固定的模式或强制的结构。另外,这些规则也适用于Lucene文档。事实上,ElasticSearch的文档最后都存储为Lucene文档了。从客户端的角度来看,文档是一个JSON对象(想了解更多关于JSON格式细节,请参考http://en.wikipedia.org/wiki/JSON)。
映射
正如你在1.1节所了解的那样,所有文档在写入索引前都需要先进行分析。用户可以设置一些参数,来决定如何将输入文本分割为词条,哪些词条应该被过滤掉,或哪些附加处理是有必要被调用的(如移除HTML标签)。此外,ElasticSearch也提供了各种特性,如排序时所需的字段内容信息。这就是映射(mapping)扮演的角色,存储所有这种元信息。虽然ElasticSearch能根据字段值自动检测字段的类型,但有时候(事实上,几乎是所有时候)用户还是想自行配置映射,以避免出现一些令人不愉快的意外。
类型
ElasticSearch中每个文档都有与之对应的类型(type)定义。这允许用户在一个索引中存储多种文档类型,并为不同文档类型提供不同的映射。
节点
单个的ElasticSearch服务实例称为节点(node)。很多时候部署一个ElasticSearch节点就足以应付大多数简单的应用,但是考虑到容错性或在数据膨胀到单机无法应付这些状况时,你也许会更倾向于使用多节点的ElasticSearch集群。
集群
当数据量或查询压力超过单机负载时,需要多个节点来协同处理,所有这些节点组成的系统称为集群(cluster)。集群同时也是无间断提供服务的一种解决方案,即便在某些节点因为宕机或执行管理任务(如升级)不可用时。ElasticSearch几乎无缝集成了集群功能。在我们看来,这是它胜过竞争对手的最主要的优点之一。而且,在ElasticSearch中配置一个集群是再容易不过的事了。
分片
正如我们之前提到的那样,集群允许系统存储的数据总量超过单机容量。为了满足这个需求,ElasticSearch将数据散布到多个物理Lucene索引上。这些Lucene索引称为分片(shard),而散布这些分片的过程叫作分片处理(sharding)。ElasticSearch会自动完成分片处理,并且让这些分片呈现出一个大索引的样子。请记住,除了ElasticSearch本身自动进行分片处理外,用户为具体的应用进行参数调优也是至关重要的,因为分片的数量在索引创建时就已经配置好,而且之后无法改变,至少对目前的版本是这样的。
副本
分片处理允许用户向ElasticSearch集群推送超过单机容量的数据。副本(replica)则解决了访问压力过大时单机无法处理所有请求的问题。思路很简单,即为每个分片创建冗余的副本,处理查询时可以把这些副本用作最初的主分片(primary shard)。请记住,我们并未付出额外的代价。即使某个分片所在的节点宕机,ElasticSearch也可以使用其副本,从而不会造成数据丢失,而且支持在任意时间点添加或移除副本,所以一旦有需要可随时调整副本的数量。
网关
在ElasticSearch的工作过程中,关于集群状态,索引设置的各种信息都会被收集起来,并在网关(gateway)中被持久化。
1.2.2 ElasticSearch架构背后的关键概念
ElasticSearch架构遵循了一些设计理念。通常开发团队希望这个搜索引擎产品易于使用和扩展,并能在ElasticSearch的各个地方体现出来。从架构的角度出发,ElasticSearch具有下面这些主要特征:

  • 合理的默认配置,使得用户在简单安装以后能直接使用ElasticSearch而不需要任何额外的调试,这包括内置的发现(如字段类型检测)和自动配置功能。
  • 默认的分布式工作模式。每个节点总是假定自己是某个集群的一部分或将是某个集群的一部分,一旦工作启动节点便会加入某个集群。
  • 对等架构(P2P)可以避免单点故障(SPOF)。节点会自动连接到集群中的其他节点,进行相互的数据交换和监控操作。这其中就包括索引分片的自动复制。
  • 易于向集群扩充新节点,不论是从数据容量的角度还是数量角度。
  • ElasticSearch没有对索引中的数据结构强加任何限制,从而允许用户调整现有的数据模型。正如之前描述的那样,ElasticSearch支持在一个索引中存在多种数据类型,并允许用户调整业务模型,包括处理文档之间的关联(尽管这种功能非常有限)。
  • 准实时(Near Real Time,NRT)搜索和版本同步(versioning)。考虑到ElasticSearch的分布式特性,查询延迟和节点之间临时的数据不同步是难以避免的。ElasticSearch尝试消除这些问题并且提供额外的机制用于版本同步。

1.2.3 ElasticSearch的工作流程
现在,让我们简单地讨论一下ElasticSearch是如何工作的。
启动过程
当ElasticSearch节点启动时,它使用广播技术(也可配置为单播)来发现同一个集群中的其他节点(这里的关键是配置文件中的集群名称)并与它们连接。读者可以通过下图的描述来了解相关的处理过程:


<a href=https://yqfile.alicdn.com/5a80f59364030303ffbc7681cf9dc3523f1984b6.png" >

集群中会有一个节点被选为管理节点(master node)。该节点负责集群的状态管理以及在集群拓扑变化时做出反应,分发索引分片至集群的相应节点上。
请记住,从用户的角度来看,ElasticSearch中的管理节点并不比其他节点重要,这与其他某些分布式系统不同(如数据库)。实际上,你不需要知道哪个节点是管理节点,所有操作可以发送至任意节点,ElasticSearch内部会自行处理这些不可思议的事情。如果有需要,任意节点可以并行发送子查询给其他节点,并合并搜索结果,然后返回给用户。所有这些操作并不需要经过管理节点处理(请记住,ElasticSearch是基于对等架构的)。
管理节点读取集群的状态信息,并在必要时进行恢复处理。在该阶段,管理节点会检查所有索引分片并决定哪些分片将用于主分片。然后,整个集群进入黄色状态。
这意味着集群可以执行查询,但是系统的吞吐量以及各种可能的状况是未知的(这种状况可以简单理解为所有的主分片已经分配出去了,而副本没有),因而接下来就是要寻找到冗余的分片并用作副本。如果某个主分片的副本数过少,管理节点将决定基于某个主分片创建分片和副本。如果一切顺利,集群将进入绿色状态(这意味着所有主分片和副本均已分配好)。
故障检测
集群正常工作时,管理节点会监控所有可用节点,检查它们是否正在工作。如果任何节点在预定义的超时时间内没有响应,则认为该节点已经断开,然后开始启动错误处理过程。这意味着要在集群-分片之间重新做平衡,因为之前已断开节点上的那些分片不可用了,剩下的节点要肩负起相应的责任。换句话说,对每个丢失的主分片,一个新的主分片将会从原来的主分片的副本中脱颖而出。新分片和副本的放置策略是可配置的,用户可以根据具体需求进行配置。更多信息请参见第4章(索引分布架构)的内容。
为了描述故障检测(failure detection)是如何工作的,我们用一个只有三个节点的集群为例,即包含一个管理节点,两个数据节点。管理节点会发送ping请求至其他节点,然后等待响应。如果没有响应,则该节点会从集群中移除。如下图所示:

<a href=https://yqfile.alicdn.com/cbc2ad5fc3e3346e872a97bc05f3f65cef3c4c4d.png" >

与ElasticSearch通信
前面已经讨论过ElasticSearch是如何构建的了,然而,对普通用户来说,最重要的还是如何向ElasticSearch推送数据并构建查询。为了提供这些功能,ElasticSearch对外公开了一个设计精巧的API。
ElasticSearch假设数据由URL携带或者以JSON(文档的形式由HTTP消息体携带。使用Java或基于JVM语言的用户,应该了解一下Java API,它除了REST API提供的所有功能以外还有内置的集群发现功能。
值得一提的是,ElasticSearch在内部也使用Java API进行节点间通信。读者可以在第8章中了解更多Java API的细节,而这里只是简略地了解Java API提供了哪些功能。本书假设读者已经使用过这些功能了,只是在此做一点小小的提示。如果用户还没有使用过,强烈建议阅读相关材料,其中《ElasticSearch Server》一书覆盖了所有这些内容。
索引数据
ElasticSearch提供了四种方式来创建索引。最简单的方式是使用索引API,它允许用户发送一个文档至特定的索引。例如,使用curl工具(详见http://curl.haxx.se/),并用如下命令创建一个文档:


<a href=https://yqfile.alicdn.com/935e5719fafc94526bbe7bbb52cc03c0c18bd13b.png" >

第二种或第三种方式允许用户通过bulk API或UDP bulk API来一次性发送多个文档至集群。两者的区别在于网络连接方式,前者使用HTTP协议,后者使用UDP协议,且后者速度快,但是不可靠。第四种方式使用插件发送数据,称为河流(river),河流运行在ElasticSearch节点上,能够从外部系统获取数据。
有一件事情需要记住,建索引操作只会发生在主分片上,而不是副本上。当把一个索引请求发送至某节点时,如果该节点没有对应的主分片或者只有副本,那么这个请求会被转发到拥有正确的主分片的节点(如下图所示)。

<a href=https://yqfile.alicdn.com/b9ee65b3c521f247253963fece01688144b2c97d.png" >

查询数据
查询API占据了ElasticSearch API的大部分内容。使用查询DSL(基于JSON的可用于构建复杂查询的语言),我们可以做下面这些事情:
  • 使用各种查询类型,包括:简单的词项查询、短语查询、范围查询、布尔查询、模糊查询、区间查询、通配符查询、空间查询等。
  • 组合简单查询构建复杂查询。
  • 文档过滤,在不影响评分的前提下抛弃那些不满足特定查询条件的文档。
  • 查找与特定文档相似的文档。
  • 查找特定短语的查询建议和拼写检查。
  • 使用切面构建动态导航和计算各种统计量。
  • 使用预搜索(prospective search)并查找与指定文档匹配的query集合。

对于查询操作,读者应该要重点了解:查询并不是一个简单的、单步骤的操作。一般来说,查询分为两个阶段:分散阶段(scatter phase)和合并阶段(gather phase)。分散阶段将query分发到包含相关文档的多个分片中去执行查询,合并阶段则从众多分片中收集返回结果,然后对它们进行合并、排序、后续处理,然后返回给客户端。该机制可以由下图描述。


<a href=https://yqfile.alicdn.com/deead989113f2e7f791834f3f3cd24d8f11a5f02.png" >

ElasticSearch对外提供了6个系统参数,任何一个都可以用来定制分散/合并机制。关于这个问题可参阅本书的上一版《ElasticSearch Server》(Packt出版社)。
索引配置
前面已经讨论过ElasticSearch的自动索引配置以及发现识别文档字段类型和结构的功能。当然,ElasticSearch也提供了一些功能使得用户能手动配置,例如用户想通过映射来配置自定义的文档结构,或者想设置索引的分片和副本数,抑或定制文本分析过程,种种这些需求都可以通过手动配置解决。
系统管理和监控
ElasticSearch中系统管理和监控相关的API允许用户改变集群的设置,如调节集群发现机制和索引放置策略等。此外,你还可得到关于集群状态信息或每个节点、每个索引的统计信息。集群监控API非常全面,我们将在第5章学习相关API的使用范例。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接