Droonga 1.0.8をリリースしました!
2014-11-29Droongaとは?
DroongaはGroongaと互換性を持つ分散型の全文検索エンジンです。 Droongaクラスタは、レプリケーション機能を持つGroonga互換のHTTPサーバとして動作します。
どのように動作しどのように利用するのかについては、チュートリアルをご覧下さい。 また、設計について興味がある場合は概要もご覧下さい。
Droonga 1.0.8 での改善点
今回のDroonga 1.0.8のリリースは、多くの改善を含んでいます。 その中でも特に大きな話題は以下の3つです。
フロントエンドのHTTPサーバがクラスタの一部として管理されるようになりました
droonga-http-server
によるフロントエンドのHTTPサーバのノードが、Droongaクラスタの本当の一員として動作するようになりました。
これまでのバージョンでは、1つのdroonga-http-server
ノードは対応する1つのdroonga-engine
ノードに強く結びつけられていました。
そのため、あるdroonga-engine
ノードが停止してしまうと、それに紐付いていたdroonga-http-server
ノードまでが停止してしまっていました。
しかし、その制限はこのバージョンで解消されました。
もしdroonga-engine
ノードの1つが停止してしまっても、droonga-http-server
ノードは自動的に、他の生存しているdroonga-engine
と共に動作し続けます。
また、クライアントからのリクエストを1つのdroonga-http-server
ノードが受け付けた場合でも、それらは複数のdroonga-engine
ノードに振り分けられるようになりました。
言い換えると、簡易的なロードバランサーのように振る舞うようになりました。
検索処理(特にgroupBy
、Groongaのselect
におけるドリルダウン指定を伴う場合)のパフォーマンスの改善
シャーディングが行われていないレプリカでの検索処理における、groupBy
使用時のパフォーマンスが改善されました。
また、offset
の指定を伴う検索処理についても改善があります。
以上を踏まえた、現在のDroongaとGroongaの比較のベンチマーク結果は以下の通りです:
ベンチマークの条件は以下の通りです:
- Wikipedia日本語版に由来する1500000件のレコード。
- すべてのリクエストは、実際のページタイトルを使用した全文検索のクエリで、且つドリルダウンを伴う。
例:
/d/select?command_version=2&table=Pages&limit=10&match_columns=title,text&output_columns=snippet_html(title),snippet_html(text),categories,_key&query_flags=NONE&sortby=title&drilldown=categories&drilldown_limit=10&drilldown_output_columns=_id,_key,_nsubrecs&drilldown_sortby=_nsubrecs&query=Wikipedia%3AText+of+GNU+Free+Documentation+License
- キャッシュヒット率は50%を想定。
- 開発用の物理的なPC上で計測を実施。
- node0: Ubuntu 14.04LTS, Intel Core i5 M460 2.53GHz, 8GB RAM
- node1: Ubuntu 14.04LTS, Intel Core i5 650 3.20GHz, 6GB RAM
- node2: Ubuntu 14.04LTS, Intel Core i5 650 3.20GHz, 8GB RAM
- クライアント: Ubuntu 14.04LTS, Intel Core i5-4300U vPro 1.90GHz, 4GB RAM
詳細な結果はプレゼン資料のリポジトリに含まれています。
上記のグラフを見て分かる通り、現在、単一のDroongaノードのスループット性能はGroongaのそれに匹敵しています。 それだけでなく、Droongaノードをクラスタに追加することでスループットの上限が拡大されていることも分かります。
他方、Droongaにおいては全般的にレイテンシがGroongaよりも大きいです。 しかしながら、大量のアクセスがある場合には、GroongaとDroongaの性能は逆転します。 大量のリクエストに対しては、DroongaはGroongaよりも迅速にレスポンスを返せています。
Groongaとの互換性の向上
いくつかの細かい非互換が解消され、Groongaとの互換性が向上しました。
select
コマンド:output_columns
オプションが空白文字区切りのリストを受け付けるようになりました。 (これはGroongaのcommand_version=1
の時の形式と互換性があります。)TABLE_NO_KEY
のテーブルに対して、output_columns=*
の指定が正しく動作するようになりました。
column_list
コマンド:TABLE_HASH_KEY
,TABLE_PAT_KEY
, およびTABLE_DAT_KEY
のテーブルにおいて、主キーにあたる_key
という名前の仮想カラムが結果に正しく表れるようになりました。- インデックスカラムの
source
の値がGroongaの結果と同じになりました。
table_create
コマンド:TABLE_HASH_KEY
,TABLE_PAT_KEY
, およびTABLE_DAT_KEY
のテーブルにおいて、key_type
パラメータが必須になりました。 パラメータを指定しなかった場合はエラーが返ります。 (現在の所Groongaはkey_type
パラメータ無しのtable_create
コマンドへのリクエストを受け付けますが、これは既知の不具合です。)
改善点の詳細な一覧
- Droonga-engine 1.0.8
- Groongaの
select
,column_list
, およびtable_create
の各コマンドの互換性が向上しました。 (詳細は上記) - 静的な設定ファイルに書かれた
daemon
オプションは無視されるようになりました。 このバージョンから、droonga-engine
をデーモンとして起動するためには、droonga-engine
コマンドへの--daemon
オプションの指定が必須となりました。 droonga-engine-configure
コマンドが、常にすべてのオプションについての入力を求めるようになりました。droonga-engine-absorb-data
とdroonga-engine-join
の各コマンドについて、初期状態でデータのコピー速度が1秒あたり最大100件ずつまでに制限されるようになりました。droonga-engine-absorb-data
とdroonga-engine-join
の各コマンドについて、可能な場合は進行状況が表示されるようになりました。
- Groongaの
- Droonga-http-server 1.0.9
- 接続要求を受け付けるIPアドレスを制限するための新しいオプション
--host
が利用可能になりました。 既定値は0.0.0.0
(「すべてのIPアドレスで接続を受け付ける」の意味)です。 - キャッシュの有効期限を指定するための新しいオプション
--cache-ttl-in-seconds
が利用可能になりました。 単位は秒数で、既定値は60
(1分)です。 --enable-trust-proxy
の設定が静的な設定ファイルで有効化されている時に明示的に機能を無効化するためのオプションとして--disable-trust-proxy
が利用可能になりました。- ドキュメントルートを指定するための新しいオプション
--document-root
が利用可能になりました。 初期値は組み込みのGroonga管理ページのパスです。 - 静的な設定ファイルに書かれた
daemon
オプションは無視されるようになりました。 このバージョンから、droonga-engine
をデーモンとして起動するためには、droonga-http-server
コマンドへの--daemon
オプションの指定が必須となりました。 droonga-http-server-configure
コマンドが、常にすべてのオプションについての入力を求めるようになりました。- ほとんどのコマンドに対するリクエストが無駄にキャッシュされなくなりました。
現在のところは、
search
およびGroongaのselect
コマンド、および管理ページのレスポンスのみがキャッシュされます。 - すべてのレスポンスキャッシュを消去するためのエンドポイントとして、
/cache
が利用可能になりました。 キャッシュされたコンテンツを消去するには、このパスに対してHTTPのDELETE
メソッドのリクエストを送信してください。 express-droonga
の改善が反映されました。詳細は以下の項目を参照してください。
- 接続要求を受け付けるIPアドレスを制限するための新しいオプション
- Express-droonga 1.0.7
- バックエンドとして複数のDroonga Engineノードに接続できるようになりました。
これにより、
express-droonga
は簡易的なロードバランサーとして振る舞います。 - 接続するDroonga Engineノードのリストを、クラスタ内で実際に利用可能なノードのリストに基づいて更新できるようになりました。
この機能は
application.droonga()
メソッドに渡すsyncHostNames
オプションにより有効化できます。
- バックエンドとして複数のDroonga Engineノードに接続できるようになりました。
これにより、
- Drnbench 1.0.4
drnbench-request-response
- 最もレスポンスが遅かったリクエストだけでなく、最もレスポンスが速かったリクエストも出力するようになりました。
これは、おかしなクエリなどによって発生する「異常に良い」結果の検出に役立つでしょう。
報告されるリクエストの件数は、
--n-fast-requests
オプションで制御できます。 - 仮想クライアントがマルチプロセスで動作するようになりました。 ベンチマークを動作させるクライアントに複数のプロセッサが搭載されている場合、drnbenchはそれらをより効果的に使えるようになりました。
- 最もレスポンスが遅かったリクエストだけでなく、最もレスポンスが速かったリクエストも出力するようになりました。
これは、おかしなクエリなどによって発生する「異常に良い」結果の検出に役立つでしょう。
報告されるリクエストの件数は、
- Drntest 1.1.7 (2014-11-18にリリース)
- Groongaの
column_list
コマンドのレスポンスに現れる、_key
のような仮想的なカラムを正しく受け付けるようになりました。
- Groongaの
まとめ
- Droonga 1.0.8をリリースしました!
- フロントエンドのHTTPサーバのノードが、クラスタの構成ノードとして管理されるようになりました。 これにより、Droongaクラスタはより堅牢に動作するようになりました。
- 検索処理のパフォーマンスが改善されました。 Droongaは現在、Groongaと同等かそれ以上のスループット性能を発揮できます。
- Groongaとの互換性が向上しました。
- Droongaプロジェクトは今後も新バージョンを毎月リリースしていきます。乞う御期待!
Droongaプロジェクトはユーザや開発者としての皆さんのご協力をお待ちしています! 詳しくはコミュニティのページをご覧下さい。