隔週連載groonga

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

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

前回の地価マップでの事例紹介では,Ruby on Railsからgroongaとmroongaを使って位置情報検索をした事例を紹介しました。Active Recordを拡張して位置情報検索をするためのgemとその使い方も紹介していたので,Ruby on Railsユーザにとって実用的な内容だったのではないでしょうか。

今回は,前回使い方を紹介したmroongaについて,さらに紹介します。前回はmroongaの使い方がでてきましたが,今回は使い方の紹介はしません。その代わり,mroonga自身のことについて紹介します。mroongaの歴史,大事にしていること,さらにどのようなアーキテクチャになっているかについて説明します。

自分のアプリケーションで利用するプロダクトを検討するときに,プロダクトがどのような方向で作られているかを考慮していますか? 自分のアプリケーションが大事にしたいことをそのプロダクトでも大事にしているなら,相性がよいかもしれません。さて,mroongaはあなたが大事にしたいことを大事にしているでしょうか。

mroongaとは

mroongaはすべてのMySQLユーザに高速な全文検索機能を提供するオープンソースソフトウェアです。MySQLで全文検索をしたいなら一番最初に検討するべきプロダクトです。実際に多くのサービスでmroongaが動いています。例えば,前回の事例紹介にあった 地価マップ もそうですし,nanapiでも使っています※1)。mroongaの採用事例はmroongaのサイトでも紹介しています。

MySQLには標準で全文検索機能が搭載されていますが,残念ながら日本語には対応していません。そこでmroongaの出番です。mroongaを使うことにより,MySQLに日本語対応の高速な全文検索機能を追加できます。

どうしてmroongaは日本語対応の高速な全文検索機能を追加できるのかというと,groongaを使っているからです。では,groongaをどのように使っているかというと…,それはもう少し後で説明します。その前に別の大事なことを説明しないといけません。

※1
昨年(2012年)開催されたgroonga勉強会 で事例が紹介されました。groonga勉強会は毎年いい肉の日(11月29日)「全文検索エンジンgroongaを囲む夕べ」というタイトルで開催されています。昨年で3回目になりました。今年も開催する予定です。

mroongaの読み方

大事なこととは「mroonga」の読み方です。読み方を知らないと他の人に紹介もできませんからね。「mroonga」「むるんが」と読みます。名前の由来は「MySQL」「groonga」です。「MySQL」「M」「groonga」「roonga」を組み合わせて「mroonga」です。

groongaを使ったミドルウェアやライブラリは「○roonga」という名前を使うことがあります。例えば,「rroonga」「nroonga」などがあります。これらはすべて「○るんが」と読みます。もちろん,「○roonga」となっていないミドルウェア・ライブラリもいろいろあります。興味のある人はgroongaのサイトの関連プロジェクトページを参照してください。

mroongaの歴史

groongaの前身がSennaだったということは第1回で紹介しました。実は,mroongaにも前身のプロダクトがあります。それがTritonnです。ちなみに,Tritonnの名前の由来は「晴海トリトンスクエア」です。開発者の池田さんがトリトンスクエアの近くで働いていたことが影響しています。「晴海トリトンスクエア」「トリトン」のスペルは「triton」で最後の「n」が1個なのに,どうして「Tritonn」は最後の「n」が2個なのか気になった人が少しはいるのではないでしょうか。これは違うスペルにすることでWebで検索しやすくするためです。groongaの名前付けと同じ理由ですね。

Tritonnもmroongaと同じくMySQLに日本語対応の高速な全文検索機能を追加するプロダクトでした。では,Tritonnとmroongaではどこが違うのでしょうか? 違いはいろいろあります。例えば,Tritonnはgroongaの前身のSennaを全文検索エンジンとして使用していて,mroongaはgroongaを全文検索エンジンとして使用しています。中でも一番の違いは,mroongaのほうがよりgroonga(Senna)という全文検索エンジンの性能を引き出すようなアーキテクチャになっているという点です。

Tritonnでの壁

第1回で紹介した通り,groongaは情報の鮮度を大事にしている全文検索エンジンです。新しい情報をすぐに検索できるようにする,更新しているからといって検索性能を落とさない,そういったことを実現するための設計になっています。これはgroongaがSennaの頃から大事にしてきたことです。そのため,もちろんTritonnでもこれを実現しようとしました。しかし,アーキテクチャの制限から壁にぶつかりました。それはMyISAMのロックです。

MyISAMとはMySQL 5.1までのデフォルトストレージエンジンです。ストレージエンジンとはMySQLの中でデータの読み書きや検索を担当するモジュールです。ストレージエンジンについては後でまた触れます。

