Solrのパッケージ管理機能がクラスタレベルのプラグインに対応しました
はじめに
以前の記事で紹介したパッケージ管理機能ではコレクションレベルのプラグインを管理できました。Solr 8.6 でクラスタレベルのプラグインにも対応しました。クラスタレベルのプラグインとは、クラスタを構成するノード毎に1個だけインスタンスを作るプラグインです。
リファレンスの説明だけでは分かりにくいところもあったので、使い方をまとめてみました。
リポジトリ登録まで
リポジトリを作成して Solr に登録 → インストール →デプロイという流れは同じなので、リポジトリ作成の詳細は前回の記事を参照してください。
プラグインのコード
プラグインが提供する API のエンドポイントに関する情報をアノテーションで記述するところがミソです。path の指定の中で $path-prefix という変数が参照されていますが、これは後述のリポジトリ定義(repository.json)で定義されます。
リポジトリ定義
クラスタレベルをサポートするにあたって type フィールドが追加されたようです。指定しない場合は collection になるので、クラスタレベルの場合は type: cluster を指定しなければうまくデプロイできません。
コレクションレベルのときと大きく異なるのは setup-command と uninstall-command です。それぞれ、以下の API リクエストに対応しています。
curl -X POST -H 'Content-type:application/json' --data-binary ' { "add": { "name":"myplugin", "class": "myplugin:jp.co.splout.solr.plugins.MyPlugin", "path-prefix" : "splout", "version": "1.0.0" } }' http://localhost:8983/api/cluster/plugin curl -X POST -H 'Content-type:application/json' --data-binary ' { "remove": "myplugin" }' http://localhost:8983/api/cluster/plugin
verify-command をどう定義すべきかよく分からなかったので省略してありますが、これでも動くようです。
リポジトリ登録
$ bin/solr package add-repo MyPlugin http://localhost/solr/repo1 $ bin/solr package list-available Available packages: ----- myplugin Cluster Level Plugin Example Version: 1.0.0 Version: 1.1.0
インストール
-cluster オプションを指定します。
$ bin/solr package install myplugin:1.0.0 -cluster Posting manifest... Posting artifacts... Executing Package API to register this package... Response: {"responseHeader":{ "status":0, "QTime":56}} myplugin installed. $ bin/solr package install myplugin:1.1.0 -cluster Posting manifest... Posting artifacts... Executing Package API to register this package... Response: {"responseHeader":{ "status":0, "QTime":5}} myplugin installed. $ bin/solr package list-installed Installed packages: ----- { "name":"myplugin", "version":"1.0.0"} { "name":"myplugin", "version":"1.1.0"}
デプロイ
ここでも -cluster オプションを指定します。
$ bin/solr package deploy myplugin:1.0.0 -cluster Executing {"add":{"name":"myplugin","class":"myplugin:jp.co.splout.solr.plugins.MyPlugin","path-prefix":"splout","version":"1.0.0"}} for path:/api/cluster/plugin Execute this command. (If you choose no, you can manually deploy/undeploy this plugin later) (y/n): y 1 cluster level plugins setup. Deployed on [] and verified package: myplugin, version: 1.0.0 Deployment successful
clusterprops.json
クラスタレベルでデプロイされたプラグインの情報は、ZooKeeper に置かれた clusterprops.json から読み出せます。
$ curl http://localhost:8983/api/cluster/zk/data/clusterprops.json {"plugin":{"myplugin":{ "name":"myplugin", "class":"myplugin:jp.co.splout.solr.plugins.MyPlugin", "version":"1.0.0", "path-prefix":"splout"}}}
プラグインのAPI呼び出し
ソースコードでエンドポイントのパスを “/$path-prefix/myplugin” と定義しました。repository.json で path-prefix を “splout” と定義したので、このプラグインの API は以下のように呼び出せます。
$ curl http://localhost:8983/api/splout/myplugin { "responseHeader":{ "status":0, "QTime":0}, "myplugin.version":"1.0.0"}
アップデート
–update -cluster オプションを指定して deploy を実行します。
$ bin/solr package deploy myplugin:1.1.0 --update -cluster Updating this plugin: org.apache.solr.client.solrj.request.beans.PluginMeta@aa370c48 Posting {"update": { "name":"myplugin", "class":"myplugin:jp.co.splout.solr.plugins.MyPlugin", "version":"1.1.0", "path-prefix":"splout"}} to /api/cluster/plugin 1 cluster level plugins updated. Deployed on [] and verified package: myplugin, version: 1.1.0 Deployment successful
動作確認します。
$ curl http://localhost:8983/api/splout/myplugin { "responseHeader":{ "status":0, "QTime":0}, "myplugin.version":"1.1.0"}