SolrCloud を完全にコンテナ化して実行するときの厄介な問題 | KandaSearch Community Support Forum

SolrCloud を完全にコンテナ化して実行するときの厄介な問題

トピック作成者:ks-solruserml-bot (2025/10/24 18:33 投稿)
5
OpenOpen

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

専門家の皆さまへ

ご助力いただければ幸いです。

質問の要点
ZooKeeper の動的リコンフィギュレーション(dynamic reconfiguration)の使用を無効化することは可能でしょうか?
あるいは、以下に記載する問題を解決する別の方法はありますか?

状況
私たちは長年にわたり単一サーバーモードで SOLR を使用してきました。しかし、ついに SolrCloud への移行の時が来ました。
制約は以下の通りです:

  • Kubernetes(SolrOperator)は利用できない
  • すべての ZooKeeper と Solr ノードはコンテナとして実行しなければならない

ドキュメントを調べ、リサーチを重ねた結果、完全にコンテナ化された構成を立ち上げることに成功しました。
(Solr 9.8.1、ZK 3.9.3)
しかし、まだ厄介な欠点が残っています。

欠点の要素

  • 組み込み ZooKeeper を使ったコンテナ化 SolrCloud の実行は不可能に見えます。
  • 外部 ZooKeeper アンサンブルには、ノードの初期リスト(例: "host_1\:ports, host_2\:ports, host_3\:ports")が必要です。ところが、ノードをコンテナとして実行するには、ホストの IP アドレスではなく 0.0.0.0 を設定する必要があります。例えば、host_2 上で ZooKeeper コンテナを実行する場合、リストは "host_1\:ports, 0.0.0.0\:ports, host_3\:ports" となります。
  • Solr は起動時にのみ zkHosts を利用するようです。ZooKeeper の動的リコンフィギュレーションを活用するために、Solr は ZooKeeper アンサンブルから取得したリストを優先するように見えます。

厄介な結果
完全にコンテナ化された SolrCloud を動作させること自体は可能ですが、GUI /solr/#/~cloud?view=zkstatus では「Failed talking to Zookeeper 0.0.0.0:2181」と表示されます。
ZooKeeper コンテナ内の 0.0.0.0 は Solr コンテナからは見えません。そのため、各 Solr ノードは ZooKeeper ノードを n-1 個しか認識できない状態になります。

この問題は何年も前から知られています:
https://stackoverflow.com/questions/64351894/solr-cloud-cannot-connect-to-random-zookeeper-node-full-docker-set-up

これまで誰も回避策や解決策を見つけていないとは信じがたいです。

  • Solr に与えた zkHosts を保持する隠しフラグ(ZooKeeper の動的リコンフィギュレーションを無視するオプション)は存在しないでしょうか?
  • あるいは、ZooKeeper に対して、ノード(myid)に別の IP が設定されていても 0.0.0.0 で起動するような隠しフラグがあるのでしょうか?

どんな助けでもありがたいです。

Uwe

返信投稿者:ks-solruserml-bot (2025/10/24 18:34 投稿)

私の理解する限り、組み込み ZooKeeper はシングルノードの SolrCloud 用に意図されています。

私はコンテナ化した SolrCloud を実行しており、3 台の専用ホストで ZooKeeper と Solr を起動する際に docker run --network host を使用しています。

返信投稿者:ks-solruserml-bot (2025/10/24 18:34 投稿)

現在、組み込み ZooKeeper は「サポートされている」とはいえ、基本的には最初のテストやチュートリアルを簡単に実行するためのものです。冗長性を提供するクラスタを構築することは想定されておらず、データストアの管理や不要なアクセスからの保護についてもあまり考慮されていません。

