前回に引き続き、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}] }}