Elasticsearch基础概念和工作原理分析

一、Elasticsearch与Apache Lucene对比

1、Elasticsearch

优点:

  1. 对Lucence的封装,完全支持 Apache Lucene 的接近实时的搜索
  2. 通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单
  3. 分布式实时文件存储,可以扩展到上百台服务器
  4. 能够处理PB级别的结构化或非结构化数据
  5. es采用gateway的概念,使备份更简单
  6. 有一系列熔断器,es节点发生故障时,可以进行自动分配其它节点替代
  7. 支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等

缺点:

  1. 需要搭建es服务和集群,前期需要做好节点、分片、内存等设计,运维成本高,需要服务器支持
  2. 不支持数据聚合后分页,原因可概括为: 性能角度——聚合分页会在大量的记录中产生性能问题;正确性角度——聚合的文档计数不准确

2、Apache Lucene

优点:

  1. 提供简单易用、开放源代码的全文检索引擎工具包,由java编写
  2. 由开发者在此基础上开发搜索引擎,代码透明,易定位错误,比较灵活

缺点:

  1. 较底层,需要额外的开发工作,所有的扩展,分布式,可靠性等都需要自己实现
  2. 非实时,从建索引到可以搜索中间有一个时间延迟

3、Lucene与ES关系

  1. Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
  2. Elasticsearch使用Java开发,并使用Lucene作为其核心,来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

二、ES核心概念

1、Cluster:集群。

ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

2、Node:节点。

形成集群的每个服务器称为节点。

3、Shard:分片。

当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快地响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。 
当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。

4、Replia:副本。

为提高查询吞吐量或实现高可用性,可以使用分片副本。 
副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。 
当主分片丢失时(例如该分片数据所在的服务器不可用时),集群将副本提升为新的主分片。

5、全文检索。

全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。 
全文索引就是:根据词的意义,对内容进行分词,分别创建索引。例如,”你们的激情是因为什么事情来的” 可能会被分词成:“你们“、”激情“、“什么事情“、”来“ 等token,这样当你搜索“你们” 或者 “激情”时, 都会把这句搜出来。

6、ES架构与Mysql数据库对比

Elasticsearch基础概念和工作原理分析

三、工作原理

1、启动过程

     当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。 

    在集群中,一个节点被选举成主节点(master node)。这个节点负责管理集群的状态,当群集的拓扑结构改变时把索引分片分派到相应的节点上。

    从用户的角度来看,主节点在ElasticSearch中并没有占据着重要的地位,这与其它的系统(比如数据库系统)是不同的。实际上用户并不需要知道哪个节点是主节点;所有的操作需求可以分发到任意的节点,ElasticSearch内部会完成这些让用户感到不明觉历的工作。在必要的情况下,任何节点都可以并发地把查询子句分发到其它的节点,然后合并各个节点返回的查询结果。最后返回给用户一个完整的数据集。所有的这些工作都不需要经过主节点转发(节点之间通过P2P的方式通信)。

    Elasticsearch基础概念和工作原理分析

2、探测失效节点

  1. 关系型数据库中的数据库(DataBase),等价于ES中的索引(Index) 
  2. 一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type), 
  3. 一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。 
  4. 在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。 
  5. 在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET.

    在正常工作时,主节点会监控所有的节点,查看各个节点是否工作正常。如果在指定的时间里面,节点无法访问,该节点就被视为出故障了,接下来错误处理程序就会启动。集群需要重新均衡——由于该节点出现故障,分配到该节点的索引分片丢失。其它节点上相应的分片就会把工作接管过来。换句话说,对于每个丢失的主分片,新的主分片将从剩余的分片副本(Replica)中选举出来。重新安置新的分片和副本的这个过程可以通过配置来满足用户需求。

    由于只是展示ElasticSearch的工作原理,我们就以下图三个节点的集群为例。集群中有一个主节点和两个数据节点。主节点向其它的节点发送Ping命令然后等待回应。如果没有得到回应(实际上可能得不到回复的Ping命令个数取决于用户配置),该节点就会被移出集群。

    主节点会去读取集群状态信息;在必要的时候,会进行恢复工作。在这个阶段,主节点会去检查哪些分片可用,决定哪些分片作为主分片。处理完成后,集群就会转入到黄色状态。

    这意味着集群已经可以处理搜索请求了,但是还没有火力全开(这主要是由于所有的主索引分片(primary shard)都已经分配好了,但是索引副本还没有)。接下来需要做的事情就是找到复制好的分片,并设置成索引副本。当一个分片的副本数量少了,主节点会决定将缺少的分片放置到哪个节点中,并且依照主分片创建副本。所有工作完成后,集群就会变成绿色的状态(表示所有的主分片的索引副本都已经分配完成)。

Elasticsearch基础概念和工作原理分析

四、相关文档

es结构和工作原理概述

Elasticsearch学习,请先看这一篇!

ElasticSearch查询—分页查询详解