节点角色

Solr 中的节点通常能够执行各种类型的操作,例如,托管副本、执行索引和查询、集合管理任务等。要设置一个将这些功能隔离到某些专用节点的集群,我们可以使用节点角色的概念。

定义

节点角色

角色是节点的指定,表示该节点可以执行特定功能。

模式

每个角色都有一系列节点可以处于的模式。它可以很简单(例如,["on", "off"]),也可以更精细(例如,["allowed", "preferred", "disallowed"])。

角色

为了指定节点的角色,需要使用以下参数启动 Solr 节点。

表 1. 启动参数
参数 必需? 默认值

solr.node.roles

此节点的角色列表,以逗号分隔(格式为:<角色>:<模式>)。示例:-Dsolr.node.roles=data:on,overseer:allowed-Dsolr.node.roles=overseer:preferred

data:on,overseer:allowed

如果启动节点时没有 solr.node.roles 参数,则假定该节点启用了数据角色并允许使用监督者角色。如果您以前从未使用过角色,则可能无需更改启动参数中的任何内容即可适应与这些角色关联的功能。

表 2. 支持的角色
角色 模式

data

on, off

overseer

allowed, preferred, disallowed

coordinator

on, off

data 角色

具有此角色(模式为“on”)的节点可以托管集合的分片和副本。

overseer 角色

具有此角色的节点可以执行监管者节点的职责(除非模式为 disallowed)。当一个或多个节点以 preferred 模式具有监管者角色时,监管者领导者将从这些节点中选出。如果未指定任何节点为首选监管者或没有此类活动节点,则监管者领导者将从以 allowed 模式具有监管者角色的节点中选出。如果所有被指定具有监管者角色的节点(允许或首选)都宕机,则集群将没有监管者。

coordinator 角色

当执行查询时,具有此角色的节点可以表现得好像它拥有集群中所有集合的副本。工作流程如下:

如果集群中的集合具有非常大的分片数量,在您的`数据节点`中执行分布式请求将导致:

  • 大量的堆内存利用率

  • 频繁的 GC 暂停

在这种情况下,可以使用 coordinator 角色启动一些专用节点,并将查询发送到该节点,从而避免数据节点中出现间歇性和不可预测的负载。协调器节点是无状态的,不托管任何数据。因此,我们可以创建和销毁协调器节点而不会造成任何数据丢失或停机时间。

coordinator 节点中的工作流程

  1. 一个使用配置集 configset-A 的针对 coll-A 的请求到达协调器节点

  2. 它检查是否存在使用配置集 configset-A 的核心。如果存在,则该核心充当 coll-A 的副本,并对 coll-A 的所有分片执行分布式请求,然后发送回响应

  3. 如果不存在这样的核心,它会检查是否存在合成集合 .sys.COORDINATOR-COLL-configset-A,并且该集合的副本是否在本地存在。如果不存在,则会动态创建该集合和副本,然后转到 步骤 1

使用示例

有时,当集群中的节点处于繁重的查询或索引负载下时,监管者领导者节点可能无法有效地执行集合管理职责。拥有专用节点来充当监管者可能是合理的。可以通过以下方式实现此效果:

  • 集群中的大多数节点(数据节点)以 -Dsolr.node.roles=data:on,overseer:allowed 启动(或者不带参数,因为 solr.node.roles 的默认值相同)。

  • 一个或多个节点(专用监管者节点)可以以 -Dsolr.node.roles=overseer:preferred 启动(或者 -Dsolr.node.roles=overseer:preferred,data:off

  • 一个或多个专用协调器节点可以以 -Dsolr.node.roles=coordinator:on,data:off 启动

在这种安排中,可以在硬件资源(例如 CPU、内存或磁盘空间)比其他数据节点少的硬件上配置此类专用节点(因为它们是无状态节点),但集群仍将以最佳方式运行。如果专用监管者节点由于某种原因宕机,则将从数据节点中选出监管者领导者(因为它们具有“allowed”模式的监管者),并且一旦其中一个专用监管者节点重新启动,它将再次被选为监管者领导者。

专用 coordinator 节点可以配置足够的内存但很少的存储空间。它们也可以根据需求启动和停止,因为它们是无状态的

角色 API

GET /api/cluster/node-roles/supported

获取此集群支持的角色列表及其支持的模式。

输入

curl https://127.0.0.1:8983/api/cluster/node-roles/supported

输出

{
  "supported-roles":{
    "data":{
      "modes":["off",
        "on"]
    },
    "overseer":{
      "modes":["disallowed",
        "allowed",
        "preferred"]
    }
  }
}

GET /api/cluster/node-roles

获取集群中所有节点的当前节点角色分配。

输入

curl https://127.0.0.1:8983/api/cluster/node-roles

输出

{
  "node-roles":{
    "data":{
      "off":["solr2:8983_solr"],
      "on":["solr1:8983_solr"]
    },
    "overseer":{
      "allowed":["solr1:8983_solr"],
      "disallowed":[],
      "preferred":["solr2:8983_solr"]
    }
  }
}

GET /api/cluster/node-roles/role/{role}

获取指定角色的当前节点角色分配。

输入

https://127.0.0.1:8983/api/cluster/node-roles/role/data

输出

{
  "node-roles":{
    "data":{
      "off":["solr2:8983_solr"],
      "on":["solr1:8983_solr"]
    }
  }
}

输入

https://127.0.0.1:8983/api/cluster/node-roles/role/data/off

输出

{
  "node-roles":{
    "data":{
      "off":["solr2:8983_solr"]
    }
  }
}

GET /api/cluster/node-roles/node/{node}

获取指定节点的当前节点角色分配。

输入

curl https://127.0.0.1:8983/api/cluster/node-roles/node/solr1:8983_solr

输出

{
  "data":"on",
  "overseer":"allowed"
}