集群插件
群集(CoreContainer 级别)插件子系统
群集插件是可插入组件,在 CoreContainer
(节点)级别定义并实例化。这些组件通常提供管理级别功能和 API,以在 Solr 节点级别提供其他功能。
插件配置
如果 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
接口的插件将使用从此映射反序列化的插件特定配置对象进行初始化。
插件配置示例
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
插件类型
预定义插件名称
具有这些名称的插件用于 Solr 的特定部分。它们的名称是保留的,不能用于其他插件类型
-
.placement-plugin
:实现PlacementPluginFactory
接口的插件。此类型的插件确定群集中的副本放置策略。 -
.cluster-event-producer
:实现ClusterEventProducer
接口的插件。此类型的插件用于生成群集级事件。
ClusterSingleton 插件
实现 ClusterSingleton
接口的插件在每个 Solr 节点上实例化。但是,其启动/停止生命周期(在接口中定义)受控于一种方式,即群集中任何时候只存在插件的一个正在运行的实例。
(目前,这是通过重新使用 Overseer 领导者选举实现的,因此所有处于 RUNNING 状态的 ClusterSingleton
-s 都在 Overseer 领导者节点上执行)。
任何插件都可以实现此接口,以向 Solr 指示它需要此群集单例行为。
ClusterSingleton
插件还可以通过在 solr.xml 中声明它们进行配置。
ClusterEventProducer 插件
为了支持群集级别事件的生成,在每个 Solr 节点上创建 ClusterEventProducer
的实现。此组件也是一个 ClusterSingleton
,这意味着群集中任何时候只存在一个活动实例。
如果没有指定插件配置,则使用默认实现 org.apache.solr.cluster.events.impl.NoOpProducer
,它不会生成任何事件 - 这意味着默认情况下事件生成已关闭。在 org.apache.solr.cluster.events.impl.DefaultClusterEventProducer
中还提供了一个支持节点和集合事件生成的实现。
可以通过更改预定义的插件配置来动态更改事件生成器配置,例如
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
可以通过简单地移除插件来将其还原为默认的无操作配置
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 命令来平衡这些节点上丢失的副本。
插件配置示例
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 POST 添加新的插件配置。如果已存在同名插件,则会导致错误。
示例命令,添加包含在 Solr 包中的插件
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 更新现有插件配置。如果不存在此名称的插件,则会导致错误。
此示例更新现有插件,可能更改其配置参数。插件的旧实例将被移除,并使用提供的配置创建新实例。
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