production.log

ピクスタ株式会社でエンジニアのマネージャーをやっている星直史のブログです。

Solr 4.10.4で分散インデクシングを試してみました。

ピクスタの開発部で開発合宿を開催したので、
日頃からお世話になっているCloudSearchの内部を少しでも知るべく、
Solr 4から登場した分散インデクシングを今更ながら試してみることにしました。

参考にした書籍は↓こちらです

合宿中に検証したことは下記の通りです。

今回の記事では

  • 分散インデクシング(Sharding)

この部分について触れようと思います。

Solr 4.10.4を配置

$ wget http://ftp.jaist.ac.jp/pub/apache/lucene/solr/4.10.4/solr-4.10.4.tgz 
$ tar zxvf solr-4.10.4.tgz

分散インデクシング(Sharding)

$ cp -R solr-4.10.4/example/ solr-4.10.4/master1
$ cp -R solr-4.10.4/example/ solr-4.10.4/master2
$ cd ~/solr-4.10.4/master1/
$ java -jar start.jar &
$ cd ~/solr-4.10.4/master2/
$ java -Djetty.port=8985 -jar start.jar &
$ cd ~/solr-4.10.4/master1/exampledocs
$ java -Durl=http://localhost:8983/solr/collection1/update -jar post.jar [a-m]*.xml # master1 にインデクシング
$ cd ~/solr-4.10.4/master2/exampledocs
$ java -Durl=http://localhost:8985/solr/collection1/update -jar post.jar [n-z]*.xml # master2 にインデクシング

結果

# ipad solrという文字列を検索
$ curl "http://localhost:8983/solr/collection1/select?shards=localhost:8983/solr/collection1,localhost:8985/solr/collection1&indent=true&q=ipod+solr" | grep '<str name="id">'
    <str name="id">IW-02</str>
    <str name="id">F8V7067-APL-KIT</str>
    <str name="id">SOLR1000</str>
    <str name="id">MA147LL/A</str>

良い感じに4件取得できました。
query stringのshards=localhost:8983/solr/collection1,localhost:8985/solr/collection1という部分で、
分散インデクシングされたdocumentをまとめて取得しています。

念のため本当にまとめて取得してきているか確認してみましょう。

$ curl "http://localhost:8983/solr/collection1/select?indent=true&q=ipod+solr" | grep '<str name="id">'
    <str name="id">IW-02</str>
    <str name="id">F8V7067-APL-KIT</str>
    <str name="id">MA147LL/A</str>

$ curl "http://localhost:8985/solr/collection1/select?indent=true&q=ipod+solr" | grep '<str name="id">'
    <str name="id">SOLR1000</str>

port番号8983と8985に同一のクエリを投げた結果です。
8983からは3件, 8985からは1件取れてきたので、合計4件となり、分散インデクシングに成功しています。

Solr3時代ではレプリケーションしてLBで振り分けなければいけなかったものが、
シャーディングすることによってサーバーあたりのindex容量が下げられるのはだいぶ大きいと思いました。

注意すべき点

ただし、documentをindexに登録する際に、サーバーによって偏りがあると、
システム全体の検索応答速度は、最もレスポンスが遅いサーバーに引っ張られます。
そのため登録の際は、ラウンドロビン / ハッシュの剰余による分配など検討する必要があります。

また、リクエスト数上限によるデッドロック、URL(getリクエスト時)制限やエラーによる単一障害によるシステム全体のダウンもあるので、
十分に注意して構築していく必要があります。