Solrのパッケージ管理機能
はじめに
Solr 8.4 からパッケージ管理機能が追加されました。リファレンスによると、ここでいうパッケージは1つまたは複数のプラグインを1つにまとめたものという意味のようです。
Solr におけるパッケージ管理について調べました。
パッケージ管理機能
従来、プラグインを利用するためには
・jar ファイルを特定の場所に置く
・solrconfig.xml の lib ディレクティブで jar ファイルの場所を指定する
という作業が必要でした。
SolrCloud環境では、複数のノードでこの作業を行う必要があります。 jar ファイルのアップデートの際に異なるノードでのバージョン違いが発生するリスクもあります。
パッケージ管理機能により、複数ノードへのプラグインのインストールやアップデートを一括で操作できるようになります。
パッケージ管理を有効にする
デフォルトではパッケージ管理機能は無効になっているので、起動時のオプションを指定して有効にします。
bin/solr -c -Denable.packages=true
リポジトリを追加する
パブリックなSolrパッケージリポジトリというものは存在していないようなので、Solr のソースに含まれていた、以下のサンプルプラグインをローカルのウェブサーバでホストして試してみました。
$ ls solr-8.4.1-src/solr/core/src/test-files/solr/question-answer-repository/ publickey.der question-answer-request-handler-1.1.jar.tmp question-answer-request-handler-1.0.jar.tmp repository.json $ cp solr-8.4.1-src/solr/core/src/test-files/solr/question-answer-repository/* $DOC_ROOT/solr/repo/
ウェブサーバ上の特定のディレクトリがパッケージリポジトリであるとSolrに認識されるためには repository.json ファイルが必要であるようです。
$ cat solr-8.4.1-src/solr/core/src/test-files/solr/question-answer-repository/repository.json [ { "name": "question-answer", "description": "A natural language question answering plugin", "versions": [ { "version": "1.0.0", "date": "2019-01-01", "artifacts": [ { "url": "question-answer-request-handler-1.0.jar.tmp", "sig": "TTzgh5/usbyWg7oZ7lRwz4eQfh1FeXWvv4U85tsVthVz0MRDz9t7SmonDkegZ7OyqeoiQ4I207pifpVW+DRd9Q==" } ], "manifest": { "version-constraint": "8 - 9", "plugins": [ { "name": "request-handler", "setup-command": { "path": "/api/collections/${collection}/config", "payload": {"add-requesthandler": {"name": "${RH-HANDLER-PATH}", "class": "question-answer:fullstory.QA\ RequestHandler"}}, "method": "POST" }, "uninstall-command": { "path": "/api/collections/${collection}/config", "payload": {"delete-requesthandler": "${RH-HANDLER-PATH}"}, "method": "POST" }, "verify-command": { "path": "/api/collections/${collection}/config/requestHandler?componentName=${RH-HANDLER-PATH}&meta=tru\ e", "method": "GET", "condition": "$['config'].['requestHandler'].['${RH-HANDLER-PATH}'].['_packageinfo_'].['version']", "expected": "${package-version}" } } ], "parameter-defaults": { "RH-HANDLER-PATH": "/mypath" } } }, { "version": "1.1.0", "date": "2019-01-01", "artifacts": [ { "url": "question-answer-request-handler-1.1.jar.tmp", "sig": "LypqlmbJ76AWa5jx0XhjKxO4lrcQAvpSuYddfzcE6TnX0VDPFhrlQHSSX6cZLtvNbQ+74xUMKgsoX1IUnEnKYw==" } ] } ] } ]
同じパッケージのバージョン違いがrepository.json で定義されています。
Solr稼働中に以下のコマンドでリポジトリを追加します。
$ bin/solr package add-repo question-answer http://localhost/solr/repo/
利用できるパッケージのリスト
インストール対象となるパッケージのリストを表示します。
$ bin/solr package list-available Available packages: ----- question-answer A natural language question answering plugin Version: 1.0.0 Version: 1.1.0
インストール
$ bin/solr package install question-answer:1.0.0 Posting manifest... Posting artifacts... Executing Package API to register this package... Response: {"responseHeader":{ "status":0, "QTime":42}} question-answer installed.
インストール済みパッケージの確認
$ bin/solr package list-installed Installed packages: ----- { "name":"question-answer", "version":"1.0.0"}
デプロイ
コレクションを指定してデプロイします。
$ bin/solr package deploy question-answer -collections test Executing {"add-requesthandler":{"name":"/mypath","class":"question-answer:fullstory.QARequestHandler"}} for path:/api/\ collections/test/config Execute this command (y/n): y Executing http://localhost:8983/api/collections/test/config/requestHandler?componentName=/mypath&meta=true for collecti\ on:test { "responseHeader":{ "status":0, "QTime":0}, "config":{"requestHandler":{"/mypath":{ "name":"/mypath", "class":"question-answer:fullstory.QARequestHandler", "_packageinfo_":{ "package":"question-answer", "version":"1.0.0", "files":["/package/question-answer/1.0.0/question-answer-request-handler-1.0.jar.tmp"], "manifest":"/package/question-answer/1.0.0/manifest.json", "manifestSHA512":"a91ab5a2c5abd53f0f72c256592c2be8b667cecb8226ac054aeed4d28aac9d743311442f2d58539bb83663a19bd\ 1efb310aaadfd77bea458f3d475161721a114"}}}}} Actual: 1.0.0, expected: 1.0.0 Deployed on [test] and verified package: question-answer, version: 1.0.0 Deployment successful
repository.json の記述にしたがって /mypath で QARequestHandler が動くように Config API が呼ばれたことが分かります。
/mypath をリクエストしてみます。
$ curl http://localhost:8983/solr/test/mypath { "responseHeader":{ "status":0, "QTime":0}, "responseHeader":[ "version","1.0"]}
残念ながら QARequestHandler のソースを見つけることができず、具体的にどんなパラメータでどんな機能が使えるのかが不明ですが、デプロイできていることは確認できました。
パッケージのアップデート
$ bin/solr package install question-answer:1.1.0 Posting manifest... Posting artifacts... Executing Package API to register this package... Response: {"responseHeader":{ "status":0, "QTime":4}} question-answer installed.
$ bin/solr package list-installed Installed packages: ----- { "name":"question-answer", "version":"1.0.0"} { "name":"question-answer", "version":"1.1.0"}
同じパッケージの2つのバージョンがインストールされたことが分かります。
新しい方のバージョンをデプロイします。
$ bin/solr package deploy question-answer:1.1.0 -collections test Package { "name":"question-answer", "version":"1.0.0"} already deployed on test. To update to { "name":"question-answer", "version":"1.1.0"}, pass --update parameter. Already Deployed on [test], package: question-answer, version: 1.1.0 Deployment failed
失敗しました。
リファレンスを確認すると、上書きデプロイのときは –update オプションが必要とのことです。
$ bin/solr package deploy question-answer:1.1.0 -collections test --update Executing http://localhost:8983/api/collections/test/config/requestHandler?componentName=/mypath&meta=true for collecti\ on:test { "responseHeader":{ "status":0, "QTime":1}, "config":{"requestHandler":{"/mypath":{ "name":"/mypath", "class":"question-answer:fullstory.QARequestHandler", "_packageinfo_":{ "package":"question-answer", "version":"1.1.0", "files":["/package/question-answer/1.1.0/question-answer-request-handler-1.1.jar.tmp"], "manifest":"/package/question-answer/1.1.0/manifest.json", "manifestSHA512":"be22126df3fbb84284cdb94469fa0f83753961c066451f0b9107312d076f3f016e60fd279951656ee7ff4b17bc2\ 57fbd2ce8950533c7d394b1080122f6461606"}}}}} Actual: 1.1.0, expected: 1.1.0 Deployed on [test] and verified package: question-answer, version: 1.1.0 Deployment successful
今度は成功しました。
/mypath にリクエストを投げて、バージョン1.1にアップデートされたことを確認します。
$ curl http://localhost:8983/solr/test/mypath { "responseHeader":{ "status":0, "QTime":0}, "responseHeader":[ "version","1.1"]}
デプロイ中のパッケージをリストするコマンドもあります。
$ bin/solr package list-deployed -c test Packages deployed on test: { "name":"question-answer", "version":"1.1.0"}
おわりに
Solrのパッケージ管理機能の使い方を見てきました。次回はリポジトリを設定して自分で作ったパッケージを扱えるようにしてみます。