BloGroonga

2015-02-09

今日は年に1度の記念すべき肉の日(2/9)ですね。

Groonga 5.0.0リリース

昨年2月9日以来のメジャーアップデートである Groonga 5.0.0 をリリースしました!

今回のリリースでメジャーバージョンがあがって5.0.0となっています! メジャーバージョンはあがりましたが、データベースのファイル形式は互換性があるのでデータベースを作りなおす必要はありません。

先月のリリースから間もないので、びっくりするかも知れませんが、毎月こつこつリリースしてきたぶんがたまっているので、Mroongaと足並みを揃えてどーんと5.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千万というテーブルの制限があります。 この制限はキーのサイズが大きかったりすると変動し、より少ないレコードしか格納できないことがあります。

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

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

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

また、データを登録する際も適切なテーブルにデータを登録してあげないといけません。Logsテーブルを指定したらLogs_YYYYMMDDテーブルに勝手にふりわけてデータを登録してくれたりはしません。そのため、今のところはわかっている人向けの機能という扱いです。

5.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でインデックスが壊れるかも知れない問題があったので緊急リリースしました。アップグレード後にインデックスを更新してしまった場合はインデックスを作りなおす必要があります。

  • drilldownでSUM、MIN、MAX、AVGのサポート (4.1.1)

より高度なドリルダウンができるようになりました

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

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

各リリースではユーザさんからの報告をもとにバグ修正や改善を行うことができました。ありがとうございます。 Groongaをもっと良くしていくために、これからも宜くおねがいします!

さいごに

4.1.1からの詳細な変更点は 5.0.0リリース 2015/02/09 を確認してください。

それでは、Groongaでガンガン検索してください!