分片管理命令

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

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

本部分中的所有示例均假设你正在运行“techproducts”Solr 示例

bin/solr -c -e techproducts

SPLITSHARD:拆分分片

V1 API

输入

http://localhost:8983/solr/admin/collections?action=SPLITSHARD&collection=techproducts&shard=shard1

输出

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

V2 API 输入

curl -X POST http://localhost: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 参数

集合

必需

默认值:无

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

碎片

可选

默认值:无

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

范围

可选

默认值:无

十六进制哈希范围的逗号分隔列表,例如 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>

当前实现详细信息和限制

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

  • 仅支持两级 compositeId。

  • 分片只能拆分为两个。

SPLITSHARD 响应

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

其他配置

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

CREATESHARD:创建分片

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

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

V1 API

输入

http://localhost:8983/solr/admin/collections?action=CREATESHARD&shard=newShardName&collection=techproducts

输出

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

V2 API 输入

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

输出

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

replicationFactornrtReplicastlogReplicaspullReplicas 的默认值从集合中使用,以确定为新分片创建的副本数。可以通过明确地将相应参数传递给请求来对其进行自定义。

CREATESHARD 参数

集合

必需

默认值:无

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

碎片

必需

默认值:无

要创建的分片的名称。

createNodeSet

可选

默认值:无

允许定义节点以跨新集合进行传播。如果没有提供,CREATESHARD 操作将在所有活动 Solr 节点上创建跨分片副本传播。

格式是逗号分隔的节点名称列表,例如 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 响应

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

DELETESHARD:删除分片

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

V1 API

http://localhost:8983/solr/admin/collections?action=DELETESHARD&shard=shard1&collection=techproducts

V2 API

curl -X DELETE http://localhost:8983/api/collections/techproducts/shards/shard1

DELETESHARD 参数

集合

必需

默认值:无

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

碎片

必需

默认值:无

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

deleteInstanceDir

可选

默认值:true

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

deleteDataDir

可选

默认值:true

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

deleteIndex

可选

默认值:true

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

followAliases

可选

默认值:false

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

async

可选

默认值:无

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

DELETESHARD 响应

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

FORCELEADER:强制分片领导者

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

V1 API

输入

http://localhost:8983/solr/admin/collections?action=FORCELEADER&collection=techproducts&shard=shard1

输出

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

V2 API 输入

curl -X POST http://localhost:8983/api/collections/techproducts/shards/shard1/force-leader

输出

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

FORCELEADER 参数

集合

必需

默认值:无

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

碎片

必需

默认值:无

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

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

INSTALLSHARDDATA:安装/导入分片数据

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

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

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

V1 API

输入

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

输出

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

V2 API 输入

curl -X POST http://localhost: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 参数

集合

必需

默认值:无

集合的名称。此参数是必需的。指定为 v1 请求的查询参数,并指定为 v2 请求的路径段。

碎片

必需

默认值:无

要安装数据的分片的名称。此参数是必需的。指定为 v1 请求的查询参数,并指定为 v2 请求的路径段。

location

必需

默认值:无

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

repository

可选

默认值:无

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

async

可选

默认值:无

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