groonga 勉強会@VOYAGE GROUPに行ってきた

忘れないうちにメモ。
40分くらい遅れてしまったので、そこからの話。

mroonga

  • 全文検索エンジン
  • MySQLで使える => wrapper mode
  • 位置情報での検索が出来る
  • spider を使うとshardingできる => scaleout
  • ruby on rails サポート
  • maria DBにbundleされることになった

Geographical searching

  • ぐるなびの人
  • レストラン、地図、駅、GPSの検索
  • 緯度軽度検索 - 2点間の座標から形成される矩形、または円形内のデータを検索する
    • geo_in_rectangle(), geo_in_circle()
  • 距離もわかる
    • geo_distance() : 方形近似 - 精度が低く計算が速い
    • geo_distance2() : 円形近似
    • geo_distance3() : 楕円近似(ヒュベニ) - 精度が高く計算が遅い
  • 測地系

* モデルにしている楕円体が違うのが理由

* 0.34sec => 0.03sec

groonga with PostgreSQL

  • Extensibility of PostgreSQL
    • PostgreSQLは拡張性が高い
    • function, data type, PL をすべて拡張できる
    • index の拡張
    • table も拡張できるようになった
  • PGXN => CPANみたいな extension library
    • > pgxn install tinyint でinstall 出来る
    • > echo "CREATE EXTENSION tinyint;" > psql
  • How to work with groonga
  • textsearch_groonga
  • groonga_fdw
    • Foreign Data Wrapper
    • API for SELECT
    • FDWを使うと、外部ストレージのデータを取得できる
    • Amazon S3, Twitterなんかを外部ソースとして使える
    • groonga_fdw を使うと、groongaをデータソースを使える
    • > CREATE EXTENSION grooga_fdw;
    • > CREATE SERVER groonga_server x....
    • あとは普通にSELECT出来る
    • 参照用のテーブルをgroongaにしてSELECTしまくるとかに使える
    • 年内にアルファ版が出ると思う。。。
  • SQL/MED
    • from SQL:2003 standard
    • Foreign table/ DATALINK

mroonga のbenchmark

  • MySQLでのパフォーマンス
  • benchmark 項目
    • 高速な全文検索
    • 高速な位置情報検索
    • 即時更新
  • 全文検索機能パフォーマンス
    • 1M 件のtweetに10,000回の検索にかかる時間
    • MyISAM より1/2
    • InnoDB より1/10
    • mroonga で5秒くらい
  • 位置情報検索
    • 11M 件の番地データMBRContains + ORDER BY で1000回の検索
    • MyISAMよりちょっと速い
    • mronnga で1250secくらい
    • LIMIT 1 にするとMyISAMのほうが速いけど、1/100secくらいの差
  • 1Mのtweetが保存されているテーブルに20,000件のtweetを新たに追加する場合
    • mroonga のでほうがむちゃくちゃ速い
  • 検索しながらの更新でもパフォーマンスの低下が少ない
    • 1000クエリ/sec でも0.5%くらいの低下

話が早くて追いきれなかった。。

mroonga未サポート機能

  • UTF-8 のみサポート
  • COLLATION はNFKCを使っているがMySQLのCOLLATIONは使えない
  • condition pushdownは未サポート
  • 点以外の空間情報はサポートしていない
    • 要件募集中
  • 0またぎの緯度経度の検索が出来ない
    • 北極周辺とかはうまく検索できない
    • 日本地図上は問題なし
  • MySQL5.6で登場する一情報検索はサポートしていない
  • ストレージモードでNULLは使えない
  • InnoDBトランザクションでrollbackすると、mroongaのindexが置き去りにされる
  • repair table は未サポート groonga は修復されない
  • parallel searching by spiderはできない

groonga開発予報

  • 本日リリース 1.2.8
  • grn_dat : ダブル配列 => 参照最速、前方一致検索、参照ロックフリー
    • grn_pat : パトリシアトライ => 前方一致検索
    • grn_hash : ハッシュ表 => 速いけど前方一致をサポートしない
  • 文字列更新をサポートしている
  • 前方一致検索
    • Common Prefix Search
    • Predictive Search
  • 参照メインのデータの処理に使いなさい
  • benchmark
    • wikipedia title 1M件
    • ランダム登録からの参照 => grn_pat より30%くらい速い
    • 更新は遅くなった
    • メモリ消費は2倍くらいになる
  • 今後
    • 頻出語のキャッシュ機能
    • grn_hashの構築時間の修正
    • アクセスの少ないデータを圧縮する機能

Q&Aタイム

  • Q. benchmark に使用したindexのタイプを教えてほしい
    • A. デフォルトのindexを使った (mroonga: N-gram)
    • A. MySQLとあわせるために英語のデータで試験した
  • Q. ぐるなびでの使用は障害対応、原因を教えてください
    • A. 20QPS x 3 で運用しているが、障害は起きてない
    • A. 緯度経度検索のバグはある
  • Q. データの壊れやすさって。。
    • A. 現状の実装ではプロセス停止では壊れないけどKernelが落ちるとやばいかも
    • A. プロセス停止時にはmemory corruptionが心配
  • Q. groonga を3台で動かす方法
    • A. データは同じデータを持っている
    • A. 参照はHTTPでgroongaと通信していて、Load Balancerを使っている
    • A. 更新はバックグラウンドプロセスで3台一緒に更新している


半分くらいの人が使ってた。業務ベースでは10人未満