博客

如何增加 Elasticsearch 中的主分区数量

了解如何使用 split 和 reindex API 在 Elasticsearch 中增加主分片数量,以实现最佳分片扩展。

无法增加现有索引的主分区数,这意味着如果要增加主分区数,必须重新创建索引。在这种情况下,通常使用两种方法:_reindex API 和 _split API。

与 _reindex API 相比,_split API 通常是更快的方法。在进行这两项操作前, 必须停止 索引 ,否则源索引和目标索引的文档计数将不同。

通过重新创建索引来增加 Elasticsearch 中的分片数量

方法 1 - 使用拆分 API

拆分 API 用于通过复制设置和映射现有索引来创建一个新索引,其中包含所需的主分片数量。可在创建过程中设置所需的主分区数量。在实施拆分 API 之前,应检查以下设置:

  1. 源索引必须是只读的。这意味着需要停止索引进程。

  2. 目标索引中主分区的数量必须是源索引中主分区数量的倍数。例如,如果源索引有 5 个主分区,那么目标索引的主分区可以设置为 10、15、20,以此类推。

注意:如果只需要更改主分区编号,则首选拆分 API,因为它比 Reindex API 快得多。

实施拆分应用程序接口

创建测试索引:

POST test_split_source/_doc
{
  "test": "test"
}

源索引必须是只读的,才能进行拆分:

PUT test_split_source/_settings
{
  "index.blocks.write": true
}

设置和映射将自动从源索引中复制:

POST /test_split_source/_split/test_split_target
{
  "settings": {
    "index.number_of_shards": 3
  }
}

您可以通过以下方式检查进度:

GET _cat/recovery/test_split_target?v&h=index,shard,time,stage,files_percent,files_total

由于设置和映射是从源索引中复制的,因此目标索引是只读的。让我们启用目标索引的写操作:

PUT test_split_target/_settings
{
    "index.blocks.write": null
}

删除原始索引前,检查源索引和目标索引的 docs.count:

GET _cat/indices/test_split*?v&h=index,pri,rep,docs.count

索引名称和别名不能相同。您需要删除源索引,并将源索引名称作为别名添加到目标索引中:

DELETE test_split_source
PUT /test_split_target/_alias/test_split_source

test_split_source别名添加到test_split_target索引后,应使用

GET test_split_source
POST test_split_source/_doc
{
  "test": "test"
}

方法 2 - 使用重新索引 API

通过使用 Reindex API 创建新索引,可以给出任意数量的主分区计数。在创建具有预定主分片数量的新索引后,源索引中的所有数据都可以重新索引到这个新索引。

除了拆分 API 功能外,还可以使用 reindex AP 中的 ingest_pipeline 对数据进行操作。通过摄取管道,只有符合过滤器的指定字段才会被索引到使用查询的目标索引中。数据内容可通过简单的脚本进行更改,多个索引可合并为一个索引。

实施重新索引 API

创建测试重新索引:

POST test_reindex_source/_doc
{
    "test": "test"
}

从源索引中复制设置和映射:

GET test_reindex_source

创建包含设置、映射和所需分片数的目标索引:

PUT test_reindex_target
{
  "mappings" : {},
  "settings": {
    "number_of_shards": 10,
    "number_of_replicas": 0,
    "refresh_interval": -1
  }
}

*注意:设置 number_of_replicas:0 和 refresh_interval: -1 会提高重新索引的速度。

启动重新索引程序。设置 requests_per_second=-1 和 slices=auto 可以调整重新索引的速度。

POST _reindex?requests_per_second=-1&slices=auto&wait_for_completion=false
{
  "source": {
    "index": "test_reindex_source"
  },
  "dest": {
    "index": "test_reindex_target"
  }
}

运行 reindex API 时,您将看到 task_id。复制并使用 _tasks API 进行检查:

GET _tasks/<task_id>

重新索引完成后更新设置:

PUT test_reindex_target/_settings
{
  "number_of_replicas": 1,
  "refresh_interval": "1s"
}

删除原始索引前,请检查源索引和目标索引的 docs.count,它们应该是一样的:

GET _cat/indices/test_reindex_*?v&h=index,pri,rep,docs.count

索引名称和别名不能相同。删除源索引,并将源索引名称作为别名添加到目标索引中:

DELETE test_reindex_source
PUT /test_reindex_target/_alias/test_reindex_source

将 test_split_source 别名添加到 test_split_target 索引后,使用

GET test_reindex_source

总结

如果要增加现有索引的主分区数,则需要重新创建新索引的设置和映射。主要有两种方法:重新索引 API 和拆分 API。在使用这两种方法之前,必须先停止主动索引。

相关内容

如何在不同版本的 Elasticsearch& 集群之间迁移数据

Kofi Bartlett

介绍 Kibana 中的 Elasticsearch 查询规则用户界面

Jhon Guzmán

正确使用 JavaScript 的 Elasticsearch,第二部分

Jeffrey Rengifo

语义搜索的实现:使用 Elasticsearch 构建食谱搜索

Andre Luiz

如何在 AWS Marketplace 上部署 Elasticsearch

Eduard Martin

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用