集群插件

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

群集插件类型

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

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

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

插件生命周期

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

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

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

插件类型

预定义插件名称

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

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

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

PlacementPluginFactory 插件

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

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

curl http://localhost: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"
    }}'
  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

移除插件

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

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

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