奇妙な問題 -- cursorMarkを使って結果を取得すると、numFoundよりも少ないドキュメントしか得られない

トピック作成者:ks-solruserml-bot (2024/08/24 22:13 投稿)
2
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/zpr3ck0npoygqkymq39dv4b1bohztlvh into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

ソース: Solr 4.7 SolrCloud、コレクション内に3つのシャード、7つのレプリカがあります。
ターゲット: Solr 9.1.1 SolrCloud、3つのシャードと3つのレプリカです。

ソースバージョンは、SOLR-5875を含むカスタムの4.7.0バージョンで、これは非常に小さなパッチです。ターゲットバージョンは未修正のSolr 9.1.1です。このクライアントはバージョンを変更することを望んでいません。

スキーマはAtomic Updateの要件を満たしているため、古いクラスターにクエリを実行し、新しいクラスターに書き込むことで移行を行っています。フィールドの1つにフィルタをかけ、結果を効率的にページングするためにcursorMarkを使用して、バッチ処理を行っています。

クエリスレッドは10000件のドキュメントのバッチを取得し、それをキューに投入します。その後、インデクシングスレッドが処理します。クエリ側は、URLを使ってHttp2SolrClientを使用し、ターゲット側はCloudHttp2SolrClientをzk情報とともに使用し、シャードリーダーにのみ送信するオプションを設定しています。ソースコレクションはNRT(Near Real Time)で、これは4.7がサポートしている唯一のものだからです。ターゲットはTLOGです。両方のSolrClientオブジェクトはHTTP 1.1を使用するように設定されています。

あるバッチでは、常にnumFound(見つかった数)よりも5件少ないドキュメントがインデックスされます。それは一貫しており、常に5件です。移行中は更新が停止されています。前回の実行では、このバッチのnumFoundは3824942件で、インデックスされた件数は3824937件でした。

クエリバッチは常に10000件ですが、最後のバッチは4937件です。インデックスバッチは常に1000件ですが、最後のバッチは937件です。

おそらく問題はないと思いますが、キューサイズは500000です。インデックススレッドは2つあります。

移行コードに問題があるとは思っていません。他のバッチ(フィルタクエリで作成されたもの)はすべて正常に動作しており、インデックスされたドキュメントの数はnumFoundと一致しています。ドキュメントの総数は3000万件強で、このバッチは全体の10%強です。

Solr 4.7.0で、numFoundがcursorMarkで取得した総ドキュメント数と一致しないという問題を見たことがある人はいますか?これが起こる原因として考えられるのは、各レプリカでnumDocsのカウントが異なる場合ですが、各シャードのすべてのレプリカでこれらのカウントが同じであることを確認しました。

もう1つの可能性としては、uniqueKeyの値が複数のシャードに現れることがありますが、これはcompositeIdルーターがあるため、起こりにくいはずです。この状況を検出する方法はありますか?SolrJプログラムでそれを検出するアイデアはありますが、Solr 4.7に何か組み込まれているものがあることを願っています。

ありがとうございます、
Shawn

返信投稿者:ks-solruserml-bot (2024/08/24 22:13 投稿)

おそらく、バッチのうち1つが常に'rows=N'パラメータ(つまり、クエリのバッチサイズ)よりも5件少ないドキュメントをインデックスしているということですね?

全体のnumFoundがインデックスされたドキュメントの数よりも多いということでしょうか?

また、いくつかのシャードがリーダーと同期していない可能性もあります。例えば、あるシャードXで、レプリカ1が持っているドキュメントをレプリカ2が持っておらず、最初のフェーズではリクエストがレプリカ1を使用して「cursorMark=ZZZでの上位N件のソートされたドキュメントのuniqueKey」を取得し、次のフェーズではレプリカ2を使用してすべてのフィールド値を取得している可能性があります。(ただし、もしその場合であれば、少なくとも何度かは「運良く」両フェーズで互いに同意するレプリカにヒットすることがあり、問題が毎回確実に再現するわけではないはずです。)

すべてのcursorMarkリクエストURLとレスポンスのドキュメント数をログに記録することをお勧めします。

実行の最後に、cursorMark値がrowsパラメータと同じ数のドキュメントを返さなかった場合(最後のバッチを除き、それは小さくなるはずです)、そのクエリをdistrib=falseを使用してすべてのシャードのすべてのレプリカに対して手動で再実行し、同じシャードの各レプリカからのレスポンスを比較して差異を確認してください。

-Hoss
http://www.lucidworks.com/

返信投稿者:ks-solruserml-bot (2024/08/24 22:13 投稿)

クエリはrows=10000を使用しており、これはコマンドラインオプションで設定可能です。

ソースコレクションのnumFoundは、ターゲットにインデックスされたドキュメント数よりも5件多いです。最近のマイグレーションテスト中には、ソースコレクションへの更新がすべて一時停止されていたと確認されています。

各シャードのすべてのレプリカでnumDocsが同じであることを確認しましたが、レプリカ間でID値の包括的なチェックは行われていません。これを行うためのプログラムを作成できるはずです。

cursorMarkバッチが最後のバッチを除いて常に10000ドキュメントであることは、レスポンスから取得されたSolrDocumentListオブジェクトのサイズを確認することで検証しました。cursorMark値とともにそれを表示するために、デバッグレベルのログを追加しました。

現在、Http2SolrClientを使用して、複数のシャードに存在するIDを探すSolrJプログラムを完成させました。ZKからコアURLのリストを取得させることを望んでいましたが、それがうまくできなかったため、コマンドラインオプションで複数のコア固有のURLを受け入れるようにしました。これにより、各シャードから1つのレプリカコアが提示されることになります。このプログラムを小規模なSolrインストールに対してテストしました。最初のURLはコレクションエイリアスを指し、2番目は実際のコアを指しています。これは単一ノード上の単一シャードコレクションです。期待通り、すべてのIDが重複していると報告されました。早朝に実際の環境で試してみる予定です。

もし興味があれば、プログラムをGitHubにアップロードしましたので、ご覧ください。

https://github.com/elyograg/shard_duplicate_finder

よろしくお願いします、
Shawn

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2024 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?