隔週連載groonga

第3回 すべてのMySQLユーザに高速な全文検索機能を! - mroongaの紹介

この記事を読むのに必要な時間:およそ 4.5 分

mroongaの特長

mroongaはgroongaのよいところをMySQLから利用できることが特長です。具体的には,次の長所をMySQLから利用できます。

  • 更新内容をすぐに検索可能に!
  • 更新中に検索性能を落とさない!
  • 高速な位置情報検索!
  • 日本語対応!

mroongaはgroongaとの親和性を高めることだけに注力しているわけではありません。MySQLとの親和性を高めることにも注力しています。MySQLとの親和性を高めることにより,MySQLが提供している有用な機能をmroongaでも使うことができます。例えば,MySQLが提供しているレプリケーション機能をmroongaでも使うことができます。groonga単体ではレプリケーション機能を提供していません※5が,mroongaではMySQLが提供する機能を使って実現できます。

2013年5月現在では,⁠インストールしたら,後は普通のMySQLとして使える」日本語に対応した全文検索システムはmroongaだけです。MySQLでmroongaを使わずに日本語に対応した全文検索をする場合,次の2つの選択肢があります。

  • アプリケーション側でデータを前処理してMySQL組み込みのMyISAMやInnoDBの全文検索機能を利用する※6⁠。
  • SolrやSphinxなどMySQLとは別の全文検索システムと連携する。

アプリケーションから見ると,どちらの場合もひと手間増えます。ひと手間の大きさはまちまちです。ひと手間をしてくれるライブラリが提供されるケースもあるため,その場合はひと手間は小さくなりますが,提供されていない場合は結構なひと手間になることもあります。

システム管理者から見ると,MySQLに加えて別の全文検索システムも管理する必要があります。そのため,運用のコストは大きくなります。

mroongaはMySQLとキレイに統合されているため,これまで通りの開発・運用ノウハウを活かしながら高性能の日本語対応全文検索システムを実現できます。

