ngx_http_groongan全文検索nginx

: author

須藤功平

: institution

クリアコード

: content-source

nginx Tech Talks

: date

2016-02-08

: allotted-time

5m

: theme

.

nginx

* HTTPサーバー
* HTTPリバースプロキシサーバー
* (('wait'))メールプロキシサーバー
* (('wait'))TCPプロキシサーバー\n
  (('note:1.9.0から。まだmainline。'))

((‘wait’)) ((‘tag:center’)) nginx = いろいろできるサーバー

全文検索nginx

* HTTPサーバー
* HTTPリバースプロキシサーバー
* メールプロキシサーバー
* TCPプロキシサーバー
* [((*New!*))]全文検索エンジン!

使い方:登録

# image
# src = images/register.svg
# relative_height = 100

使い方:検索

# image
# src = images/search.svg
# relative_height = 100

速度:1リクエスト

# CPU:core i7・8コア・ハイパースレッディング # # ソース:Wikipedia日本語版 # レコード数:1846514 # データサイズ:約7GB # キーワード:nginx # ヒット数:26件 # 検索時間(出力レコード数0):0.4ms # 検索時間(出力レコード数10・タイトルのみ出力):0.6ms # 検索時間(出力レコード数10・タイトルと本文を出力):2ms

* 対象:Wikipedia日本語版
* レコード数:約185万件
* データサイズ:約7GB
* 検索キーワード:nginx

((‘wait’)) ((‘tag:center’)) ((‘tag:x-large’)) 0.6msn ((‘note:Intel Core i7-6700 3.40GHz’))

速度:スループット

# ベンチマーク(出力レコード数10・タイトルのみ出力・ワーカー数8・有線LANで接続)

# image
# src = throughput-no-keep-alive.pdf
# relative_height = 90

((‘tag:center’)) ((‘note:ワーカー数を増やすとCPUコア数までスケール’))

速度:スループット

# image
# src = throughput-with-keep-alive.pdf
# relative_height = 90

((‘tag:center’)) ((‘note:クライアントがkeep-aliveを使うとさらにスケール’))

速度

* 1リクエストの処理も速い
* スループットも出る
  * ワーカー数を増やすとスケール
  * keep-aliveでさらにスケール

速さの理由

* (('wait'))本物の全文検索エンジンを組込
  * →1リクエストの処理が速い\n
    (('note:(しかも豊富な機能)'))
* (('wait'))それもnginxのよさを殺さずに
  * 例:マルチプロセスでスケール
  * 例:性能向上用のHTTPの機能を利用\n
    (('note:(keep-alive、レスポンス圧縮など)'))
  * 例:I/O多重化(('note:(同時接続数の増加に対応)'))

本物の全文検索エンジン

# image
# src = images/groonga-logo.svg
# relative_width = 100

((‘tag:center’)) (ぐるんが)

Groonga

* 速い
* (('wait'))日本語に強い(国産)
* (('wait'))ライブラリーとして使える
  * ((*組み込みやすい*))
* (('wait'))((*マルチプロセス*))対応
  * 複数のプロセスで同時にDBを使える

組込方法

モジュール

ngx_http_groonga

# image
# src = images/ngx_http_groonga.svg
# relative_height = 100

Groongaから見たメリット

* nginxと連携すると…
  * (('wait'))プロセス管理を任せられる
  * (('wait'))クライアントとのI/Oを任せられる
  * (('wait'))keep-alive・認証・TLS・圧縮対応
  * (('wait'))HTTP2対応(('note:(まだmainline)'))

((‘wait’)) ((‘tag:center’)) 全文検索に集中できる!

困ったこと

* nginxのWindows用バイナリーを\n
  GNU/Linux上でビルドできない
  * (('wait'))Groongaはバイナリーを配布したい
  * (('wait'))Windowsが必要だとリリース作業がツライ

対策

((‘wait’)) パッチを送る

結果

((‘wait’)) 取り込まれたn ((‘note:(1.7.7 released at 2014-10-28)’))

パッチが取り込まれるまで

* (('wait'))hgでパッチを作る
* (('wait'))メーリングリストに送る
* (('wait'))やりとりする
* (('wait'))取り込まれる

((‘wait’)) ((‘tag:center’)) 結構反応してくれるからn なにかあったら送るといいよ!

全文検索nginx

* nginx + Groonga\n
  (('note: = groonga-httpd:Groongaパッケージに含まれている'))
  * (('wait'))nginxが全文検索エンジンに!
  * (('wait'))nginxのモジュール機能で実装

((‘wait’)) ((‘tag:center’)) モジュールを作ってn nginxと共存しよう!

お知らせ

* (('wait'))MySQL・PostgreSQLとも共存
* (('wait'))Groongaは肉の日リリース

((‘wait’)) ((‘tag:center’)) 2月9日にイベントあります!n n MySQLとPostgreSQLとn 日本語全文検索n (DMM.comラボにて)