シーマークの山本です。
Apache Solr は全文検索エンジンとして様々なところで使われており、もはや特殊なプロダクトでは無く、検索機能を実現するならSolrというほどコモディティーとしての広がりを見せています。Solrバージョン5からはSolr Cloud機能が実装され、検索「エンジン」から検索「システム」へと変貌を遂げてきています。
そこで、Solr Cloudを使って検索システムを構築する方法についてまとめていきたいと思います。ただ、Solr Cloudのチュートリアルにある付属のサンプルを動かす方法ではなく、実際の商用プロジェクトで必要になりそうな「こんな時どうする」的なTipsを中心にまとめていきます。
構築する検索サービスの想定(=要件)
商用で提供する検索サービスであれば最低限気にすることではありますが、今回説明していくためのサービス想定、言い換えれば要件を列挙しました。
- AmazonのAWSや、Microsoft Azureなどのクラウド環境で複数台のサーバインスタンスを使ってSolr Cloudを構築する
- 検索サービスが止まらないよう高い可用性を実現する
- 検索サービスで提供する機能が増え、Solrの設定を変更する場合でも簡単に行える
- 利用者が増えても検索速度が落ちないよう簡単に負荷分散できる
- 検索対象データが増えても検索速度が落ちないよう簡単に拡張できる
こう書いてみると、なかなか大変そうな要件ではありますが、Solr Cloudを使えば、案外簡単にできちゃったりする(かも)のでご安心を。
1. 開発環境の構築
まず、「要件1 複数サーバを使って構築すること」をいきなり実現しようとすると、AWSのアカウントだったり費用がかかったりするので、まずは自分のPC上で開発環境をつくるところから始めましょう。
開発環境ですが、私がMac派なので、Macを前提に書いていきます。ただ、Windowsとまるっきり違うかどうかと言えば、あまり差異はないはずです。明らかに違うところは補足を入れます。
1.1 Solrのダウンロード
まずは、Solrのダウンロードです。執筆時点では 6.2.1 が最新でした。
https://lucene.apache.org/solr/mirrors-solr-latest-redir.html
ダウンロードしたSolrをお好きなところに展開します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ~$ wget http://ftp.kddilabs.jp/infosystems/apache/lucene/solr/6.2.1/solr-6.2.1.tgz ~$ tar zxf solr-6.2.1.tgz ~$ cd solr-6.2.1 ~/solr-6.2.1$ ll total 2512 drwxr-xr-x 14 yamamoto staff 476 10 26 23:33 . drwxr-xr-x 12 yamamoto staff 408 10 26 23:33 .. -rw-r--r-- 1 yamamoto staff 613049 9 15 08:04 CHANGES.txt -rw-r--r-- 1 yamamoto staff 12646 1 23 2016 LICENSE.txt -rw-r--r-- 1 yamamoto staff 616219 9 15 08:04 LUCENE_CHANGES.txt -rw-r--r-- 1 yamamoto staff 26611 9 15 04:26 NOTICE.txt -rw-r--r-- 1 yamamoto staff 7242 9 15 04:26 README.txt drwxr-xr-x 10 yamamoto staff 340 9 15 04:26 bin drwxr-xr-x 13 yamamoto staff 442 9 15 08:52 contrib drwxr-xr-x 19 yamamoto staff 646 10 26 23:33 dist drwxr-xr-x 22 yamamoto staff 748 10 26 23:33 docs drwxr-xr-x 9 yamamoto staff 306 9 15 04:26 example drwxr-xr-x 617 yamamoto staff 20978 9 15 04:26 licenses drwxr-xr-x 13 yamamoto staff 442 9 15 08:49 server ~/solr-6.2.1$ |
1.2 検索サービス用のSolr configセット
検索サービスとしてどのようなデータをインデックスし、どのように検索させるかを定義するため、Solrではいくつかの設定ファイルを用意する必要があります。通常のSolrとは異なり、Solr Cloudで利用するSolr設定ファイルセットは、zookeeperという別のミドルウェアに登録し管理することになります。
Solr設定ファイルの内容については、本題からはずれることもあり、Solrダウンロードパッケージに含まれるサンプルである「techproducts」用の設定ファイルをそのまま利用します。既にあるので、それを適当なところへコピーします。
1 2 | ~/solr-6.2.1$ mkdir ~/service (どこでもいいです) ~/solr-6.2.1$ cp -r server/solr/configsets/sample_techproducts_configs/conf ~/service/ |
次は、Solrの設定から一旦はなれ、Solr Cloudを構成する名脇役 zookeeperの設定についてです。
1.3 zookeeperを設定する
zookeeperって初めて聞いたって人もいるかと思いますので、軽く紹介を。
https://zookeeper.apache.org/
Apache zookeeperは、複数のサーバインスタンスで構成される分散システムにおいて、設定情報の同期、グルーピングや名前付けの管理を提供するミドルウェアです。
Solr Cloudでは、Solr設定ファイルの集中管理と配布、Solrサーバの管理(shards / Replica、solr nodeの生死等)をzookeeperが提供しています。
zookeeperのインストールは、上記のzookeeperのサイトからダウンロードして、Solrと同じく好きなところに展開します。(もし、Mac環境でbrewをお使いであれば、brew install zookeeperでインストールも可能です)
執筆時点での stableなバージョンは 3.4.9 でした。
http://ftp.jaist.ac.jp/pub/apache/zookeeper/stable/zookeeper-3.4.9.tar.gz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ~$ wget http://ftp.jaist.ac.jp/pub/apache/zookeeper/stable/zookeeper-3.4.9.tar.gz ~$ tar zxf zookeeper-3.4.9.tar.gz ~$ cd zookeeper-3.4.9 ~/zookeeper-3.4.9$ ll total 3120 drwxr-xr-x 22 yamamoto staff 748 8 23 16:42 . drwxr-xr-x 14 yamamoto staff 476 10 27 18:54 .. -rw-r--r-- 1 yamamoto staff 90824 8 23 16:39 CHANGES.txt -rw-r--r-- 1 yamamoto staff 11938 8 23 16:39 LICENSE.txt -rw-r--r-- 1 yamamoto staff 171 8 23 16:39 NOTICE.txt -rw-r--r-- 1 yamamoto staff 1585 8 23 16:39 README.txt -rw-r--r-- 1 yamamoto staff 1770 8 23 16:39 README_packaging.txt drwxr-xr-x 10 yamamoto staff 340 8 23 16:40 bin -rw-r--r-- 1 yamamoto staff 83539 8 23 16:39 build.xml drwxr-xr-x 5 yamamoto staff 170 8 23 16:40 conf drwxr-xr-x 10 yamamoto staff 340 8 23 16:39 contrib drwxr-xr-x 22 yamamoto staff 748 8 23 16:44 dist-maven drwxr-xr-x 48 yamamoto staff 1632 8 23 16:40 docs -rw-r--r-- 1 yamamoto staff 3499 8 23 16:39 ivy.xml -rw-r--r-- 1 yamamoto staff 1953 8 23 16:39 ivysettings.xml drwxr-xr-x 12 yamamoto staff 408 8 23 16:40 lib drwxr-xr-x 5 yamamoto staff 170 8 23 16:39 recipes drwxr-xr-x 13 yamamoto staff 442 8 23 16:40 src -rw-r--r-- 1 yamamoto staff 1368238 8 23 16:39 zookeeper-3.4.9.jar -rw-r--r-- 1 yamamoto staff 819 8 23 16:42 zookeeper-3.4.9.jar.asc -rw-r--r-- 1 yamamoto staff 33 8 23 16:39 zookeeper-3.4.9.jar.md5 -rw-r--r-- 1 yamamoto staff 41 8 23 16:39 zookeeper-3.4.9.jar.sha1 |
zookeeperは、検索システムの設定情報や構成情報を集中的に管理しています。zookeeperが止まれば、Solr Cloudも停止します。そこで、zookeeperの可用性を高めるため、zookeeperを複数台のサーバーで稼働させます。できれば、Solr Cloudとは異なる専用サーバを用意することが望ましいです。また複数台と言ってもzookeeperの特性上、奇数台で運用をすることが要件となっています。つまり、3台、5台構成をとることが必要です。開発環境では1台の中で3プロセスを起動するようにしましょう。
まず、3プロセス用のzookeeper設定ファイルを用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | ~/zookeeper-3.4.9$ cp conf/zoo_sample.cfg conf/zoo01.cfg ~/zookeeper-3.4.9$ cp conf/zoo_sample.cfg conf/zoo02.cfg ~/zookeeper-3.4.9$ cp conf/zoo_sample.cfg conf/zoo03.cfg ~/zookeeper-3.4.9$ vi conf/zoo01.cfg (変更点) clientPort=2181 → clientPort=12181 dataDir=/tmp/zookeeper → dataDir=./data01 (追加) server.1=localhost:12888:13888 server.2=localhost:22888:23888 server.3=localhost:32888:33888 ~/zookeeper-3.4.9$ vi conf/zoo02.cfg (変更点) clientPort=2181 → clientPort=22181 dataDir=/tmp/zookeeper → dataDir=./data02 (追加) server.1=localhost:12888:13888 server.2=localhost:22888:23888 server.3=localhost:32888:33888 ~/zookeeper-3.4.9$ vi conf/zoo03.cfg (変更点) clientPort=2181 → clientPort=32181 dataDir=/tmp/zookeeper → dataDir=./data03 (追加) server.1=localhost:12888:13888 server.2=localhost:22888:23888 server.3=localhost:32888:33888 |
そして、格納されるデータディレクトリ(dataDirで指定されているディレクトリ)を作成し、そこに設定ファイルを追加します。
1 2 3 4 | ~/zookeeper-3.4.9$ mkdir data01 data02 data03 ~/zookeeper-3.4.9$ echo 1 >> data01/myid ~/zookeeper-3.4.9$ echo 2 >> data02/myid ~/zookeeper-3.4.9$ echo 3 >> data03/myid |
これで、zookeeperを起動する準備が整いました。さて起動させましょう。
1 2 3 | ~/zookeeper-3.4.9$ ./bin/zkServer.sh start conf/zoo01.cfg ~/zookeeper-3.4.9$ ./bin/zkServer.sh start conf/zoo02.cfg ~/zookeeper-3.4.9$ ./bin/zkServer.sh start conf/zoo03.cfg |
一応止めるコマンドも。
1 2 3 | ~/zookeeper-3.4.9$ ./bin/zkServer.sh stop conf/zoo01.cfg ~/zookeeper-3.4.9$ ./bin/zkServer.sh stop conf/zoo02.cfg ~/zookeeper-3.4.9$ ./bin/zkServer.sh stop conf/zoo03.cfg |
これで、zookeeperの準備は整いました。
1.4 Solr configファイルセットのzookeeperへの登録
1.2 で用意したSolr設定ファイルセットをzookeeperに登録しましょう。登録する際、zookeeper上で管理するための名前を付ける必要があります。ここでは「techp」としました。
1 | ~/solr-6.2.1$ ./server/scripts/cloud-scripts/zkcli.sh -cmd upconfig -n techp -d ~/service/conf -z localhost:12181,localhost:22181,localhost:32181 |
これで、Solr Cloudで利用される設定ファイルセットがzookeeperで「techp」という名前で管理されました。
1.5 Solr cloudの立ち上げ
本体であるSolr Cloudを立ち上げましょう。複数台で構成するのでしたよね。開発環境なので、1台で複数インスタンスを立ち上げましょう。今回は4台構成とします。
まず、そのための準備です。
1 2 3 4 | ~/solr-6.2.1$ cp -r server server_01 ~/solr-6.2.1$ cp -r server server_02 ~/solr-6.2.1$ cp -r server server_03 ~/solr-6.2.1$ cp -r server server_04 |
では、立ち上げます。Solrの待受ポートは通常は8983なんですが、4つのインスタンスを立ち上げるため、8983, 8984, 8985, 8986として起動します。
1 2 3 4 | ~/solr-6.2.1$ ./bin/solr start -c -d server_01 -p 8983 -z localhost:12181,localhost:22181,localhost:32181 ~/solr-6.2.1$ ./bin/solr start -c -d server_02 -p 8984 -z localhost:12181,localhost:22181,localhost:32181 ~/solr-6.2.1$ ./bin/solr start -c -d server_03 -p 8985 -z localhost:12181,localhost:22181,localhost:32181 ~/solr-6.2.1$ ./bin/solr start -c -d server_04 -p 8986 -z localhost:12181,localhost:22181,localhost:32181 |
これで、4インスタンスがSolr Cloudとして立ち上がっています。
念のため、停止させるコマンドも。
1 2 3 4 5 6 7 8 | ~/solr-6.2.1$ ./bin/solr stop -p 8983 ~/solr-6.2.1$ ./bin/solr stop -p 8984 ~/solr-6.2.1$ ./bin/solr stop -p 8985 ~/solr-6.2.1$ ./bin/solr stop -p 8986 以下で一気に全部停止も可能 ~/solr-6.2.1$ ./bin/solr stop -all |
1.6 collectionの作成
Solr Cloudでは、検索データをとりまとめる単位をCollectionと呼んでいます(通常起動のSolrでcoreと呼ばれていたものと同じ概念です)。Collectionを作成しましょう。Solr Cloudでは、複数台のサーバにうちどれか1台に対して操作するだけで、Solr Cloud全体に反映されます。
1 | ./bin/solr create_collection -c techproducts -n techp -shards 2 -replicationFactor 2 -p 8984 |
パラメータの説明です
パラメータ | 値 | 設定内容 |
---|---|---|
-c | techproducts | Collection名 |
-n | techp | zookeeperで登録されている設定ファイルセット名 |
-shards | 2 | シャード数。1つのインデックスを複数に分割する場合。通常SolrでいうShardsと同じ意味。 |
-replicationFactor | 2 | レプリカ数。レプリケーションとしていくつコピーを作成しておくかの指定。通常Solrではreplication用Solrの数と同じ意味。 |
-p | 8984 | 操作対象とするSolrインスタンス。今回であれば、8983, 8984, 8985, 8986のどれか |
作成されたことを、Solr管理画面で確認してみましょう。
1.6 データの投入
Solr Cloudへのデータ投入は様々な方法があります。これについては本題からはずれるため、サンプルで用意されているデータファイルをコマンドを使って投入してみましょう。ここでも、複数台のうちどれかにデータを投げれば、Solr Cloud全台に反映されます。8984, 8986 に投げてみる例です。
1 2 | ~/solr-6.2.1$ ./bin/post -c techproducts -p 8984 example/exampledocs/books.csv ~/solr-6.2.1$ ./bin/post -c techproducts -p 8986 example/exampledocs/ipod_* |
検索できるかどうか、Solr管理画面で確認してみましょう。
できましたね。
今回は、ここまでといたします。残りの部分は、後日アップいたします。