更新の順序に関する一般的な質問

トピック作成者:ks-solruserml-bot (2024/08/29 11:21 投稿)
7
OpenOpen

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

更新の順序に関する一般的な質問があります。

状況:

同じuniqueKey値に対して2つのインデックスリクエストが送信されました。1つはドキュメントを「作成」する更新で、もう1つはより多くのフィールドが埋められた「更新」です。この「更新」は「作成」とは異なるシステムによって送信され、間違った順序で送信されたことが判明しました。更新が作成の1ミリ秒前に送信されました。

Solr 4.7は顧客が望むようにこれを処理しますが、Solr 9.1ではそうではありません。

私の推測では、4.7は受信した更新の順序を無視しており、処理に時間がかかるインデックス操作が、より早く行われる操作の後に実際に適用されているようです。一方、9.1は受信した順序で更新を適用しています。

この考えは正しいでしょうか?Lucene 9やSolr 9は、操作の順序について4よりも賢いのでしょうか?

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

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

Solr 4.7は顧客が望むようにこれを処理しますが、Solr 9.1ではそうではありません。

これはレースコンディションのように思えます。ソートを行っているのがSolrであり、ネットワークスタックなどではないと確信していますか?

私が確認したところ、"add"リクエストが先に来ると、少なくともSolr 8.11.2では、新しい無用なドキュメントが作成されます。私はそれが失敗してくれた方がよいと思います。

Dima

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

更新とインデックス作成はかつてシングルスレッドで行われていましたが、しばらく前(おそらくSolr 6.xの頃)に、インデックス作成が複数のCPUを使用できるように、一連のロックが削除されました。おそらくそれが今回の現象の原因だと思います。

Solrは、たとえうまく動作したとしても、更新の順序を保証したことはないと思います。

更新の前にリアルタイムでドキュメントが本当に存在するかを確認するために、リアルタイムゲットを使用するのも一つの方法かもしれません。それは比較的速く実行できるはずです。

wunder
Walter Underwood
wunder@wunderwood.org
http://observer.wunderwood.org/ (私のブログ)

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

ログで確認したところ、インデックスリクエストを送信する2つのシステムのリクエストと、それに対応するSolr 9.xのsolr.logのエントリが見られました。"更新"リクエストが"作成"リクエストの1ミリ秒前に送信されています。"更新"リクエストには、"作成"リクエストよりもかなり多くのフィールドデータが含まれているため、処理に時間がかかっていると確信しています。

これらのリクエストを4.7クラスターに送信すると、最終的には更新されたレコードが保持されます。これは、2つの更新の処理時間の違いによるもので、受信順序が無視された結果だと思います。

同じリクエストを9.1.1クラスターに送信した場合、"更新"レコードではなく"作成"レコードが保持されます。顧客はこれを9.1.1のバグだと考えていますが、私はSolr 9が実際には正しく動作しており、受信順序を尊重していると思います。Solr 4は、バグの結果として顧客の期待を偶然満たしていたに過ぎないのではないかと考えています。

私が確認したところ、"add"リクエストが先に来ると、少なくともSolr 8.11.2では、新しい無用なドキュメントが作成されます。私はそれが失敗してくれた方がよいと思います。

希望する動作を実現するには、オプティミスティック同時実行機能を使用できるかもしれません。

オプティミスティック同時実行機能が、顧客のセットアップでも役立つかもしれません。

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

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

私の場合はそうではありませんが、ヒントをありがとうございます。今後の参考としてもう一つ記録しておきます。

とにかく、Walterが言ったように、スレッド間で競合しています。

(あなたの説明からすると、4.xの動作に依存するのは最初から悪いアイデアでした。例えば、「作成」リクエストが非TLERドライブの悪いセクターに当たって、100倍長くI/Oが詰まってしまったらどうなりますか?)

Dima

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

異なるサービスから送信された2つのリクエストの調整は難しいと思われるため、問題を解決するために最も簡単な変更は、オプティミスティック同時実行を使用し、「作成」リクエストでフィールドを0に設定して、ドキュメントがすでに存在する場合にリクエストが失敗するようにすることだと思います。もちろん、結果として発生するエラーは明示的に検出される必要があり、無視することができる一方で、他のエラーは正しく処理する必要があります。SolrJコードで実際にインデックス作成リクエストを行う部分は見たことがありません。

この前提で、オプティミスティック同時実行が未コミットのドキュメントをチェックすることを期待しています。なぜなら、2回目の更新が来たときに、最初の更新が実際にコミットされている可能性は非常に低いためです。

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

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

現在の運用方法が完全に間違っているという点には同意しますし、それがうまくいったことに驚いています。彼らは非常にラッキーでした。

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

返信投稿者:ks-solruserml-bot (2024/08/29 11:23 投稿)

http://www.catb.org/jargon/html/S/schroedinbug.html

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

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

KandaSearch

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

投稿の削除

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