Solr: ローカルノードのリーダネス状態を取得

トピック作成者:ks-solruserml-bot (2024/05/28 20:10 投稿)
6
CloseClose

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

こんにちは、Solrの皆さん、

カスタムのUpdateProcessorを記述しています。これはカスタムプラグインの一部であり、いくつかのコードをシャードリーダーでのみ実行する必要があります。これはプラグインなので、DistributedUpdateProcessor.isLeader()メソッドにアクセスできません。このメソッドは公開されていません。

現時点では、以下のコードをコピーして貼り付けていますが、もっと良い方法があるはずだと考えています。

private boolean getIsLeader() {
    final boolean isZkAware = req.getCore().getCoreContainer().isZooKeeperAware();
    if (!isZkAware) {
        return getNonZkLeaderAssumption(req);
    }
    String shardId = cloudDesc.getShardId();
    try {
        Replica leaderReplica = zkController.getZkStateReader().getLeaderRetry(collection, shardId);
        return leaderReplica.getName().equals(cloudDesc.getCoreNodeName());
    } catch (InterruptedException e) {
        throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR, “Error TODO", e);
    }
}

もう1つの方法として、cloudDesc.isLeader()を使用する方法もありますが、私の理解が正しい場合、最初のコードが最も正確な状態を提供すると思います。正しいですか?現在のリーダーの状態を確認する必要があるたびにこれを実行するべきでしょうか?リーダーはいつでも変わる可能性があるのでしょうか?パフォーマンスへの影響は何ですか?

お手伝いいただきありがとうございます。

Lamine

返信投稿者:ks-solruserml-bot (2024/05/28 20:10 投稿)

アップデートプロセッサーの動作については詳しくありませんが、アップデートはルーティングされた後にリーダーによって処理されるのでしょうか?リーダーでの実行がわかっていることを利用して、リーダー固有のコードをそこ/その時に実行することは可能でしょうか?

Ilan

返信投稿者:ks-solruserml-bot (2024/05/28 20:10 投稿)

なぜリーダーでのみ実行したいのですか?これは、NRT レプリケーションの動作方法を誤解しているように見えます。

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

返信投稿者:ks-solruserml-bot (2024/05/28 20:10 投稿)

NRTについて理解している限り、DistributedUpdateProcessorの前に設定されたすべての更新プロセッサは、最初に更新を処理するノード(おそらくリーダー)によって一度だけ実行され、DistributedUpdateProcessorの後に設定されたプロセッサは、すべてのインデックスレプリカによって実行されます。

誰かが私の理解を確認または否定できますか?

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

返信投稿者:ks-solruserml-bot (2024/05/28 20:11 投稿)

各シャードごとにコードが一度だけ実行されることを望んでいます。それを保証する方法の1つは、リーダーで行うことです。なぜなら、シャードごとに常に1つのリーダーが存在するからです。すべてのレプリカで実行したくありません。実行するコードは「外部」であり、ドキュメントには触れません。

返信投稿者:ks-solruserml-bot (2024/05/28 20:11 投稿)

私の言いたいことは、プロセッサーチェーンを定義する際に、その中にDistributedUpdateProcessorを含めるということです。SolrCloudがそれを含めなくても追加するので、その配置を制御したほうが良いです。そして、あなたのアップデートプロセッサーを、DistributedUpdateProcessorの前にリストに配置します。

これにより、コードを必要とせずに、目標を自動的に達成できるはずです。

ありがとう、
Shawn

返信投稿者:ks-solruserml-bot (2024/05/28 20:11 投稿)

もしドキュメントを一度だけ処理する必要があるのであれば、Shawnの解決策に同意します。リーダーが誰であるかを知る必要はありません。もし何らかの方法でそれが特定のリーダーで実行されることが重要であれば、既存のURPからインスピレーションを得ることができます。以下のようなものです:
https://github.com/apache/solr/blob/main/solr/core/src/java/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactory.java#L217
(isLeader メソッド)。また、この特定のURPは RunAlways を実装しているため、その順序はDURPの前後どちらでもかまいません。

〜 David Smiley
Apache Lucene/Solr 検索開発者
http://www.linkedin.com/in/davidwsmiley

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

KandaSearch

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

投稿の削除

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