2017-11-02 11 views
5

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를 실행 중입니다 (우리는 오래 되었음 - 곧 업그레이드 예정).

이러한 중복이 발생할 수있는 사람은 누구입니까? 디버깅 방법에 대한 제안 사항이 있습니까?

답변

3

답변을 찾았습니다! 문제는 라우팅에 사용 된 해싱 알고리즘이 예기치 않게 전환 되었기 때문에 일부 업데이트 된 문서가 다른 샤드에 원래 버전으로 저장되는 것입니다.

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

"1,070,599"는 1.7 Elasticsearch를 지칭하고, "2040699"은 ES 2.4 :

/index-name/_settings에 대한 GET 요청이 밝혀.

색인이 1.7에서 2로 업그레이드하려고 시도한 것처럼 보입니다.4, 이미 실행 중임에도 불구하고 2.4. 우리는이 변화 트리거 무슨 일이 있었는지 생각 https://github.com/elastic/elasticsearch/issues/18459#issuecomment-220313383

:이 여기에 설명 된 문제, 우리가 Elasticsearch를 업그레이드하지 않기로 결정했다 우리가 2.4 ES 1.7에서 인덱스를 업그레이드 할 때 돌아 가기

  1. 을 인 - 장소, 그것은 가동 불능 시간을 초래할 것이기 때문에. 대신 별도의 ES 2.4 클러스터를 만들었습니다.

    version 설정 인 you should not set in ES 2.4을 포함하여 모든 인덱스 설정과 데이터를 복사 한 도구를 사용하여 새 클러스터에 데이터를로드했습니다.

  2. 최근 문제를 처리하는 동안 우연히 색인을 닫았다가 다시 열었습니다. 일반적으로 모든 데이터가 유지되지만 잘못된 version 설정으로 인해 Elasticsearch에서 업그레이드가 처리되었다고 생각하게되었습니다.

  3. ES는 잘못된 업그레이드로 인해 legacy.routing.hash.type 설정을 자동으로 설정합니다. 즉,이 지점 이후에 색인 된 모든 데이터는 원래 데이터를 라우팅하는 데 사용 된 Murmur3HashFunction 기본값 대신 이전 DjbHashFunction을 사용했습니다.

즉, 데이터를 새 인덱스로 다시 인덱싱하는 것이 문제를 해결하기위한 올바른 방법입니다. 새 색인의 버전 설정은 정확하며 기존 해시 기능 설정은 없습니다.

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