Droonga 1.0.8をリリースしました!

Droonga 1.0.8をリリースしました!

2014-11-29

Droongaとは?

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-datadroonga-engine-joinの各コマンドについて、初期状態でデータのコピー速度が1秒あたり最大100件ずつまでに制限されるようになりました。
    • droonga-engine-absorb-datadroonga-engine-joinの各コマンドについて、可能な場合は進行状況が表示されるようになりました。
  • 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の改善が反映されました。詳細は以下の項目を参照してください。
  • Express-droonga 1.0.7
    • バックエンドとして複数のDroonga Engineノードに接続できるようになりました。 これにより、express-droongaは簡易的なロードバランサーとして振る舞います。
    • 接続するDroonga Engineノードのリストを、クラスタ内で実際に利用可能なノードのリストに基づいて更新できるようになりました。 この機能はapplication.droonga()メソッドに渡すsyncHostNamesオプションにより有効化できます。
  • Drnbench 1.0.4
    • drnbench-request-response
      • 最もレスポンスが遅かったリクエストだけでなく、最もレスポンスが速かったリクエストも出力するようになりました。 これは、おかしなクエリなどによって発生する「異常に良い」結果の検出に役立つでしょう。 報告されるリクエストの件数は、--n-fast-requestsオプションで制御できます。
      • 仮想クライアントがマルチプロセスで動作するようになりました。 ベンチマークを動作させるクライアントに複数のプロセッサが搭載されている場合、drnbenchはそれらをより効果的に使えるようになりました。
  • Drntest 1.1.7 (2014-11-18にリリース)
    • Groongaのcolumn_listコマンドのレスポンスに現れる、_keyのような仮想的なカラムを正しく受け付けるようになりました。

まとめ

  • Droonga 1.0.8をリリースしました!
  • フロントエンドのHTTPサーバのノードが、クラスタの構成ノードとして管理されるようになりました。 これにより、Droongaクラスタはより堅牢に動作するようになりました。
  • 検索処理のパフォーマンスが改善されました。 Droongaは現在、Groongaと同等かそれ以上のスループット性能を発揮できます。
  • Groongaとの互換性が向上しました。
  • Droongaプロジェクトは今後も新バージョンを毎月リリースしていきます。乞う御期待!

Droongaプロジェクトはユーザや開発者としての皆さんのご協力をお待ちしています! 詳しくはコミュニティのページをご覧下さい。