集群和节点管理命令

集群是一组协同运行的 Solr 节点。

这些 API 命令在整个集群级别或在单个节点上与 SolrCloud 集群一起工作。

CLUSTERSTATUS:集群状态

获取集群状态,包括集合、分片、副本、配置名称以及集合别名和集群属性。

此外,此命令报告每个集合和分片的 health 状态,以便更容易监控集合的运行状态。 基于活动副本百分比(active),定义了以下运行状态值,从最佳到最差排序:

绿色

active == 100%,所有副本都处于活动状态,并且有一个分片领导者。

黄色

100% > active > 50%,并且有一个分片领导者。

橙色

50% >= active > 0%,并且有一个分片领导者。

红色

没有活动的副本 或者 没有分片领导者。

集合运行状态报告为任何分片的最差状态,例如,对于一个所有分片均为绿色的集合,除了一个黄色的分片外,集合运行状态将报告为黄色。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=CLUSTERSTATUS
curl -X GET https://127.0.0.1:8983/api/cluster

CLUSTERSTATUS 参数

collection

可选

默认值:无

请求信息的集合或别名名称。 如果省略,将返回集群中所有集合的信息。 如果提供了别名,将返回别名中集合的信息。

shard

可选

默认值:无

请求信息的分片。多个分片名称可以指定为逗号分隔的列表。

_route_

可选

默认值:无

如果您需要知道特定文档所属的分片详细信息,而您不知道它属于哪个分片,则可以使用此参数。

CLUSTERSTATUS 响应

响应将包括请求的状态和集群的状态。

使用 CLUSTERSTATUS 的示例

输入

https://127.0.0.1:8983/solr/admin/collections?action=CLUSTERSTATUS

输出

{
  "responseHeader":{
    "status":0,
    "QTime":333},
  "cluster":{
    "collections":{
      "collection1":{
        "shards":{
          "shard1":{
            "range":"80000000-ffffffff",
            "state":"active",
            "health": "GREEN",
            "replicas":{
              "core_node1":{
                "state":"active",
                "core":"collection1",
                "node_name":"127.0.1.1:8983_solr",
                "base_url":"http://127.0.1.1:8983/solr",
                "leader":"true"},
              "core_node3":{
                "state":"active",
                "core":"collection1",
                "node_name":"127.0.1.1:8900_solr",
                "base_url":"http://127.0.1.1:8900/solr"}}},
          "shard2":{
            "range":"0-7fffffff",
            "state":"active",
            "health": "GREEN",
            "replicas":{
              "core_node2":{
                "state":"active",
                "core":"collection1",
                "node_name":"127.0.1.1:7574_solr",
                "base_url":"http://127.0.1.1:7574/solr",
                "leader":"true"},
              "core_node4":{
                "state":"active",
                "core":"collection1",
                "node_name":"127.0.1.1:7500_solr",
                "base_url":"http://127.0.1.1:7500/solr"}}}},
        "router":{"name":"compositeId"},
        "replicationFactor":"1",
        "znodeVersion": 11,
        "autoCreated":"true",
        "configName" : "my_config",
        "health": "GREEN",
        "aliases":["both_collections"]
      },
      "collection2":{
        "..."
      }
    },
    "aliases":{ "both_collections":"collection1,collection2" },
    "roles":{
      "overseer":[
        "127.0.1.1:8983_solr",
        "127.0.1.1:7574_solr"]
    },
    "live_nodes":[
      "127.0.1.1:7574_solr",
      "127.0.1.1:7500_solr",
      "127.0.1.1:8983_solr",
      "127.0.1.1:8900_solr"]
  }
}

CLUSTERPROP:集群属性

添加、编辑或删除集群范围的属性。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=CLUSTERPROP&name=urlScheme&val=https
curl -X POST https://127.0.0.1:8983/api/cluster -H 'Content-Type: application/json' -d '
  {
    "set-property": {
      "name": "urlScheme",
      "val": "https"
    }
  }
'

CLUSTERPROP 参数

name

可选

默认值:无

属性的名称。支持的属性名称有 locationmaxCoresPerNodeurlSchemedefaultShardPreferences。如果启用了 Jaeger 追踪模块,则还可使用属性 samplePercentage

可以设置其他属性(例如,如果自定义插件需要它们),但它们必须以 ext. 前缀开头。不以 ext. 开头的未知属性将被拒绝。

val

可选

默认值:无

属性的值。如果值为空或 null,则该属性未设置。

CLUSTERPROP 响应

响应将包括请求的状态以及已更新或删除的属性。如果状态不是 “0”,则会显示错误消息解释请求失败的原因。

使用 CLUSTERPROP 的示例

输入

