私たちは企業Webアプリケーション用の検索アーキテクチャを設計しています。 Lucene.netを使用しています。インデックスは大きくない(約10万のドキュメント)が、検索サービスは常に最新であり、常に最新でなければならない。索引には常に新しい文書が追加され、同時検索が行われます。 検索システムの可用性が高くなければならないため、WCFサービスを公開して検索と索引付けを行うアプリケーションサーバーが2つあります(各サーバーでサービスのコピーが実行されています)。次に、サーバーはlucene.net APIを使用して索引にアクセスします。複数のアプリケーションサーバー間でLucene.netインデックスを同期させる
問題は、インデックスを常に同期させるのに最適な解決策は何でしょうか? インデックスがSMBを経由して第二のサーバへのアクセスを有するもの索引付けのためのサーバーと を使用していない
:我々はいくつかのオプションを検討してきた私たちは、障害 状況の単一のポイントを持っている ので、何を行うことができます。
すべてのインデックスを2度書きます。おそらく、パフォーマンスが悪く、たとえばデシンクの可能性があります。サーバー1はOKを索引付けし、サーバー2はディスクスペースを使い果たします。
SOLRまたはKATTAを使用してインデックスへのアクセスをラップする:いいえ、私たちはサーバー上でTomcatなどを実行することはできません。私たちはIISしか持っていません。
データベースにインデックスを格納する:これはLucene(JdbcDirectoryモジュール)のJavaバージョンで行うことができますが、Lucene.netと同様のものは見つかりませんでした。たとえそれがパフォーマンスの低下を意味していたとしても、同時性をきれいに解決し、問題をミニナム開発と同期させるため、このオプションを選択します。
Lucene.netを使用するDistributedSearch contribモジュール:私はこれに関するドキュメンテーションで1つのリンクを提出できませんでした。私はこのコードが何をしているのかを見ても分かりませんが、実際に私たちが望むものではない複数のマシンにインデックスを分割しているようです。
のrsyncや友人は、前後に2つのサーバー間でインデックスをコピー:これは、インデックスが大きな成長場合は、しばらく時間がかかるかもしれませんし、この期間中、我々は次のようになり、ハックとエラーが発生しやすい私たちに感じている、と壊れたデータまたは一貫性のないデータをクライアントに返すので、私たちはしたくない特別なロックポリシーを開発する必要があります。
これは複雑な問題だと私は理解していますが、以前は多くの人がそれに直面していました。どんな助けも歓迎です!
Sean、これは現在、私たちの候補オプションです。私はあなたとitsadokに同意します。また、JdbcDirectoryのソースを見つけて、.NET + SQLサーバーへの移植が可能かどうかを調べようとしています。 新しいアプローチが出てくるかどうかを確認するためにしばらく質問を開いたままにしてください。そうでない場合はこの回答を受け入れます。 –
同じことを一度チェックしました。それは努力の価値があるように見えませんでした.DBトランザクション関連のものがたくさんあります.Netに移植するのは簡単ではありません。また、JDBCDirectoryを使用してスピードを落とすという苦情もありました。ソースはCompassプロジェクトにあります - http://svn.compass-project.org/svn/compass/trunk/src/main/src/org/apache/lucene/store/jdbc/ –
いくつか考えた後、これは何ですか私は最も実行可能な解決策として見ています:インデックス/インデックス解除の要求を受け取ったときに、キューとして機能する共有dbテーブルに行を挿入します。両方のアプリケーションサーバーで実行され、X秒ごとにキューをポーリングし、コンテンツをローカルに索引付けする単純なwin32サービスを実装します。コンテンツが正常に索引付けされると、サービスはアイテムを処理済みとしてマークし、そうでない場合は試行を続けます。 –