TritonnはMyISAMを変更してSennaを組み込んでいたため,MyISAMの挙動の影響を大きく受けます。特に影響が大きかったのがロック周りです。前述の通り,Sennaは更新中でも検索ができるようなアーキテクチャになっていますが,MyISAMは検索と更新を同時に実行できないアーキテクチャでした※2)。よってMyISAMへの検索と更新のリクエストが重なると,処理の前にロックを獲得して順番に処理を実行します。Sennaは同時に実行できるのにです。このため,TritonnのアーキテクチャではSennaの性能を活かしきれなかったのです。

Tritonnのアーキテクチャ

Tritonnのアーキテクチャ。MyISAMが更新時にロックするため,更新中に検索できない。

※2
concurrent_insertsという仕組みを使えば,条件付きで同時に実行することができます(参考: MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.3.3 同時挿入)。

mroongaのアプローチ

Tritonnでぶつかった壁を超えるべく,Sennaはgroongaに進化します。TritonnがMyISAMを変更してSennaを組み込むというアプローチをとったのは,Sennaは全文検索機能のみを提供し,データストア機能を提供していなかったためです。データストアはMyISAMの機能を利用し,全文検索機能を追加しようというアプローチです。

Tritonnでの経験から,データストアを別のプロダクトに任せることにするとSennaの性能を活かしきれないケースがあることがわかりました。別のプロダクトの制約を受けるためです。その問題を解決するため,Sennaにデータストア機能をつけたものがgroongaです。この過程でAPIに互換性がなくなったため,Sennaからgroongaに改名したのです。

mroongaはSennaではなくgroongaを使うようにしました。groongaにはカラム指向のデータストアがあるため,MyISAMに依存する必要はなくなりました。完全にひとり立ちしたストレージエンジンとなったのです。

mroongaのアーキテクチャ

mroongaのアーキテクチャ。MyISAMとは独立し,更新時も検索できるようになった。

mroongaに改名した理由

mroongaもgroongaと同じくプロダクト名を変えています。改名の理由はgroongaと同じで互換性がなくなるからです。

後述しますが,mroongaはMySQL 5.1から使えるようになったプラガブルストレージエンジンという仕組みを使っているため,MySQL 5.1以降のみサポートしています※3)。一方,TritonnはMySQL 5.0のみサポートしていました。異なる仕組みを使っているため使い方が少し変わり,完全に互換とはいかなくなります。

また,全文検索エンジンとして,TritonnはSennaを使っていて,mroongaはgroongaを使っているという違いもあります。Sennaとgroongaではデータベースのファイルフォーマットが違うため,移行する際にはデータベースをダンプ・リストアする必要があります。

このように,互換性がなくなるためプロダクト名を変えることになりました。とはいえ,一番大きい理由は,Sennaも名前を変えたからTritonnも名前を変えよう!だったかもしれません※4)。

ただ,Sennaをgroongaに改名したときと同じように,Tritonnからmroongaに改名したことでアップデートの心理的な敷居をより高くしてしまいました。最近ではTritonnからmroongaに乗り換えたという声をみかけるようになりましたが,mroongaをリリースした当時はなかなかアップデートしてもらえませんでした。そのため,groongaと同じように,今後はmroongaも改名しないでしょう。

これがmroongaの歴史です。どんな歴史をたどってきたか,イメージがつかめたでしょうか。

※3
MySQL 5.6が安定版としてリリースされたため,2世代前のMySQL 5.1は今年いっぱいでサポートをやめるかもしれません。MySQLは安定版のことをGenerally Available,略してGAと呼んでいます。MySQL界隈でGAという字面をみたら安定版のことだなと思うとよいでしょう。
※4
当時,著者はmroongaの開発には参加しておらず,横で眺めているだけでした。今では著者も開発者の1人です。

著者プロフィール

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

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

コメント

  • ご指摘ありがとうございます

    ご指摘の点、その通りですので、記事上の間違いを修正させていただきました。
    今回はご指摘いただきまして、ありがとうございます。

    Commented : #2  gihyo.jp編集部 (2013/05/27, 17:26)

  • 文章の入力ミスのお知らせ

    文章の入力ミスのお知らせ

    X
    「トリトン」のスペルは「trion」で最後の「n」が1個なのに,どうして「Trionn」は


    「トリトン」のスペルは「triton」で最後の「n」が1個なのに,どうして「Tritonn」は

    Commented : #1  黒木正幸 (2013/05/15, 14:30)

コメントの記入