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人未満

zabbix でウェブサービスのパフォーマンスを確認する方法

web.page.perf というkey があるのでそれを使う。簡単すぎる。

  • 書式は web.page.pref[domain, path, port]
    • 例: web.page.pref[d.hatena.ne.jp, tnksaigon]
  • ドメインのところに http:// は必要ない
  • データ型を float にしないと取得できません。
  • interval を初期値の 30sec とかにすると自爆するので 600sec とかに変更しておく
    • 監視したいのは重いページとかになるのでここは注意

プログラマが素敵なボタンを作りたいと思ったら「Da Button Factory」

Webアプリを作っていて、デザイナーさんに頼む程でもないけど、ちょっと素敵な素材が欲しいなーと思うことはよくあります。

ボタンについても、

<input type="button" value="登録する &#187;" />

なんてすれば、10秒でできちゃうんですが、なんか味気ない。

そこで、「Da Button Factory」です。

http://dabuttonfactory.com/

形、サイズ、グラデーションやシャドウを決めるとそこそこのボタンができちゃいます。

iconfinder で見つけたアイコンをPhotoshopで組み合わせると、なかなかよいfacebookボタンが出来ました。

zabbix でNginx の監視

1. まずはNginxに監視ページを設定しておく

http://wiki.nginx.org/HttpStubStatusModule

location /nginx_status {
  stub_status on;
  access_log   off;
  allow SOME.IP.ADD.RESS;
  deny all;
}

SOME.IP.ADD.RESS にはデータを収集するzabbix agentのIPアドレスを設定

2. zabbix agentにUserParamを登録

/etc/zabbix/zabbix_agentd.conf

# Nginx statuses
UserParameter=nginx.active_connections,wget -q -O - http://localhost/status | grep "Active connections:" | cut -d " " -f 3
UserParameter=nginx.reading, wget -q -O - http://localhost/status | grep "Reading:" | cut -d " " -f 2
UserParameter=nginx.writing, wget -q -O - http://localhost/status | grep "Reading:" | cut -d " " -f 4
UserParameter=nginx.waiting, wget -q -O - http://localhost/status | grep "Reading:" | cut -d " " -f 6
UserParameter=nginx.accepted_connections, wget -q -O - http://localhost/status | grep "^ " | cut -d " " -f 2
UserParameter=nginx.handled_connections, wget -q -O - http://localhost/status | grep "^ " | cut -d " " -f 4
UserParameter=nginx.handled_requests, wget -q -O - http://localhost/status | grep "^ " | cut -d " " -f 6

これで各パラメーターがzabbixで取得できる。いや、簡単。


それにしても、zabbixのWeb UIでそのパラメータを設定していくのは。。。