【问题标题】:Duplicate documents in Elasticsearch index with the same _uidElasticsearch 索引中具有相同 _uid 的重复文档
【发布时间】:2018-04-15 09:29:01
【问题描述】:

我们在我们的 Elasticsearch 索引之一中发现了一些重复的文档,但我们无法找出原因。每个受影响的文档都有两个副本,它们具有完全相同的 _id_type_uid 字段。

/index-name/document-type/document-id 的 GET 请求只返回一个副本,但是使用这样的查询搜索文档会返回两个结果,这非常令人惊讶:

POST /index-name/document-type/_search
{
  "filter": {
    "term": {
      "_id": "document-id"
    }
  }
}

_uid 字段上进行聚合还可以识别重复文档:

POST /index-name/_search
{
  "size": 0,
  "aggs": {
    "duplicates": {
      "terms": {
        "field": "_uid",
        "min_doc_count": 2
      }
    }
  }
}

重复项都在不同的分片上。例如,一个文档可能在主分片 0 上有一个副本,在主分片 1 上有一个副本。我们已经通过使用preference parameter 依次在每个分片上运行上述聚合查询来验证这一点:它没有在其中找到任何重复项一个分片。

我们最好的猜测是路由出了问题,但我们不明白如何将副本路由到不同的分片。根据routing documentation,默认路由是基于文档ID,并且应该一致地将文档路由到同一个分片。

我们没有使用会覆盖默认路由的自定义路由参数。我们通过确保重复的文档没有_routing 字段对此进行了仔细检查。

我们也没有定义任何会影响路由的父/子关系。 (例如,请参阅this question in the Elasticsearch forum,它与我们的问题具有相同的症状。我们认为原因不一样,因为我们没有设置任何文档父级)。

我们通过重新索引到新索引来解决直接问题,该索引压缩了重复的文档。我们仍然有旧的索引可供调试。

我们还没有找到重现问题的方法。新索引正在正确索引文档,我们已尝试重新运行通宵处理作业,该作业也会更新文档,但它没有创建更多重复项。

集群有 3 个节点、3 个主分片和 1 个副本(即 3 个副本分片)。 minimum_master_nodes 设置为 2,这应该可以防止 split-brain 问题。我们正在运行 Elasticsearch 2.4(我们知道它已经过时 - 我们计划很快升级)。

有谁知道可能导致这些重复的原因吗?您对调试方法有什么建议吗?

【问题讨论】:

    标签: elasticsearch elasticsearch-2.0


    【解决方案1】:

    我们找到了答案!问题是索引意外地切换了它用于路由的哈希算法,这导致一些更新的文档被存储在不同的分片上,而不是原来的版本。

    /index-name/_settings 的 GET 请求揭示了这一点:

    "version": {
      "created": "1070599",
      "upgraded": "2040699"
    },
    "legacy": {
      "routing": {
        "use_type": "false",
        "hash": {
          "type": "org.elasticsearch.cluster.routing.DjbHashFunction"
        }
      }
    }
    

    “1070599”指的是 Elasticsearch 1.7,“2040699”指的是 ES 2.4。

    看起来索引试图将自身从 1.7 升级到 2.4,尽管事实上它已经在运行 2.4。这是此处描述的问题:https://github.com/elastic/elasticsearch/issues/18459#issuecomment-220313383

    我们认为这是触发变化的原因:

    1. 当我们将索引从 ES 1.7 升级到 2.4 时,我们决定不就地升级 Elasticsearch,因为这会导致停机。相反,我们创建了一个单独的 ES 2.4 集群。

      我们使用复制所有索引设置和数据的工具将数据加载到新集群中,包括 you should not set in ES 2.4version 设置。

    2. 在处理最近的问题时,我们碰巧关闭并重新打开了索引。这通常会保留所有数据,但由于 version 设置不正确,导致 Elasticsearch 认为正在处理升级。

    3. 由于错误升级,ES 自动设置legacy.routing.hash.type 设置。这意味着在此之后索引的任何数据都使用旧的DjbHashFunction,而不是最初用于路由数据的默认Murmur3HashFunction

    这意味着将数据重新编入新索引是解决问题的正确做法。新索引具有正确的版本设置,并且没有旧的哈希函数设置:

    "version": {
      "created": "2040699"
    }
    

    【讨论】:

    • 我正面临重复文档问题并更改了索引设置,请在下面找到 {"my_index":{"settings":{"index":{"creation_date":"1494238950630" ,"legacy":{"routing":{"hash":{"type":"org.elasticsearch.cluster.routing.Murmur3HashFunction"},"use_type":"false"}},"number_of_shards":"5" ,"number_of_replicas":"1","uuid":"V9wzTXHoTbGwALq2C9HdyA","version":{"created":"1070099","upgraded":"2040699"}}}}}。更改设置后,仍然面临同样的问题。你能告诉我正确的解决方法吗?
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 2021-04-09
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多