※5
fluentdと組み合わせることでgroongaでもレプリケーション機能を実現することができます(参考: fluent-plugin-groonga⁠。
※6
具体的に言うと,アプリケーション側でトークナイズ処理をします(参考: MySQL-5.6.10のInnoDB FTSを用いた全文検索機能についてLTしてきました。#mysqlcasual - Y-Ken Studio はてブロ支店⁠。

mroongaのアーキテクチャ

mroongaはMySQL 5.1から導入されたプラガブルストレージエンジンという仕組みを使っています。前述の通り,ストレージエンジンとはMySQLの中でデータの読み書きや検索を担当するモジュールです。MySQL 5.0まではMySQLをビルドするときに一緒にストレージエンジンもビルドしないといけませんでした。MySQL 5.1からは,ストレージエンジンを別途ビルドして動いているMySQLに動的に組み込めるようになりました。これがプラガブルストレージエンジンという仕組みです。

プラガブルストレージエンジンを利用したMySQLアーキテクチャ

下の方にある「プラガブルストレージエンジン」という部分が,プラガブルストレージエンジンのレイヤー。SQLを解析してどのように処理をするかはプラガブルストレージエンジンより上のレイヤーが実行する。ストレージエンジンはデータの保存や範囲検索など具体的な読み書き・検索を受け持つ。「プラガブル」の名の通り,後から動的に追加できる。http://dev.mysql.com/doc/refman/5.1/ja/pluggable-storage-overview.htmlにより詳細な図がある。

mroongaには次の2つの動作モードがあります。

  • ストレージモード
  • ラッパーモード

ラッパーモードはプラガブルストレージエンジンという仕組みをうまく使った動作モードです。それぞれ順に説明します。

ストレージモード

ストレージモードはgroongaのよさをそのまま活かすための動作モードです。groongaをライブラリとして使用し,groongaのデータベースに対してデータの読み書き・検索を行います。もちろん,検索性能を落とさずに更新できるというgroongaのよさをきちんと発揮できます。

ストレージモード

すべての処理をmroongaが行い,groongaとの架け橋となる。

groongaとの密な連携

ストレージモードではすべてのデータをgroongaのデータベースに保存しているため,mroongaで書き込んだデータをgroongaで検索することができます。せっかく今まで通りSQLでアクセスできて便利なのに,groongaで検索したいことってあるの?と思いますよね。場合によってはあります。例えば,第1回で紹介したドリルダウン機能を使う時です。ドリルダウン機能はSQLでは効率よく実現できないため,groongaで直接検索したくなるケースの1つです。

そんなgroongaで直接検索したくなるケースのために,mroonga経由でgroongaのコマンドを直接実行できる機能を用意しています。それがmroonga_command()ユーザー定義関数です。mroonga_command()を使うとgroongaのコマンドを実行してその結果をJSONとして受け取れます。SQLの世界とはなじんでいませんが,別途groongaサーバーを立ちあげるよりは楽だろうということで用意しました。

SQLですべての操作を実現できないのであれば,他の全文検索エンジンとの組み合わせでもいいのでは?と思いますよね。もちろん,それも選択肢の1つです。アプリケーションが普通のSQL以外の方法で検索を実行しないといけないのはmroonga_command()を使う場合も他の全文検索エンジンと連携する場合も同じですが,mroonga_command()を使う場合は管理サービスが増えないという違いがあります。どのような構成にするのが自分たちにあっているか,開発と運用の両方を考慮して検討してみてください。

制限

ただし,groongaがトランザクションをサポートしていないため,ストレージモードではトランザクションを使えません。トランザクションを使いたい場合は次の2つの方法があります。

  • 後述するラッパーモードを使う。
  • InnoDB※7をマスターにし,スレーブをmroongaにしたレプリケーションをする。

ラッパーモードは次項で説明しますので,ここではスレーブをmroongaにする方法について簡単に補足します。

スレーブ側にはマスター側でコミットされたデータだけが送られてくるため,マスター側にだけトランザクションがあれば十分です。更新をマスター側で行い,検索をスレーブ側で行うことにより,トランザクションを使いながらmroongaの日本語対応の高速な全文検索機能を使うことができます。

※7
トランザクションをサポートしたストレージエンジン。

ラッパーモード

ラッパーモードは他のストレージエンジンに全文検索機能と位置情報検索機能を追加するための動作モードです。Tritonnでやっていたように,データストアに別のストレージエンジンを,全文検索と位置情報検索だけにgroongaを使うことになります。

ただし,Tritonnと違って既存のストレージエンジンを変更して組み込むということはしていません。そうではなく,ラッパーモードの名前の通り,既存のストレージエンジンをラップすることで実現しています。これは,プラガブルストレージエンジンという仕組みによりストレージエンジンのモジュール化が進んだためできるようになったことです。

ラッパーモード

全文検索と位置情報検索のみmroongaが行い,残りはラップしているストレージエンジンに任せる。

ラッパーモードを使うことにより,既存のストレージエンジンのよいところを使いながら,全文検索機能だけをgroongaに任せることができます。いいとこどりですね。

まとめ

mroongaの歴史と大事にしていること,そして,大事にしていることを実現するためにどのようなアーキテクチャになっているかを紹介しました。mroongaのサイトにチュートリアルがあるので,試してみたくなった人はぜひそちらを読んでみてください。

mroongaのサイトに触れたついでに,最後にmroongaのサイトのURLの最新情報を紹介します。2013年4月中旬頃からmroonga用のドメインmroonga.orgを取得し,公式URLはhttp://mroonga.org/になりました。これまでは,mroonga.github.comだったのですが,2013年4月上旬にmroonga.github.ioにURLが変わりました。URLが変わってしまうならいっそ独自ドメインへ!ということで独自ドメインでの運用を開始しました。

次回は事例紹介です。Rubyで作られている行指向のソースコード検索エンジンMilkodeの事例です。Rubyからgroongaをライブラリとして使っています。楽しみですね。

groongaの利用事例を寄稿しませんか

連載の目的は「読者の皆さんがgroongaを使いたくなる!」ことです。そこで,すでにgroongaを使っており,groongaの利用事例を本連載で紹介していただける人を募集します。募集要項を参考にご連絡ください。お待ちしています!

著者プロフィール

須藤功平(すとうこうへい)

フリーソフトウェアプログラマで株式会社クリアコード代表取締役(2代目)。Sennaの後半から開発に参加しはじめて,groonga、mroongaの開発にも関わるようになる。mroongaの開発に参加することでRDBのことがわかるようになってきた。Rubyからgroongaを使うためのライブラリrroongaの作者。