はじめに
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のパッケージ管理機能の使い方を見てきました。次回はリポジトリを設定して自分で作ったパッケージを扱えるようにしてみます。