集群插件

集群(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

集群插件的类型

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

  • 请求处理程序插件,用于公开 REST API 端点(实现类使用 @EndPoint 和可选的 @Command 注释进行注释)。这些插件的 API 会自动注册为 REST 端点,其路径在 @EndPoint 注释中定义。

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

插件生命周期

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

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

实际上,这意味着由该 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 中也提供了支持节点和集合事件生成的实现。

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

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 GET 并返回已加载插件及其配置的列表

curl https://127.0.0.1:8983/api/cluster/plugin

添加插件

此命令使用 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

删除插件

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

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

curl -X POST -H 'Content-type: application/json' -d '{
    "remove": "my-plugin1"
    }'
  https://127.0.0.1:8983/api/cluster/plugin