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 | curl -X POST -H 'Content-type: application/json' -d '{ |
集群插件类型
从插件加载的类通常支持两种类型的功能(不互斥):
请求处理器插件:公开REST API端点(实现类用
@EndPoint
注解,可选地用@Command
注解)。这些插件的API自动注册为@EndPoint
注解中定义的路径下的REST端点。特定接口实现插件:用作内部组件。加载后,它们会被自动发现并注册到使用此类插件的子系统中。示例包括
ClusterSingleton
、ClusterEventProducer
、ClusterEventListener
和PlacementPluginFactory
。
插件生命周期
插件实例在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 | curl -X POST -H 'Content-type: application/json' -d '{ |
通过简单地删除插件,可以将其恢复到默认的无操作配置:
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
ClusterEventListener插件
实现ClusterEventListener
接口的插件将自动注册到ClusterEventProducer
实例。
实现将收到ClusterEventProducer
生成的所有事件的通知,并需要仅选择它们感兴趣的事件。
org.apache.solr.cluster.events.impl.CollectionsRepairEventListener
监听器的实现,对NODE_LOST事件做出反应并检查需要将哪些副本重新添加到其他节点以保持与之前相同的复制计数。
此实现等待一定时间(默认30秒)以确保节点真的宕机。对于位于宕机时间足够长的节点上的副本,它会生成适当的ADDREPLICA命令以抵消这些节点上丢失的副本。
插件配置示例:
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
插件管理API
列出插件
此命令使用HTTP GET并返回加载的插件及其配置的列表:
1 | curl http://localhost:8983/api/cluster/plugin |
添加插件
此命令使用HTTP POST添加新的插件配置。如果已存在同名插件,则会导致错误。
示例命令,添加包含在Solr包中的插件:
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
更新插件
此命令使用HTTP POST更新现有的插件配置。如果不存在此名称的插件,则会导致错误。
此示例更新现有插件,可能更改其配置参数。旧的插件实例被删除,并使用提供的配置创建新实例。
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
删除插件
此命令使用HTTP POST删除现有的插件配置。如果不存在此名称的插件,则会导致错误。
与其他命令不同,此处的命令负载仅包含要删除的插件名称(作为字符串)。
1 | curl -X POST -H 'Content-type: application/json' -d '{ |
总结
Solr的集群插件系统提供了强大的扩展能力,允许开发者在集群级别添加自定义功能。通过理解不同的插件类型、生命周期管理和API操作,可以有效地利用这个系统来增强Solr集群的功能。
关键要点:
- 插件在CoreContainer级别操作,提供节点级功能
- 支持动态配置更新,无需重启
- 预定义名称的插件有特殊用途
- ClusterSingleton确保集群中只有一个运行实例
- 通过REST API进行完整的插件生命周期管理