[groonga-dev,03087] [ANN] Groonga 5.0.0

Back to archive index

HAYASHI Kentaro hayas****@clear*****
2015年 2月 9日 (月) 12:41:49 JST


今日は年に一度の肉の日(2/9)ですね。

Groongaは毎月こつこつとリリースを続けています。
昨年の肉の日にGroonga 4.0.0をリリースしてからも、毎月のリリースで
多くの改善や不具合修正をとりこんできました。

そこで、一年ぶりにGroongaをメジャーバージョンアップすることにしました。

これもGroongaを使ってくれているみなさんからのフィードバックがあったおかげです。
ありがとうございます!

Groonga 5.0.0をリリースしました!
  http://groonga.org/ja/docs/news.html#release-5-0-0

それぞれの環境毎のインストール方法はこちらを見てください。
  http://groonga.org/ja/docs/install.html

今回のリリースではデータベースのファイル形式は互換性があります。
データベースを作りなおす必要はありません。

主なトピックは次の通りです。

* [実験的] シャーディングを実現するプラグインをサポート
* Groonga 4.0.0からのあゆみ

○ [実験的] シャーディングを実現するプラグインをサポート

今回のリリースでは実験的にシャーディングを実現するプラグインを追加しました。

このプラグインを有効にするには、あらかじめ以下のようにしてプラグインを登録しておく必要があります。
(testdb/dbは実際のGroongaのデータベースで適宜読み替えてください。)

  $ groonga testdb/db
  > register sharding
  
さて、このプラグインを使うとどんなことができるのでしょうか。
ログを複数のテーブルに格納する例を紹介します。

  table_create Logs_20150203 TABLE_NO_KEY
  column_create Logs_20150203 timestamp COLUMN_SCALAR Time
  column_create Logs_20150203 message COLUMN_SCALAR Text
  
  table_create Logs_20150204 TABLE_NO_KEY
  column_create Logs_20150204 timestamp COLUMN_SCALAR Time
  column_create Logs_20150204 message COLUMN_SCALAR Text
  
  table_create Logs_20150205 TABLE_NO_KEY
  column_create Logs_20150205 timestamp COLUMN_SCALAR Time
  column_create Logs_20150205 message COLUMN_SCALAR Text
  
  load --table Logs_20150203
  [
  {"timestamp": "2015-02-03 23:59:58", "message": "Start"},
  {"timestamp": "2015-02-03 23:59:58", "message": "Shutdown"},
  {"timestamp": "2015-02-03 23:59:59", "message": "Start"},
  {"timestamp": "2015-02-03 23:59:59", "message": "Shutdown"}
  ]
  
  load --table Logs_20150204
  [
  {"timestamp": "2015-02-04 00:00:00", "message": "Start"},
  {"timestamp": "2015-02-04 00:00:00", "message": "Shutdown"},
  {"timestamp": "2015-02-04 00:00:01", "message": "Start"},
  {"timestamp": "2015-02-04 00:00:01", "message": "Shutdown"},
  {"timestamp": "2015-02-04 23:59:59", "message": "Start"},
  {"timestamp": "2015-02-04 23:59:59", "message": "Shutdown"}
  ]
  
  load --table Logs_20150205
  [
  {"timestamp": "2015-02-05 00:00:00", "message": "Start"},
  {"timestamp": "2015-02-05 00:00:00", "message": "Shutdown"},
  {"timestamp": "2015-02-05 00:00:01", "message": "Start"},
  {"timestamp": "2015-02-05 00:00:01", "message": "Shutdown"}
  ]
  
ここでは2015/02/03から2015/02/05まで一日ごとに次の3つのテーブルを作成しています。
(起動やシャットダウンしたログを各テーブルに分割して格納します。)

  * Logs_20150203
  * Logs_20150204
  * Logs_20150205

そして、テーブルにあわせて、timestampが一致するレコードをそれぞれ
loadコマンドを使って登録しています。

では、条件にあうログの該当件数を絞りこんでみましょう。
この場合、selectコマンドではなくて専用のlogical_countコマンドを使うのがポイントです。

  logical_count Logs timestamp \
    --filter 'message == "Shutdown"' \
    --min "2015-02-04 00:00:00" \
    --min_border "include"

上記のクエリで timestampが "2015-02-04 00:00:00"以降に"Shutdown"がmessageに記録されている
レコード数を分割されたテーブルを気にすることなくカウントできます。

この機能が追加されたことにより次のメリットがあります。

メリット: Groongaのテーブルに格納できるレコード数の制限を越えられる

