Solr配置:集群插件管理详解

Solr配置:集群插件管理详解

集群(CoreContainer级别)插件子系统

集群插件是在CoreContainer(节点)级别定义和实例化的可插拔组件。这些组件通常在Solr节点级别提供管理级功能和附加功能的API。

插件配置

如果solr.cluster.plugin.edit.enabled属性设置为true(默认值),则可以使用/cluster/plugin API维护插件配置。

此API端点允许添加、删除和更新插件配置。

每个插件必须有一个唯一的名称来注册。尝试添加重复名称的插件会导致错误。某些类型的插件使用预定义的名称,并且必须在这些名称下注册才能正常运行。

从Solr 9.0开始,插件配置在内部维护在ZooKeeper的/clusterprops.json文件中,位于plugin条目下。配置是一个JSON映射,其中键是唯一的插件名称,值是序列化的org.apache.solr.client.solrj.request.beans.PluginMeta Bean。

支持以下通用插件属性:

name(名称)

  • 必需 | 默认值:无

唯一的插件名称。某些插件类型需要使用预定义名称之一才能正常运行。按惯例,此类预定义名称使用前导点前缀(例如,.placement-plugin)。

class(类)

  • 必需 | 默认值:无

实现类。如果类作为Solr的一部分可用,则可以指定为完全限定的类名,或者也可以使用<package>:<className>语法指定来引用Solr包内的类。

version(版本)

  • 可选 | 默认值:无

Solr包版本。

当类从包而不是从Solr本身加载时,此参数是必需的。

path-prefix(路径前缀)

  • 可选 | 默认值:无

要添加到插件中定义的REST API端点的路径前缀。

config(配置)

  • 可选 | 默认值:无

附加插件配置参数的JSON映射。实现ConfigurablePlugin接口的插件将使用从此映射反序列化的特定于插件的配置对象进行初始化。

插件配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".placement-plugin",
"class": "org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory",
"config": {
"minimalFreeDiskGB": 20,
"prioritizedFreeDiskGB": 100,
"withCollection": {
"A_primary": "A_secondary",
"B_primary": "B_secondary"
}
}
}}'
http://localhost:8983/api/cluster/plugin

集群插件类型

从插件加载的类通常支持两种类型的功能(不互斥):

  • 请求处理器插件:公开REST API端点(实现类用@EndPoint注解,可选地用@Command注解)。这些插件的API自动注册为@EndPoint注解中定义的路径下的REST端点。

  • 特定接口实现插件:用作内部组件。加载后,它们会被自动发现并注册到使用此类插件的子系统中。示例包括ClusterSingletonClusterEventProducerClusterEventListenerPlacementPluginFactory

插件生命周期

插件实例在Solr节点启动期间首次创建Solr的CoreContainer时加载和初始化。

然后在每次配置更新时,每个节点都会收到更改通知,然后将现有插件与新配置进行比较,并分别创建、删除或替换(即,使用新配置删除和添加)节点上存在的插件实例。

实际上,这意味着由此API管理的集群级插件可以动态更改和重新配置,而无需重新启动Solr节点,并且更改几乎同时应用于所有节点。

插件类型详解

预定义插件名称

具有这些名称的插件在Solr的特定部分中使用。它们的名称是保留的,不能用于其他插件类型:

  • .placement-plugin:实现PlacementPluginFactory接口的插件。此类插件确定集群中的副本放置策略。

  • .cluster-event-producer:实现ClusterEventProducer接口的插件。此类插件用于生成集群级事件。

PlacementPluginFactory插件

此类插件支持集合副本的可配置放置策略。

ClusterSingleton插件

实现ClusterSingleton接口的插件在每个Solr节点上实例化。但是,它们的启动/停止生命周期(在接口中定义)受到控制,使得在任何时候集群中只有一个运行的插件实例。

(目前这是通过重用Overseer领导选举来实现的,所以所有处于RUNNING状态的ClusterSingleton在Overseer领导节点上执行)。

任何插件都可以实现此接口,以向Solr指示它需要这种集群单例行为。

