【发布时间】: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