Kouhei Sutou
kou****@clear*****
2012年 6月 8日 (金) 09:07:11 JST
須藤です。 In <20120****@gmail*****> "[groonga-dev,00937] ActiveGroonga での他ホストgroongaサーバーへの接続方法" on Thu, 07 Jun 2012 11:49:08 +0900, Shinya Kawaji <kawaj****@gmail*****> wrote: > ActiveGroongaでのサービス運営を行っているのですが、複雑な条件での検索が > 多いからか、常に過負荷な状態に陥っていて、サービス自体に影響が生じて > います。 おぉ。。。 ということは、CPUがボトルネック(CPUを使いきっている)感じで しょうか?それともディスクI/Oやメモリ不足でしょうか? > そのため、groongaサーバーを別のホストに立てて動かそうと思っているのです > が、その方法が分からず、苦労しています。 > > ActiveGroonga自体にそのような機能が用意されていないように見受けられるの > ですが、その理解は正しいでしょうか。その場合、将来的に実装される見込みは > ありますでしょうか。 理解は正しいです。用意されていません。 また、ActiveGroongaに実装される見込みもありません。。。 ネットワーク越しにgroongaを使う場合は↓にあるクエリAPIという APIレイヤーを使う必要があります。 http://www.clear-code.com/archives/groonga-night-2-introduction/groonga-village-18.html http://www.clear-code.com/blog/2011/12/1.html しかし、ActiveGroongaは(rroongaを経由して)DB APIを使うよう に作られているため、同じ設計思想のままネットワーク越しの groongaを使うとひずみが生じて使いづらくなってしまうと考えて います。 で、今後、ネットワーク越しに使う方法がサポートされないかとい うとそうでもなくて、以下のようなことを考えています。 1 クエリAPI上によりプリミティブな機能を追加する 今のselectコマンドはオプションがたくさんあり、いろいろ指 定すると一発でいい感じにやってくれる作りになっていますが、 selectでサポートしていないことを実現することができません。 (そりゃそうですが。) しかし、今のselectだとできないけども、DB APIを使えばでき るようなこともあります。例えば、(私が勝手に)「多段ドリ ルダウン」と呼んでいるものです。 http://www.clear-code.com/archives/motinology-2012-1/rroonga-search-09.html http://www.clear-code.com/blog/2012/1/26.html これをクエリAPI上で実現するためにDB APIにあるようなプリ ミティブな操作もクエリAPI上で使えるようにしています。 (最新リリースにこっそり入っています。が、「実験的な機能」 という扱いです。) 通常はselectでがんばってね、でも、複雑なことをしたかった らプリミティブな操作を使ってがんばってね、という位置づけ を狙っています。 2 ネットワーク越しにクエリAPIを便利に使えるRubyライブラリ を提供する。 groongaはgqtpという独自プロトコルとHTTPという一般的なプ ロトコルをサポートしています。ネットワーク越しにアクセス するときはどちらかを使うのですが、HTTP経由で使うときは libgroonga.soなどは必要なくピュアRubyで実装できます。そ のため、rroongaとは別のライブラリを新しく開発し、そっち はlibgroongaなどに依存しない、インストールしやすいライブ ラリにする予定です。 3 2で作ったライブラリの上にActiveGroonga風の機能を実装した ライブラリを提供する。 ActiveRecordに対するActiveResourceのようなイメージです。 このライブラリがあれば、ActiveGroongaのようにRailsで ActiveRecordを使うような雰囲気でネットワーク越しの groongaを使えるようになります。 が、すぐに↑ができるという見通しはまだありません。。。 > または今の時点でも、他ホストの groongaサーバーに接続する方法は有りますで > しょうか。 ActiveGroongaのAPIを使わなければできるんですよね。。。 もしよかったら、今の構成を教えてもらえませんか? たぶん、データの更新やスキーマの管理などはActiveGroongaを使っ たほうが便利だと思うのですが、検索はgroongaサーバーに任せて もそんなに不便にならないかもしれません。なので、↓のような構 成にできれば解消できるかもしれないです。 before: クライアント <- HTTP -> Rails + ActiveGroonga (groonga DB) after: クライアント <- HTTP -> リバースプロキシ <- (更新系の画面) -> Rails + ActiveGroonga (groonga DB) groongaサーバーも 立ち上げる <- (参照系の画面) -> Rails + rroonga afterの「Rails + ActiveGroonga」と「Rails + rroonga」は別のマ シンで、前者をDBサーバー、後者を検索サーバーと呼ぶことにしま す。groongaのDBはDBサーバーが持っています。DBサーバーでは groongaサーバーも起動していることがポイントです。「Rails + ActiveGroonga」とgroongaサーバーは同じDBを使います。 「Rails + rroonga」の方はDBサーバーで起動しているgroongaサー バーに接続します。接続方法は調べてもらった方法であっています。 > (2) rroongaでは、Context#connect を利用する > > _context = Groonga::Context.new > _context.connect(:host => "192.168.0.100") > _context.select("Items") > > ただし、Context#[] は利用出来ない(?) > _context["Items"] #=> nil ただし、↑にもある通り、Context#selectしか使えません。 参考: Context#connectした場合はDB APIではなくクエリAPIを使う ことになります。つまり、 http://groonga.org/ja/docs/commands.html にあるようなコマンドだけで操作できます。 これらのコマンドは以下のように使います。 context.send("select Items --limit 10") response_id, result = context.receive p JSON.parse(result) ただし、selectコマンドだけは便利なAPIを用意していて、 context.select("Items", :limit => 10) # -> JSONをパースして、さらに使いやすいように整えた検索結果 などというようにRubyっぽく書けるようになっています。 いろいろ書いてしまってかえって混乱させてしまうような気がしな くもないですが、参考になるとうれしいです。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) groongaサポート: http://groonga.org/ja/support/ プログラミングが好きなソフトウェア開発者を募集中: http://www.clear-code.com/recruitment/