【问题标题】:Elasticsearch reindex API - Not able to reindex large number of documentsElasticsearch 重新索引 API - 无法重新索引大量文档
【发布时间】:2020-09-27 16:20:07
【问题描述】:

我正在使用 Elasticsearch 的重新索引 API 将日志从旧集群迁移到新版本 7.9.2 集群。这是我正在使用的命令。

curl -X POST "new_host:9200/_reindex?pretty&refresh&wait_for_completion=true" -H 'Content-Type: application/json' -d'
{
  "source": {
    "remote": {
      "host": "old_host:9200"
    },
    "index": "*",
    "size": 10000,    
    "query": {
      "match_all": {}      
     }
  },
  "conflicts": "proceed",
  "dest": {
    "index": "logstash"
  }
}'

这仅获取最后 10000 个文档或 1 个批次,然后请求完成。但是,我需要重新索引超过一百万个文档。有没有办法让所有匹配的文档都运行请求?是否可以设置请求中的批次数或使请求发出批次直到所有文档都被索引?

我能想到的一个选项是通过修改日期时间的查询来递归发送请求。有更好的方法吗?我可以在一个请求中获取所有匹配的文档(超过 100 万个)吗?

【问题讨论】:

    标签: elasticsearch elastic-stack reindex


    【解决方案1】:

    删除querysize 参数以获取所有数据。如果您需要使用查询仅过滤所需的文档,只需删除 size 即可获取所有匹配的日志。

    使用wait_for_completion=false 作为查询参数将返回task id,您将能够使用GET /_tasks/<task_id> 监控重新索引进度。

    如果您需要或想要将重新索引分解为多个步骤/块,请考虑使用slice feature

    顺便说一句:一个又一个索引instead all at one using * 重新索引并考虑使用每日/每月索引,因为与一个完整索引相比,恢复错误过程和管理日志保留变得更加容易。

    为了提高速度,您应该在重新索引之前将副本数减少到 0,并在目标索引中设置 refresh_interval=-1,然后重新设置值。

    curl -X POST "new_host:9200/_reindex?pretty&wait_for_completion=false" -H 'Content-Type: application/json' -d'
    {
      "source": {
        "remote": {
          "host": "old_host:9200"
        },
        "index": "index_name"
      },
      "conflicts": "proceed",
      "dest": {
        "index": "logstash"
      }
    }'
    

    基于 cmets 的更新:

    在重新索引时,至少有一个错误导致重新索引停止。该错误是由至少一个文档(id = xiB9 ...)在字段“fields.StatusCode”中具有“OK”作为值引起的。但是目标索引中的映射与导致上述异常的数据类型一样长。

    解决方案是例如将源文档的 StatusCode 更改为 200,但可能会有更多文档导致相同的错误。

    另一种解决方案是将目标索引中的映射更改为 keyword 类型 - 这需要在插入任何数据之前手动设置映射,并且可能重新索引已经存在的数据。

    【讨论】:

    • 删除查询和大小似乎不起作用。我认为在更新 1000 个文档后它以某种方式达到了极限。对于 14 份文件,我收到了例外。一旦达到 1000 条记录,任务状态将变为已完成。{"total":1134776,"updated":986,"created":0,"deleted":0,"batches":1,...... ..}
    • 因此,请求仅在 1 批后完成。有没有办法设置批次数?
    • 看来问题出在目标集群上。有什么错误吗?集群状态是什么?
    • 目标集群健康。是的,任务状态中有例外 - “type”:“illegal_argument_exception”。某些文档会出现此异常。如果上一批中有异常,API 是否有可能不发送下一批?据我所知,在我的情况下,API 只是发送 1 批。
    • 是的,重新索引会在出现错误时停止。有关更多详细信息,请参阅任务。错误信息的详细说明是什么?
    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多