ClusterSingleton插件也可以通过在solr.xml中声明它们来配置。

ClusterEventProducer插件

为了支持生成集群级事件,在每个Solr节点上创建ClusterEventProducer的实现。此组件也是ClusterSingleton,这意味着在任何时候集群中只有一个活动实例。

如果未指定插件配置,则使用默认实现org.apache.solr.cluster.events.impl.NoOpProducer,它不生成任何事件-这意味着默认情况下事件生成是关闭的。在org.apache.solr.cluster.events.impl.DefaultClusterEventProducer中也提供了支持节点和集合事件生成的实现。

事件生产者配置可以通过更改预定义的插件配置来动态更改,例如:

1
2
3
4
5
6
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".cluster-event-producer",
"class": "org.apache.solr.cluster.events.impl.DefaultClusterEventProducer"
}}'
http://localhost:8983/api/cluster/plugin

通过简单地删除插件,可以将其恢复到默认的无操作配置:

1
2
3
4
curl -X POST -H 'Content-type: application/json' -d '{
"remove": ".cluster-event-producer"
}'
http://localhost:8983/api/cluster/plugin

ClusterEventListener插件

实现ClusterEventListener接口的插件将自动注册到ClusterEventProducer实例。

实现将收到ClusterEventProducer生成的所有事件的通知,并需要仅选择它们感兴趣的事件。

org.apache.solr.cluster.events.impl.CollectionsRepairEventListener

监听器的实现,对NODE_LOST事件做出反应并检查需要将哪些副本重新添加到其他节点以保持与之前相同的复制计数。

此实现等待一定时间(默认30秒)以确保节点真的宕机。对于位于宕机时间足够长的节点上的副本,它会生成适当的ADDREPLICA命令以抵消这些节点上丢失的副本。

插件配置示例:

1
2
3
4
5
6
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": "collections-repair-listener",
"class": "org.apache.solr.cluster.events.impl.CollectionsRepairEventListener"
}}'
http://localhost:8983/api/cluster/plugin

插件管理API

列出插件

此命令使用HTTP GET并返回加载的插件及其配置的列表:

1
curl http://localhost:8983/api/cluster/plugin

添加插件

此命令使用HTTP POST添加新的插件配置。如果已存在同名插件,则会导致错误。

示例命令,添加包含在Solr包中的插件:

1
2
3
4
5
6
7
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": "my-plugin1",
"class": "my-package:com.example.MyPlugin",
"version": "1.0"
}}'
http://localhost:8983/api/cluster/plugin

更新插件

此命令使用HTTP POST更新现有的插件配置。如果不存在此名称的插件,则会导致错误。

此示例更新现有插件,可能更改其配置参数。旧的插件实例被删除,并使用提供的配置创建新实例。

1
2
3
4
5
6
7
8
curl -X POST -H 'Content-type: application/json' -d '{
"update":{
"name": "collections-repair-listener",
"class": "org.apache.solr.cluster.events.impl.CollectionsRepairEventListener",
"config":{
"waitForSecond": 30
}}}'
http://localhost:8983/api/cluster/plugin

删除插件

此命令使用HTTP POST删除现有的插件配置。如果不存在此名称的插件,则会导致错误。

与其他命令不同,此处的命令负载仅包含要删除的插件名称(作为字符串)。

1
2
3
4
curl -X POST -H 'Content-type: application/json' -d '{
"remove": "my-plugin1"
}'
http://localhost:8983/api/cluster/plugin

总结

Solr的集群插件系统提供了强大的扩展能力,允许开发者在集群级别添加自定义功能。通过理解不同的插件类型、生命周期管理和API操作,可以有效地利用这个系统来增强Solr集群的功能。

关键要点:

  • 插件在CoreContainer级别操作,提供节点级功能
  • 支持动态配置更新,无需重启
  • 预定义名称的插件有特殊用途
  • ClusterSingleton确保集群中只有一个运行实例
  • 通过REST API进行完整的插件生命周期管理
© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero