Odkryliśmy kilka duplikatów dokumentów w jednym z naszych indeksów Elasticsearch i nie byliśmy w stanie ustalić przyczyny. Istnieją dwie kopie każdego z dotkniętych dokumentów i mają dokładnie te same pola: _id
, _type
i .Powielanie dokumentów w indeksie Elasticsearch z tym samym _uid
GET Żądanie /index-name/document-type/document-id
prostu zwraca jeden egzemplarz, ale szukając dokumentu z zapytaniem jak to zwraca dwa wyniki, co jest dość zaskakujące:
POST /index-name/document-type/_search
{
"filter": {
"term": {
"_id": "document-id"
}
}
}
Agregacja na polu _uid
również identyfikuje duplikaty dokumentów :
POST /index-name/_search
{
"size": 0,
"aggs": {
"duplicates": {
"terms": {
"field": "_uid",
"min_doc_count": 2
}
}
}
}
Wszystkie duplikaty znajdują się na różnych odłamkach. Na przykład dokument może mieć jedną kopię w elemencie głównym 0 i jedną kopię w elemencie głównym 1. Zweryfikowaliśmy to, uruchamiając kwerendę zbiorczą powyżej dla każdego fragmentu po kolei, używając preference parameter: nie znaleziono żadnych duplikatów w jednym pliku czerep.
Nasze najlepsze przypuszczenie jest takie, że coś poszło nie tak z routingiem, ale nie rozumiemy, w jaki sposób kopie mogły zostać przekierowane na różne odłamki. Zgodnie z routing documentation, domyślne trasowanie jest oparte na identyfikatorze dokumentu i powinno konsekwentnie kierować dokument do tego samego fragmentu.
Nie używamy niestandardowych parametrów routingu, które przesłoniłyby domyślny routing. Sprawdziliśmy to dwukrotnie, upewniając się, że duplikaty dokumentów nie mają pola _routing
.
Nie definiujemy również żadnych relacji rodzic/dziecko, które wpłynęłyby również na routing. (Patrz np. this question in the Elasticsearch forum, który ma takie same objawy, jak nasz problem. Nie uważamy, że przyczyna jest taka sama, ponieważ nie ustalamy żadnych rodziców dokumentu).
Naprawiliśmy natychmiastowy problem poprzez ponowne indeksowanie do nowego indeksu, który zgniecenia duplikatów dokumentów. Nadal mamy stary indeks do debugowania.
Nie znaleźliśmy sposobu na replikację problemu. Nowy indeks poprawnie indeksuje dokumenty i próbowaliśmy ponownie wykonać zadanie przetwarzania całonocnego, które również aktualizuje dokumenty, ale nie utworzyło więcej duplikatów.
Klaster ma 3 węzły, 3 odłamki podstawowe i 1 replikę (czyli 3 odłamki repliki). minimum_master_nodes
jest ustawiony na 2, co powinno zapobiec problemowi split-brain. Używamy Elasticsearch 2.4 (co wiemy, że jest stare - planujemy wkrótce uaktualnić).
Czy ktoś wie, co może spowodować te duplikaty? Czy masz jakieś sugestie dotyczące sposobów debugowania go?