読者です 読者をやめる 読者になる 読者になる

mixi engineer blog

ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

Apache Solr を利用した検索パッケージ Anuenue

mixi search

研究開発グループの takahi-i です。

先日名前だけご紹介したAnuenue というツールをご紹介させていただきます。Anuenue は Apache Solr のラッパーであり、検索クラスタの構築と運用を容易にする目的で制作されました。

本稿では始めに Apache Solr を選択した理由について述べ、その後、このツールを開発した背景とその目的をご紹介させていただきます。後半では実際に Anuenue を用いて検索クラスタを立ち上げます。

なぜ Apache Solr を採用したのか

昨年の秋、弊社の検索エンジンを置き換えるという計画が社内で策定され、ベースとなる検索エンジンの選定のために多くの OSS 検索エンジンを比較検討しました。このとき重視したのは一台の検索パフォーマンスと同時に、保守の容易さと、開発コミュニティの規模です。

検索エンジンの保守性に関して特に重要と考えたのが、分散検索システム (複数のインスタンスを用いた検索クラスタ) を構築する機構を検索エンジン自体がサポートしているという点です。ここでいう分散機構には2種類あります。ひとつはインデクスを別のインスタンスに自動でレプリケーション (複製) する機構で、もうひとつは分散検索です。

自動レプリケーション

Solr インスタンスは指定されたインスタンスのインデクスが変更され際に、インデクスをコピーするための設定が行えます。たとえば以下の図ではSolr インスタンス 2 は Solr インスタンス 1 のインデクスを常に監視しており、インデクスに変更があった際に自動でインデクスをコピーします。

分散検索

インデクスが複数のSolrインスタンスに分割されて保存されている際、Solr はインデクスを持つ複数のインスタンスにクエリを発行し、各インスタンスから返された結果を統合して返してくれます。

たとえば以下の図では、Solr インスタンス 1 がユーザからのクエリを受け取り、インデクスを持つインスタンス (インスタンス 2、 3) にクエリを転送しています。インスタンス2、3 から返された検索結果は、インスタンス1で統合 (マージ) された後、ユーザに返されます。

インデクスの自動複製や分散検索の実装は人によってはそれほど難しくないと言えるかもしれませんが、それでも包括的なテストを行うことが難しくバグが混入しやすい箇所です。

Apache Solr は OSS の検索エンジンとしてはめずらしく検索の分散化を標準でサポートしていました。さらに世界中の企業、組織に利用されているため致命的なバグは既に修正されているか、回避策が掲示板で解説されています。メーリングリストも活発でいざ深刻な不具合に悩まされた場合でも、気軽に質問を開発者に伝えるこができます。

Anuenue の開発経緯

Apache Solr が優秀な検索エンジンといっても大規模な入力データに対処するためには複数インスタンスからなる検索クラスタを構築する必要があります。 しかし Solr を用いて複数インスタンスからなる検索クラスタを設定する作業は、各インスタンス毎に設定ファイルを編集しなくてはならないため、設定ミスが起こりやすいと感じました。またクラスタの構成をつかさどる設定項目が個々のインスタンスごとに散らばっているため、エンジニアがクラスタ全体を俯瞰することが難しくなっています。

さらにSolrではクラスタ内の複数のインスタンスで保持されるインデクスを操作するコマンド群も用意されていません。たとえば、入力データの量が膨大な場合には入力データを複数のインスタンスに分散してインデクスするためのクライアントプログラムを自作する必要があります。

そこで検索クラスタの設定がもう少し簡単にできて、クラスタが保持するインデクスを操作する命令セットをもったパッケージを作ることにしました。それが Anuenue です。

それでは実際に Anuenue を用いて検索システムを構築してみましょう。はじめに単一 (シングル) インスタンスにおける設定方法と基本的な使用方法について述べ、次に複数インスタンスでの設定方法について説明します。

Anuenue を使ってみる (単一インスタンス)

でははじめにAnuenueの単一インスタンスでの利用方法について述べます。

準備

Anuenue をインストールするには以下のソフトウェアをインストールする必要があります。

  • JDK 1.6.0
  • Ant 1.8.0
  • SSH クライアント

ダウンロード & ビルド

    1. ホームディレクトリに移動 (アカウントが 'username'であれば/home/username)
 $cd /home/username/
    1. Anuenue をダウンロード
    2. Anuenueのソースを

ダウンロードページ

      より入手します。
    1. ビルド
$ cd anuenue
$ ant main

パスフレーズの設定

はじめに localhost にパスフレーズなしでログインできるかチェックしてください。

$ssh localhost

もしパスフレーズを求められたら、以下のコマンドを実行してください。

$ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

上記の方法以外に ssh-agent を用いてパスフレーズを利用しないログインを実現することもできます。

Anuenueの起動

それでは、Anuenue を起動してソースに添付されている入力データをインデクスしてみます。

    1. Anuenue のインストールディレクトリに移動
$cd /home/username/anuenue
    1. Anuenue を起動
$sh bin/anuenue-distdaemon.sh start
    1. Anuenue に添付されたデータをインデクス
$sh bin/anuenue-distcommands.sh post --arg src/java/test/resources/example-docs
    1. インデクスのコミット
    2. 入力データはインデクスされた後も検索の対象になりません。インデクスした入力データを検索するにはインデクスの変更をコミットする必要があります。以下のコマンドでインデクスをコミットしてください。
