集群插件
集群(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。
支持以下常用插件属性
名称
-
必需
默认值:无
唯一的插件名称。某些插件类型需要使用预定义的名称才能正常工作。按照惯例,此类预定义名称使用前导点前缀(例如,
.placement-plugin
)。 类
-
必需
默认值:无
实现类。如果该类作为 Solr 的一部分可用,则可以将其指定为完全限定的类名,也可以使用
<package>:<className>
语法来引用 Solr 包中的类。 版本
-
可选
默认值:无
Solr 包版本。
当类从包中加载而不是从 Solr 本身加载时,此参数是必需的。
路径前缀
-
可选
默认值:
无
要添加到插件中定义的 REST API 端点的路径前缀。
配置
-
可选
默认值:
无
其他插件配置参数的 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"
}
}
}}'
https://127.0.0.1:8983/api/cluster/plugin
插件类型
预定义插件名称
具有这些名称的插件在 Solr 的特定部分中使用。它们的名称是保留的,不能用于其他插件类型
-
.placement-plugin
: 实现PlacementPluginFactory
接口的插件。这种类型的插件决定了集群中的副本放置策略。 -
.cluster-event-producer
: 实现ClusterEventProducer
接口的插件。这种类型的插件用于生成集群级事件。
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
中也提供了支持节点和集合事件生成的实现。
事件生成器配置可以通过更改预定义的插件配置来动态更改,例如
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".cluster-event-producer",
"class": "org.apache.solr.cluster.events.impl.DefaultClusterEventProducer"
}}'
https://127.0.0.1:8983/api/cluster/plugin
可以通过简单地删除插件将其恢复为默认的无操作配置
curl -X POST -H 'Content-type: application/json' -d '{
"remove": ".cluster-event-producer"
}'
https://127.0.0.1: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"
}}'
https://127.0.0.1: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"
}}'
https://127.0.0.1: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
}}}'
https://127.0.0.1:8983/api/cluster/plugin