`
m635674608
  • 浏览: 4923262 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Elasticsearch 分片交互过程分析

 
阅读更多

Elasticseach如何将数据存储到分片中

问题:当我们要在ES中存储数据的时候,数据应该存储在主分片和复制分片中的哪一个中去;当我们在ES中检索数据的时候,又是怎么判断要查询的数据是属于哪一个分片。

 

  • 数据存储到分片的过程是一定规则的,并不是随机发生的。

 

  • 规则:shard = hash(routing) % number_of_primary_shards

 

  • Routing值可以是一个任意的字符串,默认情况下,它的值为存数数据对应文档 _id 值,也可以是用户自定义的值。Routing这个字符串通过一个hash的函数处理,并返回一个数值,然后再除以索引中主分片的数目,所得的余数作为主分片的编号,取值一般在0number_of_primary_shards - 1的这个范围中。通过这种方法计算出该数据是存储到哪个分片中。

 

  • 正是这种路由机制,导致了主分片的个数为什么在索引建立之后不能修改。对已有索引主分片数目的修改直接会导致路由规则出现严重问题,部分数据将无法被检索。

 

二、主分片与复制分片如何交互

为了说明这个问题,我用一个例子来说明。

 

在上面这个例子中,有三个ESnode,其中每一个index中包含两个primary shard,每个primary shard拥有一个replica shard。下面从几种常见的数据操作来说明二者之间的交互情况。

 

1、索引与删除一个文档

 

 

这两种过程均可以分为三个过程来描述:

阶段1:客户端发送了一个索引或者删除的请求给node 1

 

阶段2node 1通过请求中文档的 _id 值判断出该文档应该被存储在shard 0 这个分片中,并且node 1知道shard 0primary shard位于node 3这个节点上。因此node 1会把这个请求转发到node 3

 

阶段3node 3shard 0 primary shard上执行请求。如果请求执行成功,它node 3将并行地将该请求发给shard 0的其余所有replica shard上,也就是存在于node 1node 2中的replica shard。如果所有的replica shard都成功地执行了请求,那么将会向node 3回复一个成功确认,当node 3收到了所有replica shard的确认信息后,则最后向用户返回一个Success的消息。

 

2、更新一个文档

 

 

该过程可以分为四个阶段来描述:

阶段1:客户端向node 1发送一个文档更新的请求。

 

阶段2:同样的node 1通过请求中文档的 _id 值判断出该文档应该被存储在shard 0 这个分片中,并且node 1知道shard 0primary shard位于node 3这个节点上。因此node 1会把这个请求转发到node 3

 

阶段3node 3从文档所在的primary shard中获取到它的JSON文件,并修改其中的_source中的内容,之后再重新索引该文档到其primary shard中。

 

阶段4:如果node 3成功地更新了文档,node 3将会把文档新的版本并行地发给其余所有的replica shard所在node中。这些node也同样重新索引新版本的文档,执行后则向node 3确认成功,当node 3接收到所有的成功确认之后,再向客户端发送一个更新成功的信息。

  

3、检索文档

CRUD这些操作的过程中一般都是结合一些唯一的标记例如:_index_type,以及routing的值,这就意味在执行操作的时候都是确切的知道文档在集群中的哪个node中,哪个shard中。

而检索过程往往需要更多的执行模式,因为我们并不清楚所要检索的文档具体位置所在, 它们可能存在于ES集群中个任何位置。因此,一般情况下,检索的执行不得不去询问index中的每一个shard

但是,找到所有匹配检索的文档仅仅只是检索过程的一半,在向客户端返回一个结果列表之前,必须将各个shard发回的小片的检索结果,拼接成一个大的已排好序的汇总结果列表。正因为这个原因,检索的过程将分为查询阶段与获取阶段(Query Phase and Fetch Phase)。

 

  • Query Phase

在最初的查询过程中,查询请求会广播到index中的每一个primary shardreplica shard中,每一个shard会在本地执行检索,并建立一个优先级队列(priority queue)。这个优先级队列是一个根据文档匹配度这个指标所排序列表,列表的长度由分页参数fromsize两个参数所决定。例如:

 

 

下面从一个例子中说明这个过程:

 

Query Phase阶段可以再细分成3个小的子阶段:

子阶段1:客户端发送一个检索的请求给node 3,此时node 3会创建一个空的优先级队列并且配置好分页参数fromsize

 

子阶段2node 3将检索请求发送给该index中个每一个shard(这里的每一个意思是无论它是primary还是replica,它们的组合可以构成一个完整的index数据)。每个shard在本地执行检索,并将结果添加到本地优先级队列中。

 

子阶段3:每个shard返回本地优先级序列中所记录的_idsort值,并发送node 3Node 3将这些值合并到自己的本地的优先级队列中,并做全局的排序。

 

  • Fetch Phase

Query Phase主要定位了所要检索数据的具体位置,但是我们还必须取回它们才能完成整个检索过程。而Fetch Phase阶段的任务就是将这些定位好的数据内容取回并返回给客户端。

 

同样也用一个例子来说明这个过程:

 

Fetch Phase过程可以分为三个子过程来描述:

子阶段1node 3获取了所有待检索数据的定位之后,发送一个mget的请求给与数据相关的shard

 

子阶段2:每个收到node 3get请求的shard将读取相关文档_source中的内容,并将它们返回给node 3

 

子阶段3:当node 3获取到了所有shard返回的文档后,node 3将它们合并成一条汇总的结果,返回给客户端。

http://my.oschina.net/galenz/blog/422189

分享到:
评论
1 楼 544139212 2018-04-26  
[size=medium][b]“更新一个文档”这部分的说法错误,ElasticSearch的文档是不能不更改的,如果需要更改,则该文档会被放入.del文件,然后重新创建一个更改后的文档,把索引指向这个更改后的文档[/size][/b]

相关推荐

    elasticsearch分片lock锁无法分配.md

    elasticsearch分片lock锁无法分配

    Elasticsearch总结.doc

    内容包括9部分 一、 Elasticsearch 简介 简单描述Elasticsearch ...五、Elasticsearch索引和分片 六、索引过程 七、Elasticsearch存储原理 八、Elasticsearch使用过程中的坑 九、Elasticsearch写一致性保障

    elasticsearch-7.17.6及对应版本IK分词

    Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,...

    (狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战)

    (狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战),包含了小狂神讲的东西,特别适合新手学习,笔记保存下来可以多看看。好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个...

    elasticsearch elasticsearch-6.2.2 elasticsearch-6.2.2.zip 下载

    elasticsearch elasticsearch-6.2.2 elasticsearch-6.2.2.zip 下载

    从SQLServer收集事件并将其保存到Elasticsearch以便进行进一步分析

    从SQL Server收集事件并将其保存到Elasticsearch以便进行进一步分析

    《Elasticsearch集成Hadoop最佳实践》

    内容共分7章,包括Hadoop、Elasticsearch、 Marvel和 Kibana 安装;通过编写 MapReduce 作业,把Hadoop数据导入 Elasticsearch;全面分析 Elasticsearch本质,如全文本搜索分析、 查询、 筛选器和聚合;使用 Kibana...

    Elasticsearch集成Hadoop最佳实践

    内容共分7章,包括Hadoop、Elasticsearch、 Marvel和 Kibana 安装;通过编写 MapReduce 作业,把Hadoop数据导入 Elasticsearch;全面分析 Elasticsearch本质,如全文本搜索分析、 查询、 筛选器和聚合;使用 Kibana...

    elasticsearch-8.2.3 windows 版本

    elasticsearch-8.2.3 windows 版本。 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的...

    7.17.1系列Elasticsearch的elasticsearch-analysis-ik分词器

    elasticsearch-analysis-ik 是一个常用的中文分词器,在 Elasticsearch 中广泛应用于中文文本的分析和搜索。下面是 elasticsearch-analysis-ik 分词器的几个主要特点: 中文分词:elasticsearch-analysis-ik 是基于...

    es docker 部署 elasticsearch.yml

    docker run --name elasticsearch7.16.3 -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.type=single-node" -v /Users/xingyue/Home/xingyue/学习/工程化/es/elasticsearch.yml:/usr/share/elastic...

    最新版本springboot集成elasticsearch

    一、概述 一般来说我们开发Elasticsearch会选择...2、elasticsearch-head (方便查看ES中的索引及数据) 3、Kibana(方便开发通过rest api 调试ES,有代码提示) 4、中文分词elasticsearch-analysis-ik (ik) 1、下载ela

    十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统.pdf

    Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能。 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索领域,但是操作复杂繁琐,总是让开发者敬而远之。而 Elasticsearch将 Lucene 作为...

    ES主分片和副本数据大小不一样的情况

    很多认为Elasticsearch(以下简称ES),同一个分片的主分片和副本分片文档数量肯定是样的,数据大小也是一样的。 这个其实值说对了一半,文档数量是一阳台的没错,但是数据大小不一定一样。 产生这种现象的原因在于,...

    elasticsearch-analysis-bosonnlp, ElasticSearch的BosonNLP分析.zip

    elasticsearch-analysis-bosonnlp, ElasticSearch的BosonNLP分析 玻森数据中文分析器ElasticSearch插件( Beta版)ElasticSearch官网安装说明 https://www.elastic.co/guide/en/elasticsearch/guide/1.x/_instal

    Elasticsearch的分布式架构、负载均衡、高可用以及容错性看这一篇就够了

    开箱即用,简单粗暴...我们本机启动两个es实例,也就是两个node节点,默认集群名称是elasticsearch,所以他会自动将这两个node凑成一个集群,我们什么都不用配置,它自动发现。shard负载均衡假设我们有1个index,

    elasticsearch-6.7.0

    ElasticSearch(ES)2019最新版下载。Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,...

    Elasticsearch分片原理

    代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改,这里和索引分片的...

Global site tag (gtag.js) - Google Analytics