2012-01-26 11 views
7

私はWindowsクラスタで動作するアプリケーションのLucene.NETの実行に興味があります。検索の問題自体はかなり小さいですが、ステートレス/クラスタの問題は引き続き処理する必要があります。Lucene.NETクラスタリングのオプション?

私はSOLRは私のシナリオ(およびそれ以上)が、サーブレットコンテナ(とJava)を必要とするが、私のためにいくつかの問題を提起扱うことを理解しています。しかし、Lucene.NETベースのアプローチの複雑さにもよりますが、それでもバイアルのオプションになる可能性があります。

私の質問は今、複数のホスト上で実行されているの問題を処理するための私が持っているものなオプションです:

  • は、すべてのノードのための共通、共有ストレージ上に永続? Lucene.NETは並行処理を透過的に扱いますか?サーバーはキャッシュにRAMを使用しますか?もしそうなら、Lucene.NETは更新されたファイルに基づいて透過的にこの無効化を処理しますか?

  • レプリケーション?各サーバーには、必要なすべてのコピーがあります。いずれのアップデートでも、すべてのサーバが新しいレプリカを取得します(または、これが比較的簡単な場合はdiff)。これのための既存のツール、または私はそれを扱うことができますか?

  • ワークロードの分割/シャーディング?各サーバーは、読み取りと更新の両方について、独自のデータのみを処理します。これを処理するツール、部分的な結果を結合するツールなど

  • その他のオプション初期の調査で私が見逃していた可能性がありますか?

ローカルバージョンを試してみると、私のLuceneディレクトリは数百メガバイトのオーダーになりました。長期的に私はおそらく1〜5 GBを見ることができます。アップデートの頻度が難しい場合、私はこれをかなり柔軟に制御できます。並行読み取り/検索負荷は非常に緩やかであると予想されます。

+1

直接回答ではありませんが、elasticsearch(http://www.elasticsearch.org/)をご覧ください。ほとんどのニーズを非常に簡単に処理します。 – Mikos

+0

クラスタメンバー間でデータを同期させるための要件はありますか?私たちはLucene.NETのかなり大規模なクラスター展開の途中にあり、自分の状況をよりよく理解していれば、ある程度のガイダンスを提供できるかもしれません。 –

答えて

0

複数のサーバーでlucene.netを使用できますが、インデックスサーバーを実装する必要があります。

すべての変更はキューに入れられ、毎回、保留中のドキュメントのインデックスが作成されます。また、x個のアイテムがキューにある場合はすぐにインデックスを作成する必要があります(xはマージドキュメント設定に依存しますが、これは私にとっては25,000です)。

上記の背後にある理由は、あなたが、これが原因に作成された多数の小さなファイルにパフォーマンスの残業が低下しますと、インデックスに小さな変更を加えることを避けるために必要です。あなたは2つのインデックスサーバーを稼働させることができますが、インデックスをロックするために一度に1つだけインデックスを作成します。これを行う唯一の理由は、最初のものがダウンした場合のフェイルオーバーです。

私は3000万レコードで15Gbのインデックスを使用しました。私がこれで持っていたシナリオは紺碧の下でした。各インデックスを保持しているコンテンツを提供する20のウェブ役割 - インデックスへ

  • 1 Workerロールは

  • 2を変更します。

変更は、すべて15分にプッシュされたインデックスは、25,000変化250,000文書を含む各組み合わせたインデックスにマージされました。各WebサーバーはBLOBストレージに15分ごとに変更をチェックし、インデックスリーダーをロックし、変更がダウンロードされると無効にされました。ファイルごとの最大文書数は、基本的にWebサーバーが以前の変更をたくさんダウンロードするのを止めることです。

私はLucene.AzureDirectoryを使用して始めましたが、ブロブストレージ内の変更されたブロブを検出すると信頼性がありませんでしたので、ブロブを繰り返してローカルで比較し、必要に応じてダウンロードしました。

もう一度このようなことを実装しますか?答えは大きなノーです。あなたは車輪を再発明しているので、代わりにelasticsearchまたはsolrを使用します。