分片管理命令

在 SolrCloud 中,分片是集合的逻辑分区。此分区存储集合的整个索引的一部分。

您拥有的分片数量有助于确定单个集合总共可以包含多少文档,并且还会影响搜索性能。

本节中的所有示例都假定您正在运行 "techproducts" Solr 示例

bin/solr start -c -e techproducts

SPLITSHARD:拆分分片

  • V1 API

  • V2 API

输入

https://127.0.0.1:8983/solr/admin/collections?action=SPLITSHARD&collection=techproducts&shard=shard1

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 137
  }
}

输入

curl -X POST https://127.0.0.1:8983/api/collections/techproducts/shards -H 'Content-Type: application/json' -d '
  {
    "split":{
      "shard":"shard1"
    }
  }
'

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

拆分分片会将现有分片分成两部分,并作为两个(新的)分片写入磁盘。原始分片将继续包含相同的数据,但它将开始将请求重新路由到新的分片。新分片将具有与原始分片一样多的副本。在拆分分片后会自动发出软提交,以便在子分片上使文档可见。在拆分操作后,不需要显式提交(硬或软),因为在拆分操作期间索引会自动持久保存到磁盘。

此命令允许无缝拆分,无需停机。正在拆分的分片将继续接受查询和索引请求,并且一旦此操作完成,将自动开始将请求路由到新的分片。此命令只能用于使用 numShards 参数创建的 SolrCloud 集合,这意味着依赖于 Solr 的基于哈希的路由机制的集合。

拆分是通过将原始分片的哈希范围划分为两个相等的分区,并根据新的子范围划分原始分片中的文档来执行的。下面讨论的两个参数 rangessplit.key 提供了对拆分如何发生的进一步控制。

新创建的分片将具有与父分片一样多的副本,具有相同的副本类型。

当使用 splitMethod=rewrite (默认) 时,您必须确保运行父分片领导者的节点具有足够的可用磁盘空间,即大于索引大小的两倍,拆分才能成功。

此外,生成的子分片的第一个副本将始终放置在分片领导者节点上。

分片拆分可能是一个长时间运行的过程。为了避免超时,您应该将其作为异步调用运行。

SPLITSHARD 参数

collection

必需

默认值:无

包含要拆分的分片的集合的名称。此参数是必需的。

shard

可选

默认值:无

要拆分的分片的名称。当未指定 split.key 时,此参数是必需的。

ranges

可选

默认值:无

以逗号分隔的十六进制哈希范围列表,例如 ranges=0-1f4,1f5-3e8,3e9-5dc

此参数可用于将原始分片的哈希范围划分为十六进制指定的任意哈希范围间隔。例如,如果原始哈希范围为 0-1500,则添加参数:ranges=0-1f4,1f5-3e8,3e9-5dc 将把原始分片划分为三个分片,其哈希范围分别为 0-500501-10001001-1500

split.key

可选

默认值:无

用于分割索引的键。

此参数可用于使用路由键分割分片,以便指定路由键的所有文档最终都位于单个专用子分片中。在这种情况下,不需要提供 shard 参数,因为路由键足以确定正确的分片。不支持跨越多个分片的路由键。

例如,假设 split.key=A! 哈希到范围 12-15,并且属于范围为 0-20 的分片“shard1”。按此路由键分割将产生三个子分片,其范围为 0-1112-1516-20。请注意,哈希范围为路由键的子分片也可能包含其他哈希范围重叠的路由键的文档。

numSubShards

可选

默认值:2

要将父分片分割成的子分片数量。此参数的允许值范围为 2-8

仅当未指定 rangessplit.key 时才可以使用此参数。

splitMethod

可选

默认值:rewrite

目前支持两种分片分割方法:* rewrite:在选择要保留在每个分区中的文档后,此方法从头开始创建子索引,这是一个耗时的 CPU 和 I/O 密集型过程,但会产生最佳大小的子索引,其中不包含任何不属于每个分区的文档的数据。* link:使用文件系统级别的硬链接来创建原始索引文件的副本,然后仅修改每个分区中包含已删除文档列表的文件。此方法比 rewrite 方法快得多,并且资源消耗也更少,但生成的子索引仍然与原始索引一样大,因为它们仍然包含不属于该分区文档的数据。这会减慢复制过程,并在副本节点上消耗更多磁盘空间(除非不支持硬链接,否则多个硬链接副本不会占用领导节点上的额外磁盘空间)。

splitFuzz

可选

默认值:0.0

一个浮点值,必须小于 0.5,允许将子分片范围更改为总分片范围的此百分比,奇数分片较大,偶数分片较小。

property.name=value

可选

默认值:无

将核心属性 name 设置为 value。有关支持的属性和值的详细信息,请参阅核心发现部分。

waitForFinalState

可选

默认值:false

如果为 true,则只有当所有受影响的副本都变为活动状态时,请求才会完成。如果为 false,则 API 将返回单个操作的状态,这可能在新副本上线并处于活动状态之前。

timing

可选

默认值:false

如果为 true,则将对处理的每个阶段进行计时,并且响应中将包含一个 timing 部分。

async

可选

默认值:无

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

splitByPrefix

可选

默认值:false

如果为 true,则将通过考虑分片中 compositeId 值的分布来选择分割点。compositeId 的格式为 <prefix>!<suffix>,其中具有相同前缀的所有文档都位于哈希空间的同一位置。如果正在分割的分片中有多个前缀,则将选择分割点,以尽可能将前缀划分为大小相等的分片,而不会分割任何前缀。如果分片中只有一个前缀,则前缀的范围将对半分。

通常会扫描 id 字段以确定每个前缀的文档数量。作为一种优化,如果存在一个名为 id_prefix 的可选字段,并且该字段为每个文档索引了文档前缀(包括 !),则将使用该字段生成计数。

在架构中填充 id_prefix 的一种简单方法是 copyField

  <!-- OPTIONAL, for optimization used by splitByPrefix if it exists -->
  <field name="id_prefix" type="composite_id_prefix" indexed="true" stored="false"/>
  <copyField source="id" dest="id_prefix"/>
  <fieldtype name="composite_id_prefix" class="solr.TextField">
    <analyzer>
      <tokenizer class="solr.PatternTokenizerFactory" pattern=".*!" group="0"/>
    </analyzer>
  </fieldtype>

当前实现细节和限制

  • 前缀大小是使用具有该前缀的文档数量计算的。

  • 仅支持两级 compositeIds。

  • 分片只能分割成两个。

SPLITSHARD 响应

输出将包括请求的状态和新分片名称,这些名称将使用原始分片作为基础,添加下划线和一个数字。例如,“shard1”将变为“shard1_0”和“shard1_1”。如果状态不是“success”,则错误消息将解释请求失败的原因。

其他配置

分割分片时,将在领导分片的本地文件系统上执行可用磁盘空间检查。可以通过 solr.shardSplit.checkDiskSpace.enabled 系统属性禁用此检查(即 -Dsolr.shardSplit.checkDiskSpace.enabled=false)。对于HDFS,默认情况下已禁用此检查。

CREATESHARD:创建分片

对于使用“隐式”路由器的集合(即,在创建集合时,router.name=implicit),只能使用此 API 创建分片。可以为现有的“隐式”集合创建具有名称的新分片。

对于使用“compositeId”路由器(router.key=compositeId)创建的集合,请使用 SPLITSHARD。

  • V1 API

  • V2 API

输入

https://127.0.0.1:8983/solr/admin/collections?action=CREATESHARD&shard=newShardName&collection=techproducts

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 120
  }
}

输入

curl -X POST https://127.0.0.1:8983/api/collections/techproducts/shards -H 'Content-Type: application/json' -d '
  {
    "shard":"newShardName"
  }
'

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

集合中的 replicationFactornrtReplicastlogReplicaspullReplicas 的默认值用于确定要为新分片创建的副本数量。可以通过显式将相应的参数传递给请求来自定义此设置。

CREATESHARD 参数

collection

必需

默认值:无

包含要分割的分片的集合的名称。在 v1 请求中作为查询参数提供,在 v2 请求中作为路径参数提供。

shard

必需

默认值:无

要创建的分片的名称。

createNodeSet

可选

默认值:无

允许定义将新集合分散到的节点。如果未提供,CREATESHARD 操作将在所有活动的 Solr 节点上创建分片副本。

格式为以逗号分隔的 node_names 列表,例如 localhost:8983_solr,localhost:8984_solr,localhost:8985_solr

nrtReplicas

可选

默认值:请参阅描述

应为新分片创建的 nrt 副本的数量。如果省略,则使用集合的默认值。

tlogReplicas

可选

默认值:请参阅描述

应为新分片创建的 tlog 副本的数量。如果省略,则使用集合的默认值。

pullReplicas

可选

默认值:请参阅描述

应为新分片创建的 pull 副本的数量。如果省略,则使用集合的默认值。

property.name=value

可选

默认值:无

将核心属性 name 设置为 value。有关支持的属性和值的详细信息,请参阅核心发现部分。

waitForFinalState

可选

默认值:false

如果为 true,则只有当所有受影响的副本都变为活动状态时,请求才会完成。如果为 false,则 API 将返回单个操作的状态,这可能在新副本上线并处于活动状态之前。

async

可选

默认值:无

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

CREATESHARD 响应

输出将包括请求的状态。如果状态不是“success”,则错误消息将解释请求失败的原因。

DELETESHARD:删除分片

删除分片将卸载该分片的所有副本,将其从集合的 state.json 中删除,并且(默认情况下)删除每个副本的 instanceDir 和 dataDir。它只会删除不活动的分片,或者没有为自定义分片给定范围的分片。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=DELETESHARD&shard=shard1&collection=techproducts
curl -X DELETE https://127.0.0.1:8983/api/collections/techproducts/shards/shard1

DELETESHARD 参数

collection

必需

默认值:无

包含要删除的分片的集合的名称。在 v1 和 v2 请求中分别作为查询参数或路径参数提供。

shard

必需

默认值:无

要删除的分片的名称。在 v1 和 v2 请求中分别作为查询参数或路径参数提供。

deleteInstanceDir

可选

默认值:true

默认情况下,Solr 将删除每个已删除副本的整个 instanceDir。将其设置为 false 可防止删除实例目录。

deleteDataDir

可选

默认值:true

默认情况下,Solr 将删除每个已删除副本的 dataDir。将其设置为 false 可防止删除数据目录。

deleteIndex

可选

默认值:true

默认情况下,Solr 将删除每个已删除副本的索引。将其设置为 false 可防止删除索引目录。

followAliases

可选

默认值:false

一个标志,允许将集合参数视为要解析的实际集合名称的别名。

async

可选

默认值:无

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

DELETESHARD 响应

输出将包括请求的状态。如果状态不是“success”,则错误消息将解释请求失败的原因。

FORCELEADER:强制分片领导者

在分片失去领导者的不太可能的情况下,可以调用此命令来强制选举新的领导者。

  • V1 API

  • V2 API

输入

https://127.0.0.1:8983/solr/admin/collections?action=FORCELEADER&collection=techproducts&shard=shard1

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 78
  }
}

输入

curl -X POST https://127.0.0.1:8983/api/collections/techproducts/shards/shard1/force-leader

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

FORCELEADER 参数

collection

必需

默认值:无

集合的名称。此参数是必需的。

shard

必需

默认值:无

应发生领导者选举的分片的名称。此参数是必需的。

这是一个专家级命令,仅应在常规领导者选举不起作用时调用。如果新领导者没有某些更新(可能是最近的更新),而旧领导者在关闭之前已确认这些更新,则这可能会导致数据丢失。

INSTALLSHARDDATA:将数据安装/导入到分片

在正常情况下,通过索引文档将数据添加到 Solr 集合(以及构成它们的 shards)。但是,某些用例需要脱机构建每个分片的索引。通常这样做是为了使查询流量免受索引负载的影响,或者因为所使用的 ETL 管道特别复杂。INSTALLSHARDDATA API 允许将这些预构建的索引安装到集合中的各个分片中。安装会将索引文件复制到分片内的所有副本中,从而覆盖该分片持有的任何现有数据。

要将数据安装到分片中,首先必须使用MODIFYCOLLECTION API将拥有该分片的集合置于“readOnly”模式。进入只读模式后,可以串行或并行完成分片安装。可以从 Solr 的可插拔备份存储库抽象支持的任何 repositorylocation 导入数据。

指定的 location 必须包含构成核心 data/index 目录的所有文件。用户有责任确保安装到分片的索引与托管该分片的集合的模式和配置兼容。

  • V1 API

  • V2 API

输入

https://127.0.0.1:8983/solr/admin/collections?action=INSTALLSHARDDATA&collection=techproducts&shard=shard1&repository=localfs&location=/mounts/myNFSDrive/tech/shard1/data/index

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 78
  }
}

输入

curl -X POST https://127.0.0.1:8983/api/collections/techproducts/shards/shard1/install -H 'Content-Type: application/json' -d '
  {
    "repository": "localfs",
    "location": "/mounts/myNFSDrive/tech/shard1/data/index"
  }
'

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

INSTALLSHARDDATA 参数

collection

必需

默认值:无

集合的名称。此参数为必填项。在 v1 请求中指定为查询参数,在 v2 请求中指定为路径段。

shard

必需

默认值:无

要将数据安装到的分片的名称。此参数为必填项。在 v1 请求中指定为查询参数,在 v2 请求中指定为路径段。

位置

必需

默认值:无

在指定的备份存储库中查找要安装的索引文件的位置。在 v1 请求中指定为查询参数,在 v2 请求的请求正文中指定。

存储库

可选

默认值:无

要在其中查找索引文件的备份存储库的名称。在 v1 请求中指定为查询参数,在 v2 请求的请求正文中指定。如果未提供 repository 参数,则将使用 Solr 的默认备份存储库(如果在 solr.xml 中定义了)。

async

可选

默认值:无

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