【ElasticSearch】基础概念

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的ElasticSearch专栏,本篇博客由B战尚硅谷的ElasticSearch视频总结而来,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

1 核心概念

1.1 索引(Index)

  es索引 mysql数据库
  索引就是一个拥有几个相似特征的文档的集合。索引使用名字来标识(必须全部是小写字母),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。
  能搜索的数据就必须索引,这样的好处是可以提高查询速度,比如:新华字典前面的目录就是索引的意思,目录可以提高查询速度。
Elasticsearch 索引的精髓:一切设计都是为了提高搜索的性能。

1.2 类型(Type)

  es类型 mysql表
  在ElasticSearch7.x 版本及以上,默认不再支持自定义索引类型(默认类型为:_doc

1.3文档(Document)

  es文档 mysql行(也就是一条数据)
  文档是一个可被索引的基础信息单元,也就是一条数据。文档以 JSON(Javascript Object Notation)格式来表示,而 JSON 是一个
到处存在的互联网数据交互格式。在一个 index 里面,你可以存储任意多的文档。

1.4 字段(Field)

  es字段 mysql列
对文档数据根据不同属性进行的分类标识。

1.5 映射(Mapping)

  es映射 mysql数据结构
  mapping 是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等等。这些都是映射里面可以设置的,其它就是处理 ES 里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。

1.6 分片(Shards)

  es分片 mysql分表
  一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有 10 亿文档数据的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,每一份就称之为分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
  分片很重要,主要有两方面的原因:
  1)允许你水平分割 / 扩展你的内容容量。
  2)允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
  至于一个分片怎样分布,它的文档怎样聚合和搜索请求,是完全由 Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的,无需过分关心。被混淆的概念是,一个 Lucene 索引 我们在 Elasticsearch 称作 分片 。 一个Elasticsearch 索引 是分片的集合。 当 Elasticsearch 在索引中搜索的时候, 他发送查询到每一个属于索引的分片(Lucene 索引),然后合并每个分片的结果到一个全局的结果集。

1.7 副本(Replicas)

  es副本 mysql集群的副本拷贝
  在一个网络 / 云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)。
  复制分片之所以重要,有两个主要原因:
   在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。
   扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。

1.8 分配(Allocation)

  将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分片复制数据的过程。这个过程是由 master 节点完成的。

2 es集群

2.1 系统架构

在这里插入图片描述
  一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
  当一个节点被选举成为主节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。
  作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回。

2.2 故障转移

  当集群中只有一个节点在运行时,意味着这个集群存在单点故障问题,也就是说当这个节点出故障,整个集群就会不可用。我们只需再启动一个与第一个节点有同样的 cluster.name 配置的节点,即可增加集群中的节点数量。
  如果一个集群中启动了多个节点,那么主分片和副本分片将会被分配到不同的节点上,一次做到将故障转移,一个节点挂掉其数据副本所在节点依然可以继续提供服务。
在这里插入图片描述

2.3 水平扩容

  主分片的数目在索引创建时就已经确定了下来。实际上,这个数目定义了这个索引能够存储 的最大数据量。但是,读操作——搜索和返回数据——可以同时被主分片 或 副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。
  上面我们使用三个节点使得三个主分片及其副本分片分布的更加分散,但是这就造成了一个问题,每个节点都会有空间的损失,这时候我们可以通过增加每个主分片的副本分片数量来提高数据的处理速度。

{
 "number_of_replicas" : 2
}

在这里插入图片描述

2.4 应对故障

  当起集群中的主节点因为某些问题挂掉的时候,那么集群将会重新选举剩余好的节点中的一个来作为新的主节点,并将这个新主节点上分片设置为主分片。
在这里插入图片描述
当挂掉的节点再次启动之后,将会作为一个普通节点存在在集群中,而非一个主节点在这里插入图片描述

2.5 路由计算、分片控制

  路由计算: 当在索引中创建文档的时候,文档会被存储到集群中的一个主分片里。es通过以文档_id值为参数的hash()函数得到hash值,然后再用hash值除以主分片的数量后得到余数, 而这个余数就是创建文档所存储的分片位置。
  分片控制: 由于es集群所有主分片和副本分片都不在同一个节点,于是我们可以发送请求到集群中的任一节点, 每个节点都能返回正确的数据。如果将所有的请求发送到同一个节点例如Node 1,我们将其称为我们将其称为协调节点。当发送请求的时候,为了扩展负载,更好的做法是轮询集群中所有的节点

2.6 数据增删改查流程

写、删除数据流程

  1. 客户端向集群中的任意节点(协调节点)发送新建、删除请求。
  2. 协调节点通过文档的 _id 确定该文档属于分片几 ,并将该请求转发到该分片的主分片所在节点。
  3. 被转发到的节点的主分片上执行请求。如果成功了,它将请求并行转发到其他节点的副本分片上。一旦所有的副本分片都报告成功,被转发到的节点就会向协调节点报告成功,协调节点向客户端报告成功。

  上述写数据的操作可以通过参数进行调整,已获得更大的性能,请参考下面表格:

