温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Elasticsearch的文档的存储路由是什么

发布时间:2021-12-16 17:13:03 来源:亿速云 阅读:120 作者:柒染 栏目:大数据

Elasticsearch的文档的存储路由是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

以 Elasticsearch 7.9.2 为准。

问题

在一个索引中创建文档时,如何确定放到哪个分片中?

潜在 3 个方式:

  • 随机

  • 将文档 id 和分片编号的对应关系保存在数据库

  • 计算代替存储:按照某种算法计算出分片编号

如果采用第 1 种方式:

则创建时省事(获取随机数即可),但在查询文档时需要在多个分片中寻找文档。

如果采用第 2 种方式:

则实现起来简单、直接、可靠,但在数据量大的时候表会很大,查询比较慢。

如果采用第 3 种方式:

创建和查询时需要进行一次计算,好处是不必在维护对应关系。

ES 的实现方式

ES 采用的是第 3 种方式。

PUT /<索引名>/_doc/<id>?routing=<rk>

如上,在创建文档时指定 id 和 routing,则此文档被放到的分片编号为:

es_hash(routing) % 分片数

如果不指定 routing,则在计算时把文档 id 作为 routing。

指定 routing 的文档创建之后,会有一个 _routing 字段:

{
    "_index": "myindex",
    "_id": "aaa",
    "_routing": "myrk",
    "_source": <obj>
    // 其他字段
}

使用 routing 潜在问题以及避免方式

假定:

  • 某索引有 n >= 2 个分片。

  • es_hash("a") % n == 0

  • es_hash("r") % n == 1

依次执行:

PUT /the_index/_doc/a
PUT /the_index/_doc/a?routing=r

则 ES 中会出现 2 个 id 为 a 的文档。这绝不是使用者所期望的。

造成这样的原因是:一个 ES 分片其实是一个 Lucene 索引。同一个 Lucene 索引内部,文档的 id 保证互不相同,但多个 Lucene 索引之间无法保证这一点。

避免方式:

对于某 id 的文档,要使用 routing,就一直使用,不然就一直不使用。

关于Elasticsearch的文档的存储路由是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI