en ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja en nb ja ja ja ja ja ja ja en ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja pl eu ja ja ja ja ja ja ja ja ja ja en ja ja en ja ja vi ja sv eu ja en en hu ja ja en en pl ja ja jbo hbs_lat en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja
GaaS: Groonga as a Service
同じデータに対して、複数のgroongaサーバーで独立して検索サービスを提供する機能
負荷の増大に対応できる
複数のgroongaサーバーがいるときの更新処理はすべてのgroongaサーバーで実行する機能
groongaサーバー毎に使用可能なリソース量を制限する機能
groongaサーバーで更新されたデータをリアルタイムでバックアップするAPI
一方、以下の機能は提供しません。
同じデータを複数のgroongaサーバーに分散して配置し、分散して1つのクエリを実行する機能
シャーディングはできない
分散して検索した結果をマージできない
データの永続性を保証する機能
groongaサーバーを落としたらそのgroongaサーバーが持っていたデータは消える
このことからGaaSは以下のようなケースで有用です。
るりまサーチのようにドキュメントを全文検索するケース
マスターデータが別にあるのでデータの永続性がなくても困らない(作りなおせばよい)
検索数が増えたらgroongaサーバーを追加すれば対応できる
マスターデータが別にあるのでデータの永続性がなくても困らない(作りなおせばよい)
検索数が増えたらgroongaサーバーを追加すれば対応できる
中規模(数十万レコード)くらいまでのECサイト
groongaサーバーを追加して負荷を分散できる
groongaはすぐに更新結果を検索に反映できるので、品切れになった商品はすぐにヒットしなくなる
バックアップAPIで更新データのバックアップをとっておけば、groongaサーバーがすべて落ちても復旧可能
複数のgroongaサーバーの管理を任せられる
シャーディング機能がないためレコード数(データ量)が多いケースには対応できませんが、レコード数がそれほど多くない場合は運用が楽になるため有用です。
GaaSの以下のそれぞれの機能の実現方法案を説明します。まだ作っていないので、実際に作ったらここから大きく方向が変わる可能性があります。
APIでgroongaサーバーを追加・削除する機能
同じデータに対して、複数のgroongaサーバーで独立して検索サービスを提供する機能
複数のgroongaサーバーがいるときの更新処理はすべてのgroongaサーバーで実行する機能
groongaサーバー毎に使用可能なリソース量を制限する機能
groongaサーバーで更新されたデータをリアルタイムでバックアップするAPI
APIでgroongaサーバーを追加・削除する機能
まずは、APIでgroongaサーバーを追加・削除する機能の実現方法案を説明します。
簡単のために、groongaサーバーを追加したい時、空いているサーバーはすでにあるとします3。問題は初期データをどうするかです。初期データは指定したURLからHTTPでダウンロードすることにします。こうすることで、GaaS側では初期データを管理する必要がなくなります。また、追加するサーバーは常に最新の初期データを参照できるので、どのgroongaサーバーの初期化処理でも手順が同様になりgroongaサーバーの追加が簡単です。
起動時の流れは以下のようになります。
初期データをHTTPでダウンロード
初期データをgroongaに投入
groongaサーバー起動
groongaサーバーの削除は、groongaサーバーを終了して関連ファイルを削除するだけです。
APIは作ればよいだけなので省略します。
同じデータに対して、複数のgroongaサーバーで独立して検索サービスを提供する機能
検索サービスを複数のgroongaサーバーで分担して提供する機能の実現方法案を説明します。
groongaはHTTPサーバーとして検索APIを提供できます。そのため、すでにあるHTTP関連の技術を使うことができます。クライアントからのリクエストを複数のgroongaサーバーに振り分ける機能はリバースプロキシを使って実現できるでしょう。
複数のgroongaサーバーがいるときの更新処理はすべてのgroongaサーバーで実行する機能
レプリケーション機能の実現方法案について説明します。
fluent-plugin-groongaを使うことにより、1つのgroongaサーバーで実行した更新処理を他のサーバーでも実行することができます。これによりレプリケーション機能を実現できます。
残る問題は、クライアントからのリクエストが更新リクエストか検索リクエストかを判断する方法です。更新リクエストの場合はfluent-plugin-groongaで処理しなければいけませんが、検索リクエストの場合は別々のgroongaサーバーで処理したいです。これは、以下のような構成にすることで実現可能ではないかと考えています4。
まず検索時の構成案を示します。
検索時 +--> fluentd -----> groonga クライアント --> リバースプロキシ --+--> fluentd -----> groonga +--> fluentd -----> groonga
検索時は、fluentdは単にデータを中継します。
更新時は、fluentdが更新クエリを全てのgroongaに配布します。以下は、真ん中のfluentdに更新リクエストが飛んだ場合です。同様に、他のfluentdに更新リクエストが飛んだ場合もすべてのgroongaサーバーに変更が反映されます。
更新時 fluentd +--> groonga クライアント --> リバースプロキシ -----> fluentd --+--> groonga fluentd +--> groonga
1つのGaaSシステムで複数のユーザーをホストするためには、他のユーザーのデータが読めないように認証機能が必要です。認証機能はHTTPの仕組みを使えばどうとでもなりそうです。
groongaサーバー毎に使用可能なリソース量を制限する機能
1つのGaaSシステムで複数のユーザーをホストした場合、1人のユーザーがリソースを使いすぎて他のユーザー用のサービスが提供できなくなることは問題です。そのため、groongaサーバー毎に使用可能なリソース量を制限し、制限を超えた場合は自動で再初期化したり、サービスを停止したりするような仕組みが必要です。GodやBluepillなどリソース監視も備えたプロセス監視システムはいくつかあるので、それらを使用すれば実現できるでしょう。あるいは、単に、ulimitとプロセス監視システムの組合せでもよいかもしれません。
groongaサーバーで更新されたデータをリアルタイムでバックアップするAPI
groongaサーバーで更新されたデータをリアルタイムでバックアップするAPIがあれば、初期データを随時更新して、groongaサーバーを追加した時に使う初期データを最新のデータにしておくことができます。
GaaSのレプリケーション機能はfluent-plugin-groongaで実現するので、fluentdのcopy outputプラグインとforward outputプラグイン機能を使ってこの機能を実現できます。
groongaをサービスとして提供する仕組みGaaS(Groonga as a Service。ガース。)の構想とそれの実現方法案を紹介しました。
GaaSを一緒に開発しながらクリアコードの開発方法を体験したいという方はインターンシップページを確認の上、応募してください。
他のインターンシップ対象のフリーソフトウェアを再掲します。
Firefox for AndroidおよびFirefox用アドオン
Mac OS X版GTK+用immodule(GtkIMCocoa)
ここでは「GaaS」という単語をgroongaの機能を提供するサービスおよびそのサービスを実現するソフトウェアの両方を示すものとして使っています。サービスだけを提供するのではなく、サービスを提供するソフトウェアも提供することで、自分の環境にサービスを構築することもできるようにします。データを外部に出したくない場合でも使えるようになります。 ↩
groongaをHerokuアドオンとして提供することに(インターンシップとは関係なく)興味のある方はお問い合わせフォームからご連絡ください。一緒に実現させましょう。 ↩
Amazon EC2などを使えば追加したい時に動的にサーバーを追加することはできるので、このあたりはそんなに困らないはず。groongaサーバーを設定するためのChefのcookbookを作っていたりします。 ↩
現在クリアコードではソフトウェア開発者を募集しています! フリーソフトウェア開発での開発の仕方をベースに、成果や知識を公開し共有しながら業務に携われます。
Groongaについて開発者に質問できる「グルカイ!」ほぼ毎週火曜日12:15-12:45 Groongaチャンネルで開催中です。 Groongaについて知りたい人、ぜひご参加ください。
Sylpheedのプラグインの作り方
RubyKaigi 2013にSilverスポンサーとして参加
Apache Arrow
milter manager
ククログの記事はCC BY-SA 4.0とGFDLのデュアルライセンスで自由に利用できます。
クリアコードはプログラミングが楽しいソフトウェア開発者を1名募集しています。
クリアコードは「クリアコードをいい感じにする人」を1名募集しています。
クリアコードはフリーソフトウェア開発で培った技術力を提供しています。特にMozilla製品(Mozilla FirefoxとMozilla Thunderbird)とRubyとGroonga(全文検索)に関連した開発を得意としています。