ElasticSearch(二)ElasticSearch 增删改查的工作原理

ElasticSearch创建索引/写入数据的原理

  1. 第一步客户端请求ElasticSearch的时候,由于ElasticSearch中的每个节点上都保存着分片的元数据,这个元数据记录着分片数据存储在哪个节点上。
  2. 第二步客户端向ElasticSearch集群发送创建索引写入数据的时候,被请求到的节点会通过路由算法将请求转发到对应的节点上。
  3. 第三步接收到请求的节点首先会将Document写入到内存缓存中,并且同时将Document写入到translog中,如果请求在主分片上成功被处理,那么该请求会并行的发送到分片的副本上并且translog同步到分片副本上,等到translog全部同步到了主分片以及全部的副本上,客户端才会收到确认通知。
  4. 第四步内存缓存区会定期(默认1秒)的将Document写入到segment file(分段文件)中,也就是每一秒都会产生新的segment file,此时新的segment立马写入(写入之前会有一个合并segment文件的过程,默认的将3个相似大小的segment文件合并成一个segment文件)文件系统的缓存中(并未写入到实际的文件系统中),然后内存缓存会被清空,这个文件系统缓存中的数据可以被搜索。
  5. 第五步translog(每5秒将数据刷新到磁盘)达到阈值或者每30分钟的时候,会发生Flush操作,首先会执行commit操作,将内存中的数据全部写入到segment file中,然后强行将文件系统中缓存数据写入到磁盘中,然后清空translog数据,这就完成了数据的持久化。
  6. 第六步文件系统的缓存数据丢失后,可以根据translog里边存储的上一次refresh之后的数据记录进行恢复。
  7. 为了保证Translog文件本身不会出现数据丢失的问题,当每次对索引进行操作的时候,一定会触发Translog的刷新操作,将Translog刷新到磁盘上,才会想客户端发发送200的状态码,保证数据的请求成功,因此也降低了一点的性能。在这里插入图片描述

ElasticSearch查询索引的原理

查询ES数据需要两个步骤,第一个是查询阶段,所谓的查询阶段就是查询文件的轻量级结果返回给协调节点,然后协调节点统一排序,然后在进入真正获取文档阶段。第二是获取阶段,所谓的过获取阶段就是经过协调节点的排序,确立的文档的优先级,去分片中真正获取文档的过程。
查询阶段,当我们向ES集群发送请求的时候,一定会有一个节点接收到这个请求,那么接受到请求的这个节点就会成为一个协调节点,协调节点会根据路由算法,将请求转发到所以对应的所有分片上,分片独立执行搜索,并根据相关性分数创建一个优先级队列,然后所有分片将轻量级结果返回给协调节点,这个结果包含文档的Id和进行排序所需的信息,然后协调节点接收到所有分片返回来的结果,对文档进行全局的排序,目前为止查询阶段已经完成。
获取阶段,协调节点对文档进行全局排序过后,生成全局文档列表,他会从所有分片中请求原始的文档,所以分片会继续丰富文档,返回给协调节点,协调节点会将数据返回给客户端。
在这里插入图片描述

ElasticSearch更新删除索引的原理

在ElasticSearch中文档是不可改变的,所以呢更新索引和删除索引也是写操作,也就是不在原来的索引上做改动。
ElasticSearch中,每一个segment都会对应一个.del文件,当我们请求删除一个文档的时候,文档并没有被真是的删除,而是在.del中被标记为删除,但是这个文档还是可以被索引到的,只不过是将它在搜索结果中过滤掉了。当触发segment合并的时候,被标记为删除的segment文件不会合并的新的segment文件中,这样该文档就会彻底删除了。
更新文档的时候也是如此,当一个文档被插入的时候,ES会自动给他生成一个版本号,当对文档更新的时候,旧的版本的文档会被标记为删除,新文档会写入新的segment文件中,等到segment刷新到磁盘的时候,更新就完成了。

ElasticSearch路由原理

Shard分片

我们都是知道ElasticSearch是分布式的搜索引擎,那么它是怎么做到分布式的呢?那我们就需要引入一个Shard(分片)的概念,Shard(分片)又分为Primary Shard和Replic Shard。所谓的Shard(分片)就是存储数据的容器,当请求插入一条索引的时候,这个容器(Primary Shard)就已经创建好了,默认是5个,然后这些容器(Primary Shard)会均匀的散落在各个ES节点上。所以它的分布式原理就在这了。

Shared路由

当开始插入数据的时候,ES会根据路由算法计算请求的Document存入哪个容器(Primary Shard)中。具体的路由算法是hash(routing)%number_of_primary_shardsrouting就是Document的_id,number_of_primary_shard就是Primary的分片数据量。例如一个Index有3个Primary Shard分别为P0,P1,P2。routing=1,然后hash(1)%3=0,那么Document就会被分到P0这个Shard上去。查询也是这个原理。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值