$sh bin/anuenue-distcommands.sh commit
    1. 実際にデータが検索できるのかをチェック
    2. 文書がインデクスされているのかはAnuenueが提供する Web UI で確かめることができます。Web UI にアクセスするには Web ブラウザで http://localhost:8983/anuenue/admin にアクセスしてください。

      Input Query と記載のある直下のフォームに "hadoop" とタイプして search ボタンを押すと以下のように検索結果が返されます。

Anuenue を使ってみる (複数インスタンス)

      前節まで Anuenue を単一インスタンスを利用して紹介しました。しかし Anuenue は検索クラスタを構築するパッケージであり、複数インスタンス環境での使用を前提にしています。本節では Anuenue を複数インスタンスの構成でインストールし利用してみます。ただしそのまえにRoleという概念について紹介させていただきます。

インスタンスの種類

      Anuenue は各インスタンスに Role (役割) を付与します。 Role はMaster、 Slave、 Merger の三つからなり、各インスタンスにはひとつ以上の役割が付与されます。Anuenue で構成する検索クラスタは三つ全てのRoleを最低ひとつのインスタンスに付与しなくてはなりません (注: 一台に複数のRoleを付与することが可能です)。以下、ロールが付与されたインスタンスが行う処理となります。
      1. Merger - クライアントから発行されたクエリをSlaveインスタンスに転送し、Slaveインスタンスから帰ってきた結果をマージしてクライアントに返す。
      2. Master - 入力データをインデクスする。
      3. Slave - インデクスをMasterインスタンスからコピーする。Mergerインスタンスからクエリが転送されてきた際には自身のインデクスを検索し結果をMergerインスタンスに返す。
      Anuenue で構成する検索クラスタではインスタンスにひとつだけ Role を付与することで、大きなデータ、負荷の高い環境に対処します。たとえば、MasterとSlaveを別々のインスタンスに付与することで、インデクスを生成、更新する際におこる検索性能の劣化を防止できます。負荷のかかる環境に対処するためのクラスタの構成については次回に詳しくお話しします。

Anuenueを複数インスタンス環境で利用する

      では実際にAnuenueを利用して検索クラスタを構築してみます。今回は "aaaa"、 "bbbb"、 "cccc" という三つの計算機が手元にあることを仮定します。また、各インスタンスはパスフレーズなしでログインできる状態であることも仮定しています。

これから構築する検索クラスタでは、 "aaaa" 上のインスタンスは Merger でクライアントからのクエリを受け付けます。"bbbb" 上のインスタンスは Master で入力データをインデクスします。 "cccc" 上のインスタンスは Slave であり、Masterインスタンス ("bbbb") からインデクスをコピーしMergerインスタンス("aaaa") から転送されたクエリでインデクスを検索します。

以下の図は構築中の検索クラスタを表します。

      それでは Anuenue で検索クラスタを構築してみましょう。
      1. 計算機の一つに Anuenue をダウンロードしてビルド
      2. ここでは "aaaa" にダウンロードしたと仮定します。
      3. 利用する別の計算機にビルドした Anuenue をコピー
      4. anuenue のビルドディレクトリをコピーしてください。このとき同一のディレクトリにコピーする必要があるので注意してください。
      5. 設定ファイル(conf/anuenue-nodes.xml) の編集
      6. "aaaa" 上でビルドされた Anuenue の設定ファイル(conf/anuenue-nodes.xml)を編集します。
<?xml version='1.0'? encoding='utf-8'?>
<nodes>
  <mergers>
    <merger>
      <host>aaaa</host>
      <port>8983</port>
    </merger>
  </mergers>
  <masters>
    <master iname="master">
      <host>bbbb</host>
      <port>8983</port>
    </master>
  </masters>
  <slaves>
    <slave >
      <host>cccc</host>
      <port>8983</port>
      <replicate>master</replicate>
    </slave>
  </slaves>
<nodes>
        anuenue-nodes.xml ファイルに関してはAnuenue プロジェクトの

Configuraito

        n ページを参照してください
      1. Anuenue クラスタを起動
      2. "aaaa" でビルドし、設定ファイルを編集した Anuenue ディレクトリで以下のコマンドを実行することでクラスタを起動します。起動コマンドは単一インスタンスの場合に利用したものと同一です。
$sh bin/anuenue-distdaemon.sh start
      1. 入力データをインデクスしコミットする
$sh bin/anuenue-distcommands post --arg src/java/test/resources/example-docs
$sh bin/anuenue-distcommands.sh commit
      1. 入力データがインデクスできたか確認する
      2. 実際にクラスタが起動して、文書がインデクスされたかは Anuenue の Web UI で試すことができます。 Merger インスタンスの Web UI、http://aaaa:8983/anuenue/admin に接続し、検索クエリを入力してください。

名前の由来とロゴ

      最後に Anuenue という名前の由来についてお話します。 Anuenue はハワイ語で虹を意味します。 虹は太陽 (Solar) を覆う (Wrapする) 役割があるということで決定しました。以下 Anuenu のロゴです。

まとめ

    今回は我々が Apache Solr を採用した経緯とそのラッパーである Anuenue に関する基本的な利用方法について述べました。次回は Anuenue を利用して多様な検索クラスタを構築する方法と今後の展望についてお話します。