2012-03-17 6 views
6

私はNHibernate.Searchアセンブリを使用しており、複数のWebサーバでこれを使用することに関するベストプラクティスを探しています。NHibernate Search - 複数のWebサーバ

私たちが生成しているインデックスを処理するために私たちのWebサーバーには十分なスペースがあります。そのため、各Webサーバーにインデックスを持つことが最善の方法だと考えています。次に、私がインデックスを作成しているクラスにバージョン列を追加します。私の唯一の質問は、もし私がこれを行うなら、NHibernate.Searchは最新のレコードを引き出し、Web Server Aがレコードを更新し、Web Server Bのインデックスが古くなっているとしましょう。

もう1つの方法は、インデックスを共有ファイルの場所に格納し、そのネットワークリソースからプルすることです。これは大きな冗長性を考慮していないため、あまり理想的ではないソリューションのようです。

他の人がNHibernate.Searchおよび/またはLucene.NETインデックスでこの問題を解決していますか?

答えて

3

インデックスを別のマシンに配置するとすぐに、「分散検索」問題が発生しました。レプリケーション、冗長性、管理、監視、検索集約などの問題は、重要かつ面白い問題になります。

つまり、Solrは、この問題の推奨される解決策の1つです。さらに、SolrNetはNhibernateとの統合に役立ちます。

私は両方のプロジェクトをNhibernateと組み合わせて使用​​していますが、最初はちょっと混乱しているかもしれませんが、それは後で報われます。

あなたの場合、WebサーバーでSolrを実行する可能性があります。

+0

美しい!私はまだソルを調べる時間をとらなかった。私は、「これらのNHibernateの変更を複数のサーバーから複数のサーバー上のLuceneインデックスに同期させる必要があるので、おそらくカスタムを構築する必要があります」と考えていました。 Solrにはすでに「何か」が構築されているようです。 –

+0

私はこの[Solrについてのリンク](http://www.lucidimagination.com/content/scaling-lucene-and-solr)に目を通しました。引用:「ほとんどのアプリケーションでLuceneを使ってスケーラブルなソリューションを開発しようとすると、自家製の検索エンジンを構築することになりますが、通常は賢明ではありません。 Solrはこの他にも多くのより高いレベルの作業を行っており、それを活用することが賢明です」この方向で私を指摘してくれてありがとう! –

+0

これはとても良いです。今後このルートをとる予定です。提案していただきありがとうございます。 – Brandon

0

あなたの最初のアイデアはうまくいかないでしょう。ファームのノードは互いに通信しません。第2レベルのキャッシュが共有リソースに依存します。 これ以外にも、インデックスが分離されないため、別々のインデックスは必要ありません。

共有ファイルの場所は移動方法です。冗長性に関する限り、ストレージの冗長性はそれほど重要ではないと思いますが、RAIDアレイから始めることができます

1

NHibernate SearchとLucene.netでサポートされているマスタ/スレーブアプローチを使用します。

各WebServerにはインデックスのスレーブコピーがあり、インデックスは作成されません。

Webサーバーが何かを更新するたびに、インデックスを作成するバックエンドサービス(msmqでRhino ServiceBusを使用します)にメッセージを送信します(更新されたオブジェクトを読み込んで再インデックスする)。

ウェブサーバーは、新しいバージョンのインデックスを確認し、必要に応じて取得します(最新の検索が必要です.30分間の猶予期間を設けるのが一般的です)。変更はインクリメンタルなので、完全なインデックスの取得は、最適化またはトータルの再インデックスを行う場合にのみ必要です。

WebサーバーでRAM実装を使用して最適化することができますが、32メガバイトのインデックスでは非常に複雑なワイルドカード検索が行われますが、クエリではまだ10ミリ秒以下です。

もう1つの最適化は、Webサーバーにインデックス作成をさせ、インクリメンタルコピーをバックエンドに送信してマスターインデックスに追加するだけです。これは、あなたがそれを行うためにNHibernate Search/Luceneの腸に深入りしなければならないので、ある程度の複雑さではあるが、バックエンドサービスからの呼び出しをDBに保存するだろう。

関連する問題