あけましておめでとうございます。大谷です。本年もよろしくおねがいいたします。
新年最初のエントリーはNearRealTimeSearchの紹介です。(
PDF版はこちら)
1. NearRealTimeSearchとは
Solrを利用した検索サイトを作成するとき、多くの場合は登録するデータはバッチによる定期的な更新を行うようにするのが一般的です。これは、Solrのインデックスへの書き込みがトランザクションに対応していないことやインデックス更新を行なっている間の検索性能の劣化などが要因となっています。
ただ、最近では定時更新ではなく、よりリアルタイムに検索インデックスにデータの追加更新を反映したいという要件が多くなってきています。この要件に対応するために提案、実装されたものがNearRealTimeSearch(ほぼリアルタイム検索)と呼ばれる機能です(以降ではNRTと略します。)。
Luceneには2.9ですでにNRTが実装されていましたが、Solrにて利用できる形にするためにSOLR-2193で提案されました。
2. NRTの仕組み
NRTはLuceneのNRTを利用した仕組みになります。LuceneのNRTはインデックスの書き込みを行うIndexWriterから、Index検索のためのオブジェクトIndexReaderを取得することができるようになる機能になります。すなわち、インデックスがファイルに書き込まれる前の(メモリ上にあるインデックス)状態で検索が可能になることになります。
Solrでは、この機能を利用するためにこれまでコミット(commit)と呼ばれていた機能を以下の2つコミットとして再定義しました。
- Hard Commit
これまでのコミットと同義。停電からのデータロスをなくすためにfsyncを呼び出し、ファイルにインデックスを出力する。 - Soft Commit
新たに追加されたコミットの種類。インデックスの変更をファイルに反映せず、メモリ上に反映する。
Soft CommitがNRTを利用するためのコミットとなります。ディスクへの書き込みは保証されませんが、ほぼリアルタイムに検索結果に反映がされます。
3. 制約事項
現在、NRTが利用できるのはtrunkである4.x系のみとなります。3.x系以前では残念ながら利用できません。
前述ですが、ディスクへ書き込みも保証されません。VMがクラッシュしたり停電が発生した場合は直前のHard Commitが実行された時点までインデックスの状態が戻ることに注意が必要です。
また、Soft Commitの仕組み上、レプリケーションによる同期が利用できません。こちらもHard Commit時点ごとにしかレプリケーションが動作しません。Soft Commitによるほぼリアルタイム反映についてはデータ更新対象となっているSolrサーバでのみ恩恵をうけることが可能です。
4. 利用方法
2で説明しましたが、Commitの新しいタイプとしてSoft Commitが追加されています。まずは、XMLによるコミット時の指定は次の様になります。
1 | curl http://<hostname>:<port> /solr/update -H "Content-Type: text/xml" --data-binary '<commit softCommit="true"/>' |
softCommit=”true”オプションを指定するとSoft Commitの動作となります。
管理画面のPendingDocsを見ると、Soft Commit前に更新したデータ件数がコミットされていない状態がわかります。ただし、Soft Commitは実施されていますので、検索結果には表示されます。
次は設定によるAutoCommitについてです。Solrではsolrconfig.xmlの設定によりAutoCommitが設定可能です。設定は次の通りです。
1 2 3 4 | <autoSoftCommit> <maxDocs>10</maxDocs> <maxTime>1000</maxTime> </autoSoftCommit> |
これまで同様、maxDocsによる指定とmaxTimeによる指定が可能です。
- maxDocs
直前のSoft Commitが実施されてから登録されたデータ数が指定された数に達した場合にSoft Commitが実行される。 - maxTime
データが登録されてから指定されたミリ秒経過するとSoft Commitが実行される。
Hard Commitの設定についてはこれまでと同様のタグにて指定可能です。Soft Commitを毎秒、Hard Commitを数分おきとすることで、定期的にファイルにインデックスを保存しつつ、ほぼリアルタイムに更新を反映させるといった設定が可能になります。
5. 今後の展開
前述しましたがNRTは、マスタスレーブ構成(レプリケーション)には対応していません。マスタスレーブ構成についてはSolrのMLで話が上がりましたが、現在のレプリケーションの機能との併用は望めないようです。代わりにSolrCloudと呼ばれる別の新しい分散インデックスの機能が紹介されています。SolrCloudとはクラウドでの検索サービスとしてSolrを運用管理するために現状のSolrの拡張する機能です。
NRTについてはまずは、マスタスレーブでない環境で利用してみるのはいかがでしょうか。
参考:
http://wiki.apache.org/solr/NearRealtimeSearch
http://wiki.apache.org/solr/UpdateXmlMessages#Optional_attributes_for_.22commit.22_and_.22optimize.22
http://wiki.apache.org/solr/SolrConfigXml?#Update_Handler_Section
http://www.lucidimagination.com/blog/2011/07/11/benchmarking-the-new-solr-%E2%80%98near-realtime%E2%80%99-improvements/
http://lucene.472066.n3.nabble.com/NRT-and-replication-tt3422940.html
http://wiki.apache.org/solr/NewSolrCloudDesign