タグ: Docker

SolrCloudをDockerで動かす

前回に引き続き、SolrをDockerで動かしてみます。今回はSolrとZooKeeperを別コンテナに分けてSolrCloudを構成します。

docker-compose.yml作成

まず、以下の内容の docker-compose.yml を作成します。

ZooKeeperの公式コンテナイメージの情報はこちらです。

正しく動作させるためのポイントがいくつかあります。

Solrの起動オプションを使ってコンテナのZooKeeperを指定

そのまま起動するとSolrは同梱のZooKeeperを使ってしまうので、docker-compose でコマンドラインオプションを指定してコンテナのZooKeeperを参照するように指定しています。

ZooKeeperの4lw.commands.whitlistの指定

“ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok”を指定します。これをしないと、管理GUIの”Cloud” → “ZK Status”の画面で以下のエラーになりZooKeeperの状態を確認できません。

Could not execute ruok towards ZK host zoo1:2181. Add this line to the 'zoo.cfg' configuration file on each zookeeper node: '4lw.commands.whitelist=mntr,conf,ruok'. See also chapter 'Setting Up an External ZooKeeper Ensemble' in the Solr Reference Guide.

ZooKeeperのバージョンを3.5.7で指定する

ZooKeeperの最新イメージは3.6系になっていますが、これを使うと、先程の”Cloud”→”ZK Status”の画面で4lw.commands.whitelistの指定をしていても以下のエラーになります。

For input string: "null"

いろいろ調べてみると Solr 8.5 と ZooKeeper 3.6 の組み合わせで発生するという情報が見つかりました。この問題を回避するために ZooKeeper のバージョン 3.5.7 を指定しています。

起動

$ docker-compose up -d

http://localhost:8983/solr/ で管理GUIにアクセスできます。

起動後

いつもの動作確認をしてみます。

設定ファイルアップロード

$ (cd configsets/_default/conf && zip -r - *) | curl -X POST --header "Content-Type:application/octet-stream" --data-binary @- "http://localhost:8983/solr/admin/configs?action=UPLOAD&name=test"

コレクション作成

$ curl -s "http://localhost:8983/solr/admin/collections?action=CREATE&name=test&maxShardsPerNode=2&numShards=2&replicationFactor=3&collection.configName=test"

ドキュメント投入

$ bin/post -c test example/exampledocs/manufacturers.xml

検索

$ curl -s "http://localhost:8983/solr/test/select?q=*%3A*&rows=1"
{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":64,
    "params":{
      "q":"*:*",
      "rows":"1"}},
  "response":{"numFound":11,"start":0,"maxScore":1.0,"docs":[
      {
        "id":"apple",
        "compName_s":"Apple",
        "address_s":"1 Infinite Way, Cupertino CA",
        "_version_":1670655179588894720}]
  }}

SolrをDockerで動かす

SolrをDockerで稼働させるにあたっては、公式に提供されているコンテナイメージを利用することができます。ただし、このページの説明は非常に簡素なので、利用法については GitHub の README を参照した方が分かりやすいと思います。

起動

docker run -d -p 8983:8983 --name my_solr solr solr-precreate gettingstarted

サンプルデータの投入

docker exec -it my_solr post -c gettingstarted example/exampledocs/manufacturers.xml

データの確認

$ curl 'http://localhost:8983/solr/gettingstarted/select?q=*%3A*&rows=1'
{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "q":"*:*",
      "rows":"1"}},
  "response":{"numFound":11,"start":0,"docs":[
      {
        "id":"adata",
        "compName_s":"A-Data Technology",
        "address_s":"46221 Landing Parkway Fremont, CA 94538",
        "_version_":1670098040008998912}]
  }}

コンテナの中はどうなっているか

コンテナに入って中を確認してみます。

$ sudo docker exec -it my_solr /bin/bash
solr@ef3c76ff156a:/opt/solr-8.5.2$ pwd
/opt/solr-8.5.2
solr@ef3c76ff156a:/opt/solr-8.5.2$ ls
CHANGES.txt  LICENSE.txt  LUCENE_CHANGES.txt  NOTICE.txt  README.txt  bin  contrib  dist  example  licenses  server

Solr は /opt/solr-8.5.2 にインストールされていて、solr ユーザのホームディレクトリになっていることが分かります。

solr@ef3c76ff156a:/opt/solr-8.5.2$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
solr@ef3c76ff156a:/opt/solr-8.5.2$ dpkg --list|grep solr

OS は Debian buster です。Solr パッケージを使っている訳ではないです。

solr@ef3c76ff156a:/opt/solr-8.5.2$ find /var/solr -type d
/var/solr
/var/solr/data
/var/solr/data/gettingstarted
/var/solr/data/gettingstarted/data
/var/solr/data/gettingstarted/data/snapshot_metadata
/var/solr/data/gettingstarted/data/tlog
/var/solr/data/gettingstarted/data/index
/var/solr/data/gettingstarted/conf
/var/solr/data/gettingstarted/conf/lang
/var/solr/data/userfiles
/var/solr/data/filestore
/var/solr/logs

データは /var/solr 以下に格納されます。

solr@ef3c76ff156a:/opt/solr-8.5.2$ ls /opt/docker-solr/scripts/
docker-entrypoint.sh  init-var-solr  oom_solr.sh  precreate-core  run-initdb  solr-create  solr-demo  solr-fg  solr-foreground	solr-precreate	start-local-solr  stop-local-solr  wait-for-solr.sh  wait-for-zookeeper.sh

コンテナ外からの操作で使われるスクリプトが /opt/docker-solr/scripts 以下に置かれています。起動時に使った solr-precreate はここに置かれているものです。

solr-precreate の中身は、/opt/solr/server/solr/configsets/_defaults の設定ファイルを指定されたコアのディレクトリ(上の例なら /var/solr/data/gettingstarted/conf)にコピーしてコアを作成してから Solr を起動するというものになっています。

SolrのデータをホストOS側に置く

データサイズが気になる場合や、インデックスの使い回しをしたい場合などには、SolrのデータをホストOS側に置くこともできます。

$ mkdir solrdata
$ sudo chown 8983:8983 solrdata/
$ sudo docker run -d -v "$PWD/solrdata:/var/solr" -p 8983:8983 --name my_solr2 solr solr-precreate gettingstarted

起動前に、ホスト側に作ったデータディレクトリの所有者をコンテナのsolrユーザ(8983:8983)に合わせておくことが必要です。

起動後

起動後はホストOS側から localhost:8983 でアクセスできるので、管理GUIなりウェブAPIなりで管理することができます。