如何增加 Elasticsearch 中的主分区数量
了解如何使用 split 和 reindex API 在 Elasticsearch 中增加主分片数量,以实现最佳分片扩展。
无法增加现有索引的主分区数,这意味着如果要增加主分区数,必须重新创建索引。在这种情况下,通常使用两种方法:_reindex API 和 _split API。
与 _reindex API 相比,_split API 通常是更快的方法。在进行这两项操作前, 必须停止 索引 ,否则源索引和目标索引的文档计数将不同。

方法 1 - 使用拆分 API
拆分 API 用于通过复制设置和映射现有索引来创建一个新索引,其中包含所需的主分片数量。可在创建过程中设置所需的主分区数量。在实施拆分 API 之前,应检查以下设置:
源索引必须是只读的。这意味着需要停止索引进程。
目标索引中主分区的数量必须是源索引中主分区数量的倍数。例如,如果源索引有 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。在使用这两种方法之前,必须先停止主动索引。




