【问题标题】:Reduce number of shards in ElasticSearch减少 ElasticSearch 中的分片数量
【发布时间】:2017-05-03 02:11:45
【问题描述】:

创建索引后是否可以减少 ElasticSearch 搜索引擎中的分片数量?

我试过了:

$ curl -XPUT 'localhost:9200/myindex/_settings' -d '{"index" : {"number_of_shards" : 3}}'

但它给出了一个错误:

{"error":"ElasticsearchIllegalArgumentException[can't change the number of shards for an index]","status":400}

【问题讨论】:

  • 你用的是什么版本的es?
  • @eliasah 在我的开发服务器上:版本:1.4.4,构建:c88f77f/2015-02-19T13:05:36Z,JVM:1.7.0_75
  • 您唯一的选择是使用更少的分片创建新索引,并使用 stream2es 等工具将旧索引中的所有数据重新索引到新索引

标签: elasticsearch


【解决方案1】:

这不再是真的,在 5.x 中,您可以将索引数量缩减为整数部分。例如,您可以从 12 下降到 1、2、3 或 6(请参阅docs)。但是你必须把它设置为只读模式,自然收缩过程需要大量的IO。

【讨论】:

    【解决方案2】:

    不,这是不可能的。你可以改变很多东西 - 例如每个分片的副本数,或许多其他索引设置,但不是分片数。

    欲了解更多信息 - 看看这里 - http://www.elastic.co/guide/en/elasticsearch/reference/1.5/indices-update-settings.html

    【讨论】:

      【解决方案3】:

      好的。就像@Mysterion 所说,不可能通过索引更新直接更改零停机时间的分片数量。但是还有另一种方法。

      在使用所需数量的分片创建旧索引后,您需要将旧索引重新索引到新索引中。 (就像我说的没有零停机时间)

      为此,您可以使用 Scroll Search API

      虽然搜索请求返回单个“页面”结果,但滚动 API 可用于从单个搜索请求中检索大量结果(甚至所有结果),其方式与使用光标在传统数据库上。

      滚动并非用于实时用户请求,而是用于处理大量数据,例如为了将一个索引的内容重新索引到具有不同配置的新索引中。

      客户端支持滚动和重新索引: 一些官方支持的客户端提供帮助程序来帮助滚动搜索和将文档从一个索引重新索引到另一个:

      Perl 见Search::Elasticsearch::BulkSearch::Elasticsearch::Scroll

      Python 见elasticsearch.helpers.*

      有关 Scroll Search API 的更多信息,我建议使用 official documentation

      你可能还想看看这个答案here,也许它也可以给你一些想法,以防你使用Java。

      【讨论】:

      • 您可以使用github.com/taskrabbit/elasticsearch-dump 将数据复制到具有正确分片数的新索引,然后删除旧索引。该程序比尝试直接使用滚动搜索 api 更容易
      • 这是一个非常好的项目,但是当您的索引中有数千万个文档时,它会非常慢。我已经使用官方 python API 对优化扫描和滚动进行了基准测试,后者的运行速度提高了 10 倍(至少)。因此我会让你判断;-)
      • 你需要增加batch size,默认100会变慢。另外,我的第一次运行大约需要 2 个小时,第二次运行需要 35 分钟......所以索引缓存会产生巨大的差异
      猜你喜欢
      • 2019-12-20
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多