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"}
Related Post