https://127.0.0.1:8983/solr/admin/collections?action=CLUSTERPROP&name=urlScheme&val=https&wt=xml

输出

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">0</int>
  </lst>
</response>

设置集群范围的默认值

可以使用 defaults 参数为集合的某些属性设置集群范围的默认值。

设置/更新默认值

  • V1 API

  • V2 API

此操作没有 V1 等效项。

curl -X POST -H 'Content-type:application/json' --data-binary '
{
  "set-obj-property": {
    "defaults" : {
      "collection": {
        "numShards": 2,
        "nrtReplicas": 1,
        "tlogReplicas": 1,
        "pullReplicas": 1
      }
    }
  }
}' https://127.0.0.1:8983/api/cluster

取消设置 nrtReplicas 的唯一值

curl -X POST -H 'Content-type:application/json' --data-binary '
{
  "set-obj-property": {
    "defaults" : {
      "collection": {
        "nrtReplicas": null
      }
    }
  }
}' https://127.0.0.1:8983/api/cluster

取消设置 defaults 中的所有值

curl -X POST -H 'Content-type:application/json' --data-binary '
{ "set-obj-property" : {
    "defaults" : null
}' https://127.0.0.1:8983/api/cluster

默认分片首选项

使用 defaultShardPreferences 参数,可以实现机架或可用区感知。首先,请确保使用 系统属性(例如,-Drack=rack1)“标记”您的节点。然后,将 defaultShardPreferences 的值设置为 node.sysprop:sysprop.YOUR_PROPERTY_NAME,如下所示:

curl -X POST -H 'Content-type:application/json' --data-binary '
{
  "set-property" : {
    "name" : "defaultShardPreferences",
    "val" : "node.sysprop:sysprop.rack"
  }
}' https://127.0.0.1:8983/api/cluster

此时,如果在具有例如 rack=rack1 的节点上运行查询,Solr 将尝试仅命中来自 rack1 的副本。

平衡副本

在给定的 Solr 节点集中随机调整副本,直到达到平衡状态。

将使用配置的 副本放置插件 来决定

  • 哪些副本应移动以进行平衡

  • 应将这些副本放置在哪些节点上

  • 何时集群已达到“平衡”状态

  • V2 API

curl -X POST https://127.0.0.1:8983/api/cluster/replicas/balance -H 'Content-Type: application/json' -d '
  {
    "nodes": ["localhost:8983_solr", "localhost:8984_solr"],
    "async": "balance-replicas-1"
  }
'

参数

nodes

可选

默认值:无

将平衡副本的节点。不在此节点集中的副本将不包括在平衡中。

如果未提供此参数,将使用所有活动的 data 节点。

waitForFinalState

可选

默认值:false

如果为 true,则只有在所有受影响的副本变为活动状态时,请求才会完成。如果为 false,则当最少的副本(例如受影响的 leader 副本)处于活动状态时,API 将返回。

async

可选

默认值:无

用于跟踪此操作的请求 ID,该操作将异步处理

BalanceReplicas 响应

响应将包括请求的状态。如果状态不是 “0”,则会显示错误消息解释请求失败的原因。

此操作不会在属于源节点的副本上保持必要的锁。因此,在此期间不要执行其他集合操作。

BALANCESHARDUNIQUE:跨节点平衡属性

确保在构成集合的物理节点之间均匀分布特定属性。如果该属性已存在于副本上,则会尽一切努力将其保留在那里。如果该属性在分片上的任何副本上,则选择一个并添加该属性。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=BALANCESHARDUNIQUE&collection=techproducts&property=preferredLeader
curl -X POST https://127.0.0.1:8983/api/collections/techproducts/balance-shard-unique -H 'Content-Type: application/json' -d '
  {
    "property": "preferredLeader"
  }
'

BALANCESHARDUNIQUE 参数

collection

collection

默认值:无

必需。要在其中平衡属性的集合的名称。

property

collection

默认值:无

要平衡的属性。如果未明确指定,则文字 property. 会添加到此属性的前面。

onlyactivenodes

可选

默认值:true

通常,该属性仅在活动节点上实例化。如果此参数指定为 false,则非活动节点也包括在分布中。

shardUnique

可选

默认值:无

一种安全阀。有一个预定义的属性 (preferredLeader) 将此值默认为 true。对于所有其他平衡的属性,必须将其设置为 true,否则将返回错误消息。

BALANCESHARDUNIQUE 响应

响应将包括请求的状态。如果状态不是 “0”,则会显示错误消息解释请求失败的原因。

使用 BALANCESHARDUNIQUE 的示例

输入

以下任一命令都会将 "preferredLeader" 属性放在 "collection1" 集合中每个分片的一个副本上。

https://127.0.0.1:8983/solr/admin/collections?action=BALANCESHARDUNIQUE&collection=collection1&property=preferredLeader&wt=xml

https://127.0.0.1:8983/solr/admin/collections?action=BALANCESHARDUNIQUE&collection=collection1&property=property.preferredLeader&wt=xml

输出

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">9</int>
  </lst>
</response>

发出此调用后检查 clusterstate 应显示每个分片中只有一个具有此属性的副本。

迁移副本

将所有副本从给定的源节点集迁移出去。

+ 如果使用多个节点作为 targetNode(显式或默认),则配置的 副本放置插件 将用于确定应将哪个 targetNode 用于每个迁移的副本。

  • V2 API

curl -X POST https://127.0.0.1:8983/api/cluster/replicas/migrate -H 'Content-Type: application/json' -d '
  {
    "sourceNodes": ["localhost:8983_solr", "localhost:8984_solr"],
    "targetNodes": ["localhost:8985_solr", "localhost:8986_solr"],
    "async": "migrate-replicas-1"
  }
'

参数

sourceNodes

collection

默认值:无

将平衡副本的节点。不在此节点集中的副本将不包括在平衡中。

targetNodes

可选

默认值:无

迁移的副本将移动到的节点。如果未提供任何节点,则 API 将使用 sourceNodes 中未提供的所有活动节点。

如果要将副本迁移到多个节点,则将选择配置的 PlacementPlugin 副本的其中一个节点

waitForFinalState

可选

默认值:false

如果为 true,则只有在所有受影响的副本变为活动状态时,请求才会完成。如果为 false,则当最少的副本(例如受影响的 leader 副本)处于活动状态时,API 将返回。

async

可选

默认值:无

用于跟踪此操作的请求 ID,该操作将异步处理

MigrateReplicas 响应

响应将包括请求的状态。如果状态不是 “0”,则会显示错误消息解释请求失败的原因。

此操作不会在属于源节点的副本上保持必要的锁。因此,在此期间不要执行其他集合操作。

REPLACENODE:将节点中的所有副本移动到另一个节点

此 API 的功能已由 迁移副本 替换和增强,请考虑改用新的 API,因为此 API 可能会在将来的版本中删除。

此命令在一个节点(源)上重新创建副本,在另一个或多个节点(目标)上重新创建副本。复制每个副本后,将删除源节点中的副本。

对于也是分片 leader 的源副本,该操作将等待 timeout 参数设置的秒数,以确保存在一个可以成为 leader 的活动副本,无论是现有副本成为 leader 还是新副本完成恢复并成为 leader)。

如果未提供 targetNode,则将使用配置的 副本放置插件 来确定应将每个重新创建的副本放置在哪个节点上。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=REPLACENODE&sourceNode=source-node&targetNode=target-node
curl -X POST "https://127.0.0.1:8983/api/cluster/nodes/localhost:7574_solr/replace" -H 'Content-Type: application/json' -d '
    {
      "targetNodeName": "localhost:8983_solr",
      "waitForFinalState": "false",
      "async": "async"
    }
'

REPLACENODE 参数

sourceNode

collection

默认值:无

需要从中复制副本的源节点。

targetNode

可选

默认值:无

将复制副本的目标节点。如果未提供此参数,Solr 将使用除 sourceNode 以外的所有活动节点。配置的 副本放置插件 将用于确定将为每个副本使用哪个节点。

parallel

可选

默认值:false

如果将此标志设置为 true,则将在单独的线程中创建所有副本。请记住,如果副本具有非常大的索引,则这可能会导致非常高的网络和磁盘 I/O。

waitForFinalState

可选

默认值:false

如果为 true,则只有在所有受影响的副本变为活动状态时,请求才会完成。如果为 false,则当最少的副本(例如受影响的 leader 副本)处于活动状态时,API 将返回。

async

可选

默认值:无

用于跟踪此操作的请求 ID,该操作将异步处理

timeout

可选

默认值:300

等待创建新副本以及等待 leader 副本完全恢复的时间(以秒为单位)。

此操作不会在属于源节点的副本上保持必要的锁。因此,在此期间不要执行其他集合操作。

DELETENODE:删除节点中的副本

删除该节点中所有集合的所有副本。请注意,此操作后,该节点本身将保留为活动节点。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=DELETENODE&node=nodeName
curl -X POST "https://127.0.0.1:8983/api/cluster/nodes/localhost:7574_solr/clear/" -H 'Content-Type: application/json' -d '
    {
      "async": "someAsyncId"
    }
'

DELETENODE 参数

node

collection

默认值:无

要删除的节点。