Groongaには1つのテーブルに追加できるレコード数が約2億6千万という制限があります。
この制限はキーのサイズが大きかったりすると変動し、より少ないレコードしか格納できない
ことがあります。

  テーブルの制限
  http://groonga.org/ja/docs/limitations.html#limitations-of-table

テーブルを分割しても、それを意識せずカウントできるようになったのが嬉しいところです。
内部的には、テーブルが分割されていると探索範囲をあらかじめ絞れるので、
余計なチェックがいらなくなって速くなることが期待できます。

デメリット: テーブルの追加やデータの登録は自前でがんばらないといけない

まだ実験的なので、SQLのPARTITIONING BYのような便利な構文はありません。
そのため、table_createでテーブル名の末尾が_YYYYMMDDとなっている日ごとの
テーブルを明示的に作成しないといけません。

また、データを登録する際も適切なテーブルにデータを登録してあげないといけません。
Logsテーブルを指定したらLogs_YYYYMMDDテーブルに勝手にふりわけてデータを登録してくれたりはしません。

そのため、今のところはわかっている人向けの機能という扱いです。

○ Groonga 4.0.0からのあゆみ

Groonga 4.0.0をリリースしてからいろんな機能追加や変更がありました。

* 重みつきベクターカラムのサポート(4.0.1)
  検索スコアのチューニングがしやすくなりました。
* UbuntuのパッケージをPPAで配布開始(4.0.2)
* tokenizer_list,normalizer_listコマンド追加(4.0.2)
* Groonga HTTPサーバーでPOSTをサポート(4.0.3)
* Groongaの管理画面の標準表記を英語モードに(4.0.4)
  海外のGroongaユーザーにはデフォルト日本語はつらかったようです
* highlight_full,highlight_htmlをサポート(4.0.5)
  ハイライトするのに便利な関数が追加されました
* mrubyによる範囲検索の最適化(4.0.6)
  mrubyを組みこんだメリットが徐々にでてきました
* バグ報告をGitHub推奨に(4.0.6)
  Redmineは承認が必要だったので報告しやすくなったでしょうか
* LZ4によるカラムの圧縮をサポート(4.0.7)
  ディスクを効率よく扱えるようになりましたね
* range_filterのサポート(4.0.8)
  マッチしたレコード数がいらない用途なら速いのでおすすめです
* groonga-httpdをデフォルトに(4.0.9)
  実験的扱いだったnginxベースのHTTPサーバーをパッケージ版で
  推奨することにしました。Groonga本体のHTTPサーバー機能は削除していないので
  依然としてワンライナーでHTTPサーバーを立ち上げることはできます
* バグフィックスリリース(4.1.0)
  4.0.9でインデックスが壊れるかも知れない問題があったので緊急リリースしました
  アップグレード後にインデックスを更新してしまった場合はインデックスを作りなおす必要があります。
  http://groonga.org/ja/docs/news.html#release-4-1-0-2015-01-09
* drilldownでSUM、MIN、MAX、AVGのサポート (4.1.1)
  より高度なドリルダウンができるようになりました

上記は抜粋ですがこうしてふりかえってみると実にもりだくさんですね。
ディスクの肥大化を抑制したり、パフォーマンスを改善するしくみをとりいれたのも
4.xでした。

毎年11/29(いい肉の日)のイベント以外にも、各地でGroongaの小規模なイベントが
あれこれと開催されたのも記憶に新しいところです。

Groongaは5.xでもまだまだ進化していきます。
これからもGroongaでガンガン検索してください!

○ 変更点

さて、4.1.1からの変更点は以下の通りです。
  http://groonga.org/ja/docs/news.html#release-5-0-0

改良

  * [doc] スクリプト構文 の セキュリティー に関して追加しました。
  * [実験的] シャーディングするためのプラグインを追加しました。
    有効にするには register sharding を前もって実行します。
    レコードをselectするには logical_count を使います。
  * [cmake] FreeBSD 10.1でのコンパイルエラーを修正しました。
    [MDEV-7293] [Bernard Spilさんが報告]
  * プラグインのディレクトリをカスタマイズできるようにしました。
    その場合 GRN_PLUGINS_DIR 環境変数を設定します。
    
修正

  * システムに互換性のないバージョンのOnigmoもしくは
    Onigurumaのヘッダーがインストールされているとビルドに失敗する問題を修正しました。
    [GitHub#276] [武者さんがパッチ提供]
  * MSVCのtime関連でビルドに失敗する問題を修正しました。 [GitHub#237]

感謝

  * 武者さん
  * Bernard Spilさん
-- 
HAYASHI Kentaro <hayas****@clear*****>




groonga-dev メーリングリストの案内
Back to archive index