Elasticsearchインデックスの中に重複した文書がいくつか見つかりましたが、原因を解決できませんでした。影響を受ける各文書のコピーが2つあり、それらはまったく同じ_id
,_type
および_uid
フィールドを持っています。同一の_uidを持つ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つのコピーを持ち、プライマリシャード1に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を実行しています(私たちは古いと知っています - すぐにアップグレードを予定しています)。
これらの重複の原因は何ですか?デバッグ方法の提案はありますか?