Google은 Elasticsearch 색인 중 일부에서 중복 된 문서를 발견했으며 그 원인을 해결하지 못했습니다. 영향을받는 각 문서의 복사본이 두 개 있으며 정확히 _id
, _type
및 _uid
개의 필드가 있습니다.동일한 ID를 사용하여 Elasticsearch 색인에 중복 된 문서
/index-name/document-type/document-id
에 대한 GET 요청은 하나의 복사본을 반환하지만이 같은 쿼리와 문서를 검색하는 것은 매우 놀라운 일이다이 개 결과를 반환합니다 또한 중복 문서를 식별하는 _uid
필드에 집계
POST /index-name/document-type/_search
{
"filter": {
"term": {
"_id": "document-id"
}
}
}
을 :
POST /index-name/_search
{
"size": 0,
"aggs": {
"duplicates": {
"terms": {
"field": "_uid",
"min_doc_count": 2
}
}
}
}
중복은 모두 다른 조각에 있습니다. 예를 들어, 문서는 기본 샤드 0에 하나의 사본과 기본 샤드 1에 사본 하나를 가질 수 있습니다.을 사용하여 각 샤드에서 위의 집계 쿼리를 차례로 실행하여이를 확인했습니다. 단일 문서 내에서 중복 된 것을 찾지 않습니다 사금파리.
가장 좋은 추측은 라우팅에 문제가 발생했음을 보여줍니다.하지만 사본이 다른 샤드에 어떻게 라우팅되었는지 이해할 수 없습니다. routing documentation에 따르면 기본 라우팅은 문서 ID를 기반으로하며 문서를 동일한 샤드에 일관되게 라우팅해야합니다.
기본 라우팅을 무시하는 맞춤 라우팅 매개 변수를 사용하지 않습니다. 중복 된 문서에 _routing
필드가 없는지 확인하여이 문제를 다시 확인했습니다.
라우팅에 영향을주는 상위/하위 관계도 정의하지 않습니다. (예를 들어, 우리의 문제와 동일한 증상이있는 this question in the Elasticsearch forum을 참조하십시오. 우리는 어떤 부모도 설정하지 않기 때문에 원인이 동일하지 않다고 생각합니다.)
새로운 색인으로 다시 색인화하여 즉각적인 문제를 해결했습니다. 중복 된 문서가 부숴졌습니다. 우리는 여전히 디버깅을 위해 이전 색인을 가지고 있습니다.
문제를 재현하는 방법을 찾지 못했습니다. 새 색인은 문서를 올바르게 색인화하고 있으며 문서를 업데이트하지만 더 이상 중복을 작성하지 않은 야간 처리 작업을 재실행했습니다.
클러스터에는 3 개의 노드, 3 개의 기본 샤드 및 1 개의 복제본 (즉, 3 개의 복제본 샤드)이 있습니다. minimum_master_nodes
이 2로 설정되어 있으므로 split-brain 문제가 발생하지 않습니다. 우리는 Elasticsearch 2.4를 실행 중입니다 (우리는 오래 되었음 - 곧 업그레이드 예정).
이러한 중복이 발생할 수있는 사람은 누구입니까? 디버깅 방법에 대한 제안 사항이 있습니까?