ElasticSearch 内部原理之分布式文档存储

Posted @SmartSi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch 内部原理之分布式文档存储相关的知识,希望对你有一定的参考价值。

ElasticSearch版本: 2.x

之前的文章中,我们已经知道如何存储数据到索引中以及如何检索它。但是我们掩盖了数据存储到集群中以及从集群中获取数据的具体实现的技术细节。

1. 路由文档到分片中

当你索引一篇文档时,它会存储到一个主分片中。但是 ElasticSearch 如何知道文档是属于哪个分片呢?当我们创建一个新的文档,它是怎么知道它是应该存储到分片1上还是分片2上?

数据存储到分片的过程是有一定规则的,并不是随机发生的,因为我们日后还需要从分片中检索出文档。数据存储过程取决于下面的公式:

shard = hash(routing) % number_of_primary_shards

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

这就解释了为什么主分片个数在创建索引之后就不能再更改了:如果主分片个数在创建之后可以修改,那么之前所有通过公式得到的值都会失效,之前存储的文档也可能找不到。

有的人可能认为,

以上是关于ElasticSearch 内部原理之分布式文档存储的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch Scroll 游标搜索

Es官方文档整理-2.分片内部原理

ElasticSearch探索之路分布式原理:分布式路由存储搜索原理

ElasticSearch探索之路分布式原理:分布式路由存储搜索原理

Elasticsearch学习总结--原理篇

flask-web—— 搜索系统Elasticsearch分布式搜索引擎原理分片与集群IK中文分析器索引与文档Logstash导入数据与查询