参数含义
consistencyconsistency,即一致性。one(主分片状态 ok 就允许执行写操作),all(主分片和所有副本分片的状态没问题才允许执行写操作), 或quorum(大多数的分片副本状态没问题就允许执行写操作),默认为quorum
timeout如果没有足够的副本分片es会等待更多的分片出现。默认情况下,它最多等待 1 分钟。你可以通过timeout 参数使它更早终止。

读数据流程

  1. 客户端向集群中的任意节点(协调节点)发送查询请求。
  2. 协调节点通过文档的 _id 确定该文档属于分片几 ,并确定该分片的主分片以及所有副本分片所在的节点位置。
  3. 为了负载均衡,轮询上步得到的所有节点的主分片以及副本分片。
  4. 轮询到的节点将文档返回给协调节点,然后协调节点将文档返回给客户端。

  在处理读取请求时,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡。在文档被检索时,已经被索引的文档可能已经存在于主分片上但是还没有复制到副本分片。 在这种情况下,副本分片可能会报告文档不存在,但是主分片可能成功返回文档。 一旦索引请求成功返回给用户,文档在主分片和副本分片都是可用的。

修改数据流程

  1. 客户端向集群中的任意节点(协调节点)发送修改请求。
  2. 协调节点通过文档的 _id 确定该文档属于分片几 ,并将该请求转发到该分片的主分片所在节点。
  3. 被转发节点会修改_source字段中的JSON值,并且尝试重新索引主分片的文档。
  4. 如果文档已经被另一个进程修改,它会重试步骤 3 ,超过 retry_on_conflict 次后放弃。
  5. 如果 Node 3 成功地更新文档,它将新版本的文档并行转发到其他节点上的副本分片,重新建立索引。
  6. 一旦所有副本分片都返回成功,被转发节点向协调节点返回成功,协调节点向客户端返回成功

3 es进阶

3.1 分片

  分片是 Elasticsearch 最小的工作单元。传统的数据库每个字段存储单个值,但这对全文检索并不够,文本字段中的每个单词需要被搜索,对数据库意味着需要单个字段有索引多值的能力,所以就用到了倒排索引的数据结构。
  elasticsearch搜索引擎是建立在lucene全文搜索库的基础之上。

3.2 正、倒排索引

  正向索引、反向索引又被称为是正排索引和倒排索引。
  MySQL使用的是正排索引,也就是通过一个索引查到数据,在进行一个模糊查询查到我们需要的数据;ES使用的是倒排索引,也就是一个关键词会映射到多个文件,通过关键字查询到这些文件,再筛选出结果数据。

  词条:索引中最小的存储和查询单元,也就是分词器拆分之后形成的一个个不重复的词,英文中一般是一块空格分割的单词,中文则是较为复杂的词组。
  词典:词条的集合,记录所有文档的单词,一般都比较大,还会记录单词到倒排列表的关联信息。
  倒排表:记录了单词对应的文档集合,由倒排索引项组成。倒排索引项包含如下信息:

  • 文档ID:该词条对应所在文档的id
  • 单词频率TF:该词条在该文档中的出现次数
  • 位置Position:该词条在文档中分词的位置
  • 偏移Offset:该词条在文档的开始和结束位置

这么一来就可以根据词条找到对应的文档id集合,并根据TF频率来决定展示的优先级,通过位置和偏移量确定词条在文档中的位置。

3.3 文档搜索

  早期的全文检索会为整个文档集合建立一个很大的倒排索引并将其写入到磁盘。 一旦索引更新旧的就会被其替换,这样最近的变化便可以被检索到。
  倒排索引被写入磁盘后是不可改变 的:它永远不会修改,只能通过索引更新将旧的覆盖。这么做的好处是:

  • 不需要锁。如果你从来不更新索引,你就不需要担心多进程同时修改数据的问题。
  • 读取数据性能高。一旦索引被读入内核的文件系统缓存,便会留在哪里,由于其不变性,只要文件系统缓存中还有足够的空间,那么大部分读请求会直接请求内存,而不会命中磁盘。这提供了很大的性能提升。

  这么做虽然有以上优势,但是当索引需要更新的时候就会造成速率很低,于是需要使用到动态更新索引来提高索引更新时的效率。
  用更多的索引。通过增加新的补充索引来反映新近的修改,而不是直接重写整个倒排索引。每一个倒排索引都会被轮流查询到,从最早的开始查询完后再对结果进行合并。
  当一个文档被 “删除” 时,它实际上只是在 .del 文件中被标记 删除,它仍然可以被查询匹配到但它不会出现在最终的结果集中。文档更新也是类似的操作方式:当一个文档被更新时,旧版本文档被标记删除,文档的新版本被索引到一个新的段中, 可能两个版本的文档都会被一个查询匹配到,但被删除的那个旧版本文档在结果集返回前就已经被移除。

文档删除相当于MySQL中的逻辑删除,文档更新相当于将原来的文档逻辑删除,再添加新的文档到新的索引中

3.4 数据持久化磁盘机制

参考博客地址:https://blog.csdn.net/weixin_48794441/article/details/131897621

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扎哇太枣糕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值