《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.12.Reindex API(3) https://developer.aliyun.com/article/1230246
多源重建索引
如果有许多源需要重新索引,通常最好一次 Reindex 一个源的索引,而不是使用glob模式来选取多个源。这样如果出现任何的错误,你可以删除有问题部分,然后选择特定的源重新索引(dest的op_type可以设置为create只重索引缺失的文档);另外一个好处,你可以并行运行这些reindex任务。
#!/bin/bash for index in i1 i2 i3 i4 i5; do curl -H Content-Type:application/json -XPOST localhost:9200/_reindex?pretty -d'{ "source": { "index": "'$index'" }, "dest": { "index": "'$index'-reindexed" } }' done
对 Reindex 限流
设置requests_per_second为任意的正十进制数(如 1.4,6,...1000等),以限制批量操作
_reindex索引的速率。通过在每个批处理中,设置等待时间来限制请求;可以通过设置 requests_per_second=-1,来关闭限流操作。
限流是通过在每个批处理之间设置等待时间,因此 _reindex 在内部使用 scroll 的超时时间,应当将这个等待时间考虑进去。等待时间=批大小/requests_per_second - 批写入耗时;默认情况下,批处理大小为 1000,因此如果 requests_per_second 设置为500:
target_time = 1000 / 500 per second = 2 seconds
wait_time = target_time - write_time = 2 seconds - 0.5 seconds = 1.5 seconds
由于批处理是作为单个 _bulk请求发出的,因此较大的批处理大小,会导致 Elasticsearch 创建许多请求,然后等待一段时间,再开始下一组请求;这种情况可能会造成 Elasticsearch 周期性的抖动。
动态调整限流
可以使用 _rethrottle API 在正在运行的重新索引上更改requests_per_second的值:
POST _reindex/r1A2WoRbTwKZ516z6NEs5A:36619/_rethrottle?requests_per_second=-1
taskid可以通过 task API 进行获取。重新调整requests_per_second,如果是加快查询速度则可以立即生效,如果是降低查询速度,则需要在完成当前批处理后生效,这样可以避免
scroll 超时。
切片
Reindex 支持切片 scroll 以并行化重新索引过程,从而提高 Reindex 的效率。
注意:如果源索引是在远程的 Elasticsearch 集群,是不支持手动或自动切片的。
手动切片
通过为每个请求提供切片 ID 和切片总数。
示例如下:
POST _reindex { "source": { "index": "my-index-000001", "slice": { "id": 0, "max": 2 } }, "dest": { "index": "my-new-index-000001" } } POST _reindex { "source": { "index": "my-index-000001", "slice": { "id": 1, "max": 2 } }, "dest": { "index": "my-new-index-000001" } }
可以通过以下方式验证此功能:
#避免还没有形成 segments,文档不可见 GET _refresh #查看文档的个数 GET my-new-index-000001/_count #或者 POST my-new-index-000001/_search?size=0&filter_path=hits.total
返回结果如下:
{ "hits": { "total" : { "value": 120, "relation": "eq" } } }
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.12.Reindex API(5) https://developer.aliyun.com/article/1230243