【问题标题】:Elasticsearch routing: only documents with one routing key per shardElasticsearch 路由:每个分片只有一个路由键的文档
【发布时间】:2017-11-10 20:53:23
【问题描述】:

我们目前正在优化 Elasticsearch 索引的分片设置,以(意外地)缩短响应时间。目前路由键的数量等于分片的数量。我们正在寻找一种设置,其中分片中的所有文档都只有一个路由键

这就是现在的样子,应该是这样的

当前

  • shard:0 -> 路线:bmx, cyclocrosser
  • shard:1 -> 路线:track-bike
  • 分片:2 -> 路线:
  • shard:3 -> 路线:下坡

通缉

  • shard:0 -> 路线:bmx
  • shard:1 -> 路线:track-bike
  • shard:2 -> 路线:越野车
  • shard:3 -> 路线:下坡

是否有可能确保一个路由键只路由到一个分片?目前我们面临空分片,这似乎不是一个合适的解决方案。

我们知道路由是基于 5.50 版本的 Murmur(参见:Murmur3HashFunction.java)。是否有任何选项可以影响这种行为?有人可以提供更深入的见解,说明路由在内部是如何工作的。

【问题讨论】:

  • 内置路由已经实现了文档在所有分片上的平均分布。只有当每个路由值的文档数量相等时,基于特定值的自定义路由才能实现相同的效果。
  • 文档或多或少平均分布在路由键上。这就是为什么要为一个分片“分配”一个路由键的原因。
  • 您确定您的路由密钥集将永远稳定吗?即如果出于某种原因您在某个时候需要新的路由密钥会发生什么?
  • 每个分片不需要有一个路由键来提高性能。路由键的目标只是将搜索定向到一个特定的分片(而不是 5 或 6 个不同的分片),但每个分片不必有自己的路由键。
  • 是的,我知道。问题是:是否有机会在一个分片中只有一个路由键的文档?我们已经拥有具有不同路由设置的非常先进的负载计量,我们想知道我们是否可以以更严格的方式影响路由。

标签: elasticsearch routing


【解决方案1】:

总结一下结果:不可能。

为什么?要为大多数用例工作,路由不直接基于路由键,因为如果路由键的分布,文档的分布可能会以非常不平等的方式结束就是这样(不是我的情况,但总的来说可能是这样)。路由键的散列实现了这一点,即使具有特定路由的文档消失也不会最终出现在空分片中。

您可以根据所使用的散列函数 (Murmur) 的知识创建一个解决方法,但如果 Elasticsearch 团队决定更改散列函数,这可能会中断。而且这已经发生了,所以依赖这样一个隐藏的功能是不值得的。

实现这一点的唯一方法是为每个路由键创建一个索引,正如 Val 指出的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多