SolrCloudでのコミットとNRT検索

SolrCloudでのコミットとNRT検索

1. 概要

Solrは、最も人気のあるLuceneベースの検索ソリューションの1つです。 高速、分散、堅牢、柔軟性があり、背後に活発な開発者コミュニティがあります。 SolrCloud is the new, distributed version of Solr

One of its key features here is the near real-time (NRT) search、つまり、インデックスが作成されたときにsoonとして検索できるドキュメント。

2. SolrCloudでのインデックス作成

Solrのコレクションは複数のシャードで構成され、各シャードにはさまざまなレプリカがあります。 コレクションの作成時に、シャードのレプリカの1つがそのシャードのリーダーとして選択されます。

  • クライアントがドキュメントのインデックスを作成しようとすると、最初にドキュメントのidのハッシュに基づいてドキュメントにシャードが割り当てられます。

  • クライアントはそのシャードのリーダーのURLをzookeeperから取得し、最後にそのURLに対してインデックス要求が行われます

  • シャードリーダーは、ドキュメントをレプリカに送信する前にローカルでインデックスを作成します

  • リーダーは、アクティブで回復中のすべてのレプリカから確認を受信すると、インデックス作成クライアントアプリケーションに確認を返します。

When we index a document in Solr, it doesn’t go to the index directly. It’s written in what is called a tlog (transaction log). Solrはトランザクションログを使用して、システムクラッシュが発生した場合に、ドキュメントがコミットされる前にドキュメントが失われないようにします。

トランザクションログ内のドキュメントがコミットされる前に、つまりディスクに保存される前にシステムがクラッシュした場合、システムが復旧するとトランザクションログが再生され、ドキュメントの損失がゼロになります。

すべてのインデックス/更新要求はトランザクションログに記録され、コミットを発行するまで増え続けます。

3. SolrCloudでコミット

commit操作は、変更を確定し、その変更をディスクに保持することを意味します。 SolrCloudは2種類のコミット操作を提供します。 コミットとソフトコミット。

3.1. コミット(ハードコミット)

コミットまたはハードコミットは、トランザクションログ内のコミットされていないドキュメントをすべてSolrがディスクにフラッシュするものです。 The active transaction log is processed, and then a new transaction log file is opened.

また、サーチャーと呼ばれるコンポーネントを更新して、新しくコミットされたドキュメントを検索できるようにします。 サーチャーは、インデックス内のすべてのコミットされたドキュメントの読み取り専用ビューと見なすことができます。

コミット操作は、commit APIを呼び出すことにより、クライアントによって排他的に実行できます。

String zkHostString = "zkServer1:2181,zkServer2:2181,zkServer3:2181/solr";
SolrClient solr = new CloudSolrClient.Builder()
  .withZkHost(zkHostString)
  .build();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", "123abc");
doc1.addField("date", "14/10/2017");
doc1.addField("book", "To kill a mockingbird");
doc1.addField("author", "Harper Lee");
solr.add(doc1);
solr.commit();

同様に、solrconfig.xmlファイルで指定することにより、autoCommitとして自動化できます。セクション3.4を参照してください。

3.2. SoftCommit

主にSolrCloudのNRT機能をサポートするために、Solr 4以降からSoftcommitが追加されました。 これは、ハードコミットのコストのかかる側面をスキップすることで、ドキュメントをほぼリアルタイムで検索できるようにするメカニズムです。

During a softcommit, the transaction log is not truncated, it continues to grow. However, a new searcher is opened。これにより、最後のソフトコミット以降のドキュメントが検索用に表示されます。 また、Solrのトップレベルのキャッシュの一部が無効になっているため、完全に無料の操作ではありません。

softcommitのmaxTimeを1000と指定すると、ドキュメントは、インデックスが作成されてから1秒以内にクエリで使用できるようになります。

この機能は、SolrCloudにほぼリアルタイムの検索機能を付与します。新しいドキュメントは、コミットしなくても検索可能にすることができるためです。 Softcommitは、solrconfig.xmlファイルで指定することによってautoSoftCommitとしてのみトリガーできます。セクション3.4を参照してください。

3.3. AutocommitとAutosoftcommit

solrconfig.xmlファイルは、SolrCloudで最も重要な構成ファイルの1つです。 コレクションの作成時に生成されます。 autoCommitまたはautoSoftCommitを有効にするには、ファイル内の次のセクションを更新する必要があります。


  10000
  30000
  true



  6000
  1000

maxTime:最初のコミットされていない更新から次のコミット/ソフトコミットが発生するまでのミリ秒数。

maxDocs:最後のコミット以降に発生し、その後に次のコミット/ソフトコミットが発生する必要がある更新の数。

openSearcher:このプロパティは、コミット操作後に新しいサーチャーを開くかどうかをSolrに指示します。 If it’s true, after a commit, the old searcher is closed, and a new searcher is opened, making the committed document visible for searchingfalseの場合、コミット後にドキュメントを検索することはできません。

ほぼリアルタイムの検索は、コミットとソフトコミットの組み合わせを使用してSolrで実現されます。 前述のとおり、ドキュメントがSolrに追加されると、インデックスにコミットされるまで検索結果に表示されません。

通常のコミットにはコストがかかるため、ソフトコミットが便利です。 ただし、softcommitはドキュメントを永続化しないため、予想される負荷に応じて、自動コミットのmaxTime間隔(またはmaxDocs)を適切な値に設定する必要があります。

4.1. リアルタイムGets

Solrが提供するもう1つの機能は、実際にはリアルタイムです。getAPIです。 The get API can return us a document that is not even soft committed yet.

ドキュメントがインデックスに見つからない場合、トランザクションログで直接検索します。 そのため、インデックス呼び出しが戻った直後にget API呼び出しを実行できますが、それでもドキュメントを取得できます。

しかし、すべてのあまりにも良いことのように、ここにはキャッチがあります。 We need to pass the id of the document in the get API call.もちろん、idと一緒に他のフィルタークエリを提供することもできますが、idがないと、呼び出しは機能しません。

http://localhost:8985/solr/myCollection/get?id=1234&fq=name:example

5. 結論

Solrは、NRT機能の調整に関してかなりの柔軟性を提供します。 サーバーから最高のパフォーマンスを引き出すには、ユースケースと予想される負荷に基づいて、コミットとソフトコミットの値を実験する必要があります。

We shouldn’t keep our commit interval too long, or else our transaction log will grow to a considerable size.ただし、ソフトコミットを頻繁に実行するべきではありません。

また、実稼働に移行する前に、システムの適切なパフォーマンステストを行うことをお勧めします。 目的の時間間隔内にドキュメントが検索可能になっているかどうかを確認する必要があります。