async

可选

默认值:无

用于跟踪此操作的请求 ID,该操作将异步处理

ADDROLE:添加角色

将角色分配给群集中的给定节点。唯一支持的角色是 overseer

使用此命令将特定节点指定为 Overseer。多次调用以添加更多节点。这在 Overseer 可能超载的大型集群中很有用。如果可用,则被分配“overseer”角色的节点列表中的一个将成为 overseer。如果没有指定节点启动并运行,则系统会将该角色分配给任何其他节点。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=ADDROLE&role=overseer&node=localhost:8983_solr
curl -X POST https://127.0.0.1:8983/api/cluster -H 'Content-Type: application/json' -d '
  {
    "add-role": {
      "role": "overseer",
      "node": "localhost:8983_solr"
    }
  }
'

ADDROLE 参数

role

collection

默认值:无

角色的名称。目前唯一支持的角色是 overseer

node

collection

默认值:无

将分配角色的节点的名称。即使该节点尚未启动,也可以分配角色。

ADDROLE 响应

响应将包括请求的状态以及已更新或删除的属性。如果状态不是 “0”,则会显示错误消息解释请求失败的原因。

使用 ADDROLE 的示例

输入

https://127.0.0.1:8983/solr/admin/collections?action=ADDROLE&role=overseer&node=192.167.1.2:8983_solr&wt=xml

输出

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">0</int>
  </lst>
</response>

REMOVEROLE:删除角色

删除分配的角色。此 API 用于撤消使用 ADDROLE 操作分配的角色

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=REMOVEROLE&role=overseer&node=localhost:8983_solr
curl -X POST https://127.0.0.1:8983/api/cluster -H 'Content-Type: application/json' -d '
  {
    "remove-role": {
      "role": "overseer",
      "node": "localhost:8983_solr"
    }
  }
'

REMOVEROLE 参数

role

collection

默认值:无

角色的名称。目前唯一支持的角色是 overseer

node

collection

默认值:无

应该删除角色的节点的名称。

REMOVEROLE 响应

响应将包括请求的状态以及已更新或删除的属性。如果状态不是 “0”,则会显示错误消息解释请求失败的原因。

使用 REMOVEROLE 的示例

输入

https://127.0.0.1:8983/solr/admin/collections?action=REMOVEROLE&role=overseer&node=192.167.1.2:8983_solr&wt=xml

输出

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">0</int>
  </lst>
</response>

OVERSEERSTATUS:Overseer 状态和统计信息

返回 overseer 的当前状态、各种 overseer API 的性能统计信息以及每个操作类型的最后 10 次失败。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=OVERSEERSTATUS
curl -X GET https://127.0.0.1:8983/api/cluster/overseer

使用 OVERSEERSTATUS 的示例

输入

https://127.0.0.1:8983/solr/admin/collections?action=OVERSEERSTATUS
{
  "responseHeader":{
    "status":0,
    "QTime":33},
  "leader":"127.0.1.1:8983_solr",
  "overseer_queue_size":0,
  "overseer_work_queue_size":0,
  "overseer_collection_queue_size":2,
  "overseer_operations":[
    "createcollection",{
      "requests":2,
      "errors":0,
      "avgRequestsPerSecond":0.7467088842794136,
      "5minRateRequestsPerSecond":7.525069023276674,
      "15minRateRequestsPerSecond":10.271274280947182,
      "avgTimePerRequest":0.5050685,
      "medianRequestTime":0.5050685,
      "75thPcRequestTime":0.519016,
      "95thPcRequestTime":0.519016,
      "99thPcRequestTime":0.519016,
      "999thPcRequestTime":0.519016},
    "removeshard",{
      "..."
  }],
  "collection_operations":[
    "splitshard",{
      "requests":1,
      "errors":1,
      "recent_failures":[{
          "request":{
            "operation":"splitshard",
            "shard":"shard2",
            "collection":"example1"},
          "response":[
            "Operation splitshard caused exception:","org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: No shard with the specified name exists: shard2",
            "exception",{
              "msg":"No shard with the specified name exists: shard2",
              "rspCode":400}]}],
      "avgRequestsPerSecond":0.8198143044809885,
      "5minRateRequestsPerSecond":8.043840552427673,
      "15minRateRequestsPerSecond":10.502079828515368,
      "avgTimePerRequest":2952.7164175,
      "medianRequestTime":2952.7164175000003,
      "75thPcRequestTime":5904.384052,
      "95thPcRequestTime":5904.384052,
      "99thPcRequestTime":5904.384052,
      "999thPcRequestTime":5904.384052},
    "..."
  ],
  "overseer_queue":[
    "..."
  ],
  "..."
 }