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() : 楕円近似(ヒュベニ) - 精度が高く計算が遅い
- 測地系
* モデルにしている楕円体が違うのが理由
- 当初はパフォーマンスが悪かった
- => 転置インデックスの利用でパフォーマンス確保した
- 540,000件のデータでのパフォーマンス
* 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
- fulltext search index in postgresql
- N-gram, 形態素解析の両方が可能
- > CREATE INDEX index ON table USING groonga (doc);
- groonga_fdw
- SQL/MED
- from SQL:2003 standard
- Foreign table/ DATALINK
mroonga のbenchmark
- MySQLでのパフォーマンス
- benchmark 項目
- 高速な全文検索
- 高速な位置情報検索
- 即時更新
- 全文検索機能パフォーマンス
- 位置情報検索
- 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のタイプを教えてほしい
- Q. ぐるなびでの使用は障害対応、原因を教えてください
- A. 20QPS x 3 で運用しているが、障害は起きてない
- A. 緯度経度検索のバグはある
- Q. データの壊れやすさって。。
- A. 現状の実装ではプロセス停止では壊れないけどKernelが落ちるとやばいかも
- A. プロセス停止時にはmemory corruptionが心配
- Q. groonga を3台で動かす方法
- A. データは同じデータを持っている
- A. 参照はHTTPでgroongaと通信していて、Load Balancerを使っている
- A. 更新はバックグラウンドプロセスで3台一緒に更新している
半分くらいの人が使ってた。業務ベースでは10人未満
Apacheやらのログから特定の時間だけ抽出する by Bash
直前1時間(12時台とか)のみ抽出する
grep "`date -d '1 hour ago' +'%b %d %H'`" *access_log
grep "`date -d '1 hour ago' +'%b %d %H'`" /var/log/httpd/*error_log | mail -s "apache error log" my@address.com
をcronに設定しとけば1時間おきにエラーをメールで送ってもらえるな。
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="登録する »" />
なんてすれば、10秒でできちゃうんですが、なんか味気ない。
そこで、「Da Button Factory」です。
形、サイズ、グラデーションやシャドウを決めるとそこそこのボタンができちゃいます。
iconfinder で見つけたアイコンをPhotoshopで組み合わせると、なかなかよいfacebookボタンが出来ました。
【メモ】linux サーバーからのHTTP リクエストを検証したい時に使うコマンド
output.txt に80番のやり取りが収集される
tcpdump -n -i eth0 -s 0 -w output.txt src or dst port 80
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でそのパラメータを設定していくのは。。。