1. Qiita
  2. 投稿
  3. groonga

Groongaをマスターデータの保管先として使うことについて

  • 3
    いいね
  • 0
    コメント

Groonga Advent Calendar 2016 10日目は、先月開催した新リリース自慢会で出てきた話題の1つを取り上げます。

先に結論を書くと、Groongaは単体でマスターデータの保管先として使うのには向いていません。他にマスターデータがある場合や、冗長化構成などの運用を取れる状態での利用をお薦めします。

Groongaのデータストアとしての性格

全文検索エンジンには、既存のデータストアと組み合わせることを前提にしてデータは保持せず検索用のインデックスのみを保持する物と、データとインデックスの両方を保持する物があります。前者のタイプの例にはApache Luceneがあり、Groongaは後者のタイプです。

データストアはマスターデータの保存先として利用されることがあります(ここでは、そのデータ自体が起源であり、喪失したらバックアップから復元する以外に取り戻す手段がないデータの事を「マスターデータ」と呼ぶことにします)。例えば、Mozilla Firefoxはブックマークや履歴の保存先としてSQLiteデータベースを使用しており、もし万が一このデータベースが破損したり失われたりすると、ブックマークや履歴を喪失することになります。また、ブログの記事データをMySQLのデータベースに保存していた場合、データベースが破損したらブログの記事がなくなってしまいます。このように、マスターデータの喪失はユーザーにとって大きなダメージになるため、多くのRDBはACID特性を満たすように設計されており、データの破損が起こりにくいようになっています。

では、GroongaもSQLiteやMySQLのようにマスターデータの保存先として使えるでしょうか。使える使えないかで言えば使えるのですが、その用途には使わない方がよい、というのが答えになります。何故かというと、Groongaのデータストア機能にはトランザクション機構が無く、ACID特性をすべて満たしてはいないからです。

GroongaがACID特性を満たしていない理由

ACID特性を満たしていないということは、Groongaのデータベースは比較的破損しやすいということです。これは、Groongaが「新しい情報をすぐに検索できる(インデックスがすぐ更新される)」「検索対象の追加と検索の実行を並行して実行できる」という点を最重要視して開発されていることに依ります。

「新しい情報の検索しやすさ」「検索と更新の両立のしやすさ」を重視している結果、Groongaのデータ保持の堅牢性は検索性能を落とさないでできる範囲の対応に留まっているため、使用状況によってはインデックスが破損することもあります。また、トランザクションがないため、複数テーブルにまたがるデータの更新があった場合に「あるテーブルのデータは更新されて別のテーブルのデータは更新されなかった」というような事が起こり得ます。このようなケースでは、個々のレコード単位のデータは破損していなくても、データ同士の関係性・整合性が失われてしまいます。

Groongaの利用に適した場面

以上の事から、Groongaはマスターデータを別に持っている場面での利用が推奨されます。

例えば「青空文庫の検索」や「Wikipediaの検索」のような事例、社内の文書検索などの場面では、マスターデータは検索対象の文章(文書)データということになります。万が一Groongaのデータベースが破損しても、最悪でもバッチ処理やクロールなどによってマスターデータから検索対象の文章データを再投入して検索用データベースをいつでも再構築できるケースであれば、サービスを復旧できます。実質的には、Groongaのデータストアは検索結果のコンテンツを高速に返すためのキャッシュとして使うのに適していると言えるでしょう。

同じ理由から、MroongaやPGroongaのように「マスターデータは堅牢なRDBMSに保存しておいて、Groongaは検索を高速化するためのインデックス(とキャッシュ)としてのみ使う」という使用形態もおすすめです。この場合、Groongaのデータベースが破損してもMroongaやPGroongaにとっては検索用インデックスが破損しただけですので、インデックスを作り直せば=Groongaのデータベースを再作成すれば、破損は解消されます。

どうしてもGroongaをマスターデータの保管先に使う必要がある場合には、定期的にバックアップを取ったり、fluent-plugin-groongaを使って複数のGroongaサーバーをレプリケーションのように運用したりといった形で、Groongaとは別のレイヤの仕組みを使ってシステムとしての堅牢さを高める工夫をするのがお薦めです。また、Groongaサーバーと互換性のあるサーバーとして振る舞うDroongaのクラスタを構築するのも1つの方法でしょう。

以上、Groonga Advent Calendar 2016 10日目としてGroongaのデータストアとしての性質と、マスターデータの保管の可否について述べました。引き続きGroonga Advent Calendarをお楽しみ下さい!