如何增加 Elasticsearch 中的主分片数量
要增加现有索引的主分片数量,直接修改是不可能的。因此,如果你想增加主分片的数量,必须重新创建索引。通常有两种方法:_reindex API 和 _split API。
在这两种方法中,_split API 通常比 _reindex API 更快。在操作之前,必须停止索引操作,否则源索引和目标索引的文档数量会不一致。
方法1 – 使用 split API
通过 split API 可以复制现有索引的设置和映射,创建一个具有所需主分片数量的新索引。在实施 split API 之前,需要检查以下设置:
- 源索引必须是只读的,这意味着必须停止索引过程。
- 目标索引的主分片数量必须是源索引主分片数量的倍数。例如,如果源索引有5个主分片,则目标索引的主分片可以设置为10、15、20等。
注意:如果仅需更改主分片数量,split API 是首选,因为它比 Reindex API 快得多。
实施 split API
创建一个测试索引:
代码语言:javascript代码运行次数:0运行复制POST test_split_source/_doc
{
"test": "test"
}
将源索引设置为只读:
代码语言:javascript代码运行次数:0运行复制PUT test_split_source/_settings
{
"index.blocks.write": true
}
设置和映射将自动从源索引复制:
代码语言:javascript代码运行次数:0运行复制POST /test_split_source/_split/test_split_target
{
"settings": {
"index.number_of_shards": 3
}
}
你可以通过以下命令检查进度:
代码语言:javascript代码运行次数:0运行复制GET _cat/recovery/test_split_target?v&h=index,shard,time,stage,files_percent,files_total
由于设置和映射是从源索引复制的,目标索引是只读的。让我们启用目标索引的写操作:
代码语言:javascript代码运行次数:0运行复制PUT test_split_target/_settings
{
"index.blocks.write": null
}
在删除原始索引之前,检查源和目标索引的文档数量:
代码语言:javascript代码运行次数:0运行复制GET _cat/indices/test_split*?v&h=index,pri,rep,docs.count
索引名和别名不能相同。你需要删除源索引,并将源索引名作为别名添加到目标索引:
代码语言:javascript代码运行次数:0运行复制DELETE test_split_source
PUT /test_split_target/_alias/test_split_source
添加test_split_source别名到test_split_target索引后,你应该测试它:
代码语言:javascript代码运行次数:0运行复制GET test_split_source
POST test_split_source/_doc
{
"test": "test"
}
方法2 – 使用 reindex API
通过 reindex API 创建一个新索引时,可以指定任意数量的主分片。在创建具有预期主分片数量的新索引后,可以将源索引中的所有数据重新索引到这个新索引中。
除了 split API 的功能外,reindex API 允许使用 ingest_pipeline 操作数据。在 reindex API 中,通过 ingest 管道,只有符合过滤条件的指定字段会被索引到目标索引。数据内容可以通过 painless 脚本进行更改,并且多个索引可以合并为一个索引。
实施 reindex API
创建一个测试索引:
代码语言:javascript代码运行次数:0运行复制POST test_reindex_source/_doc
{
"test": "test"
}
复制源索引的设置和映射:
代码语言:javascript代码运行次数:0运行复制GET test_reindex_source
创建一个具有设置、映射和所需分片数量的目标索引:
代码语言:javascript代码运行次数:0运行复制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
。复制该 ID 并通过 _tasks API 检查:
GET _tasks/<task_id>
在重新索引完成后更新设置:
代码语言:javascript代码运行次数:0运行复制PUT test_reindex_target/_settings
{
"number_of_replicas": 1,
"refresh_interval": "1s"
}
在删除原始索引之前,检查源和目标索引的文档数量,它们应该相同:
代码语言:javascript代码运行次数:0运行复制GET _cat/indices/test_reindex_*?v&h=index,pri,rep,docs.count
索引名和别名不能相同。删除源索引,并将源索引名作为别名添加到目标索引:
代码语言:javascript代码运行次数:0运行复制DELETE test_reindex_source
PUT /test_reindex_target/_alias/test_reindex_source
在将 test_reindex_source 别名添加到 test_reindex_target 索引后,使用以下命令测试:
代码语言:javascript代码运行次数:0运行复制GET test_reindex_source
总结
如果你想增加现有索引的主分片数量,必须将设置和映射重新创建到新索引中。有两种主要方法可以实现这一点:reindex API 和 split API。在使用任何一种方法之前,必须停止活动索引。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1747558410a4653081.html
评论列表(0条)