ELK Stack系列之基础篇(七) - 走进 Elasticsearch

2020-02-18 10:18:25 浏览数 (1)

前言

Elasticsearch 是实时的分布式搜索引擎,内部使用Lucene做索引、搜索。那么接下来,我们了解一下Elasticsearch的相关名词解释、分片间的工作原理等知识;

一、Elasticsearch的核心概念、原理(特别重要)

(1)Near Realtime(NRT): 近实时,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级。新增到ES中的数据在1秒后就可以被检索到,这种新增数据对搜索的可见性称为“准实时搜索”;

(2)Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常,它们协同工作,分享数据和负载。

(3)Node:就是一台运行了ES服务的服务器,就是跑了一个Java进程的节点,节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群。

(4)Index:索引,包含一堆有相似结构的文档数据的集合,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。

(5) Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。注意:_type在实际应用中容易引起概念混淆,以及允许索引存在多_type并没有什么实际意义,在ES 6.x版本中,一个索引只允许存在一个_type,也就是_doc来表示所有type.未来的ES 7.X版本将完全删除_type概念。

(6) Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

(7)shard(分片):单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。为了应对并发更新问题,ES将数据副本分为主从两部分,也就是主分片(primary shard简称p)和副本分片(replica shard).主数据作为权威数据,写过程先写主分片,成功后再写副分片,恢复阶段以主分片为准。他们的搭配原则如下:主分片与副本分片不能在同一个节点上,保重数据的高可用。副本分片之间的多个备份也不能在一个节点上,一个节点上多个副本备份没有意义。

(8)replica(副本):任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个)。

(9)lucene index :Lucene的核心就是倒排索引,ES就是基于Lucene封装而来的。Lucene的倒排索引算法、队列集合是存在一个叫segment里边,这个segment的集合我们称之为Lucene Index. 而我们的ES的每个shard都均匀的存在于ES集群的每个每个Node上。每个shard里的数据都是基于Lunce的倒排索引来排序的。所以,每个shard对应一个lucene index。

(10)索引:这里的索引这个名词,不同于上面的index.上面的索引就是创建目录的意思。这里的index我们可以理解为是我们根据自身需要按照ES的规则去定义一套合适的数据结构包括字段、字段类型的设置,然后ES自身基于这个数据结构去给我们存进去的数据或者需要分析的数据进行数据建造,进而让搜索变得非常迅速。这个过程是由Es自身完成的。我们称这个过程为索引。在大多数据库中,可以使用几种不同的方式为字段添加索引。而Lucene使用的是倒排索引,这意味着他将创建一个数据结构,并在其中保存记录每个单词出现在哪些数据清单中;

(11)正排索引:文档->关键词的映射过程,就是你要去找一个关键词的时候,需要全文一行一行去搜索扫描直到搜到为止。所以它的缺点是费时费资源。

(12)倒排索引:也称为反向索引。它是ES搜索引擎的核心。它的效率是最高的。它是相对于正向索引而言的。它的过程为:关键词->文档的映射 。首先,它会把存入ES的文档按照设定的规则进行分词(后面会讲),分词后会把这些词进行筛选过滤,然后得到一个单词集合,然后给所有的文档也进行一个集合,给每一个文档ID,让单词集合跟文档集合去进行一个组合计算形成一个矩阵。这个矩阵就会形成一个倒排列表。比如ID为1的单词在那几个文档中的哪些行出现过。倒排索引把单词和文档都进行组合运算,然后把每个关键词在文档里边的位置还有信息,通过详细的信息记录下来,方便后面查询调取。

(13)全文搜索:对全部的文本内容进行分析,建立索引,使之可以被搜索,称为全文搜索。

(14)分词: 分词是指将文本转换成一系列单词(term or token)的过程,也可以叫做文本分析,在es里面称为Analysis

二、操作数据节点工作流程(分片之间的工作流程)

每个节点都有能力处理任意请求。每个节点都知道任意文档所在的节点,所以也可以将请求转发到需要的节点。

新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上。

ES节点数据写入过程ES节点数据写入过程
  1. 客户端给Node 1发送新建、索引或删除请求。
  2. 节点使用文档的_id确定文档属于分片0。它转发请求到Node 3,分片0位于这个节点上。
  3. Node 3在主分片上执行请求,如果成功,它转发请求到相应的位于Node 1和Node 2的复制节点上。当所有的复制节点报告成功,Node 3报告成功到请求的节点,请求的节点再报告给客户端。

三、节点分片间数据检索流程

文档能够从主分片或任意一个复制分片被检索

节点数据检索流程节点数据检索流程
  1. 客户端给Node 1发送get请求。
  2. 节点使用文档的_id确定文档属于分片0。分片0对应的复制分片在三个节点上都有。此时,它转发请求到Node 2。
  3. Node 2返回文档(document)给Node 1然后返回给客户端。

对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片——它会循环所有分片副本。

可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和复制分片都是可用的。

总结:

本节讲后面要用到的绝大部分专有名词进行了初步的讲解,后面的文章中讲更进一步阐述其原理与应用。接下来,将在API的操作中逐步诠释各重点、难点。

0 人点赞