これをよりスケーラブルなレベルのサポートに引き上げたいと考えている人たちもいますが、まだ実現していません。
(参照: https://cwiki.apache.org/confluence/display/SOLR/SIP-14+Embedded+Zookeeper)

本番環境では外部 ZooKeeper を使用することが強く推奨されます。

Kubernetes の文脈では、ZooKeeper クラスタ用に StatefulSet を維持し、Solr クラスタ用に別の StatefulSet を維持することを意味します。Solr ノードは起動時に現在の ZooKeeper 接続文字列を設定しておく必要があります。その文字列をどのように伝達するかは、システム管理方法によって決まりますが、理想的には、Solr(またはデータベース)の場所をユーザー向けアプリケーションや他の下流システムに伝えるのと同じように扱えると管理が容易になります。良い点として、通常 ZooKeeper クラスタ用には小規模で安価なインスタンスを用意できるため、これを実施するコストは(Solr 用のハードウェア/ディスクコストに比べれば)高くありません。ただし ZooKeeper のドキュメントにあるパフォーマンス関連の注意事項は無視しないようにし、もちろん他のシステムと同様に監視してください。

組み込み ZooKeeper を使って小規模なシングルノードシステムを運用している人たちも確かにいますが、通常はミッションクリティカルや無停止運用が求められるシナリオではありません。

Kubernetes 以外の環境では、稼働時間をあまり重視せず、強いパフォーマンス要件にも直面していない人たちが、Solr が動作するマシンの一部に ZooKeeper を配置するケースもありますが、これは高性能でも高可用でもありません。ZooKeeper も Solr も、ディスクやメモリを他のサービスと取り合うことを嫌います。私は Kubernetes では絶対にこの構成は試さないでしょう。

また、Kafka など他の用途で ZooKeeper を利用している組織では、既存の大規模で強力な ZooKeeper クラスタに Solr 用のルートを追加することもあります。ただし、その場合もシステム間の依存関係や、アプリケーション同士が互いに影響を及ぼさないようにする注意が必要です。

— Gus


http://www.needhamsoftware.com (仕事用)
https://a.co/d/b2sZLD9 (私のファンタジー小説)

返信投稿者:ks-solruserml-bot (2025/10/24 18:35 投稿)

コンテナ化された SolrCloud を組み込み ZooKeeper で動かすのは不可能に思えます。

それは決して正しくありません。ただし、確かにいくらかのエンジニアリング努力は必要です。私たち(Autotrader UK)は Kubernetes 上で Solr と ZooKeeper を実行しており、かれこれ 7 年ほど大きな問題なく運用しています。私たちの環境は読み込み・書き込みともに多いチャレンジングな構成ですが、やり抜いてきました。ちなみに私たちは GCP 上で運用しており、Hyperdisks を利用してディスクの容量とは独立に IOPS とスループットをスケールさせています。また、ARM ノード(C4A)上で動かしています。

Helm チャートは自分たちで作成し、市販のチャートやオペレーターは使っていません。これによりデプロイのあらゆる側面を完全に制御できます。各クラスタごとに Solr レプリカを 9、ZooKeeper レプリカを 5 実行しています。Pod が同じノードで動作しないように anti-affinity ルールを設定し、利用可能なゾーン全体に分散するよう Pod のトポロジ制約を活用してください。また、他の方も言っているように、ZooKeeper は Solr とは異なるノードで動作させるべきです。さらに、PodDisruptionBudget(PDB)を設定し、Solr と ZooKeeper の両方について同時にオフラインになる Pod が 1 つだけになるよう制御しています。これによりロールアウトは遅くなりますが、安全になります。また、私たちの CI/CD パイプラインでは、必ず ZooKeeper を先にデプロイし、その後に Solr をデプロイしています。

ZooKeeper のホスト名と IP に関しては、IP が変わらないようにする必要があります。そのために各 Pod ごとに Service を作成します(例えば ZooKeeper ノードが 5 つある場合)。そして StatefulSet のセレクタ statefulset.kubernetes.io/pod-name: zookeeper-X を利用します。これにより、常に zookeeper-X.namespace.svc.cluster.local というアドレスを利用でき、それが固定の IP(Service)に解決され、その IP が Pod(動的)にルーティングされます。これで予測可能に ZK_HOSTS をテンプレート化することができます。

お役に立てば幸いです。これは完全に実現可能です。

返信投稿者:ks-solruserml-bot (2025/10/24 18:36 投稿)

すみません、埋め込み部分を読み違えていましたので、最初の一文は無視してください。――ただ、それ以外の部分はおそらくまだ役に立つと思います。

返信投稿者:ks-solruserml-bot (2025/10/24 18:36 投稿)

ご支援いただき、本当にありがとうございます。

その間に自分で解決策を見つけることができました。
ある問題についての議論の中で、ZK コンテナ(0.0.0.0 ハックを使ったもの)がリーダー選出に問題を抱える可能性があることが挙げられていました。その際に、ZK には 「quorumListenOnAllIPs」 というパラメータがあることが言及されていました。
このパラメータを true に設定すると、「0.0.0.0」を使った回避策ではなく、実際のホスト IP で ZK アンサンブルを構成することができます。
その結果、Solr ノードが到達不能な zkHosts の参照を扱う必要がなくなり、問題は解決しました。

より詳しい説明に興味がある方のために、こちらに追記しました:
https://stackoverflow.com/questions/64351894/solr-cloud-cannot-connect-to-random-zookeeper-node-full-docker-set-up

追伸:
最初の投稿がリストに表示されるまで 6 日かかってしまいました。そのため、もっと早く撤回することができませんでした。申し訳ありません。この返信はもう少し早く反映されることを願っています。

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

KandaSearch

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

投稿の削除

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