SPLITSHARD:分割碎片
/admin/collections?action=SPLITSHARD&collection=name&shard=shardID
分割碎片将使用现有的碎片并将其拆分成两个碎片,这些碎片作为两个(新的)碎片写入磁盘。原始碎片将继续包含相同的数据,但是会启动将请求重新路由到新的碎片。新的碎片将具有与原始碎片一样多的副本。分割碎片后自动发出软提交,以便文档在子分片上可见。在分割操作之后,显式提交(hard 或者 soft)不是必需的,因为索引在分割操作期间会自动保留到磁盘。
这个命令允许无缝拆分,不需要停机。被拆分的碎片将继续接受查询和索引请求,并且一旦完成该操作,将自动开始将请求路由到新的碎片。此命令只能用于使用numShards参数创建的SolrCloud集合,这意味着依赖于Solr的基于哈希的路由机制的集合。
分割是通过将原始分片的哈希范围划分为两个相等的分区,并根据新的子分区来划分原始碎片中的文档。下面讨论的两个参数:ranges和split.key提供对分割的方式的进一步控制。
碎片分割可能是一个漫长的过程。为了避免超时,你应该将其作为异步调用运行。
SPLITSHARD参数
- collection
包含要分割的碎片的集合的名称。该参数是必需的。
- shard
要分割的碎片的名称。未指定
split.key
时需要此参数。 - ranges
用十六进制表示哈希范围的逗号分隔列表,如
ranges=0-1f4,1f5-3e8,3e9-5dc
。此参数可用于将原始分片的哈希范围划分为以十六进制指定的任意哈希范围区间。例如,如果原始哈希范围
0-1500
然后添加参数:ranges=0-1f4,1f5-3e8,3e9-5dc
将原始碎片分成三个碎片,分别为哈希范围0-500
,501-1000
和1001-1500
。 - split.key
用于分割索引的关键。
此参数可用于使用路由密钥分割碎片,以使指定的路由密钥的所有文档都在一个专用的子分片中结束。在这种情况下不需要提供
shard
参数,因为路由密钥足以找出正确的分片。不支持跨越多个分片的路由密钥。例如,假设
split.key=A!
哈希到该范围,12-15
并且属于带范围0-20
的分片“shard1”。分割经此路由密钥将产生三个子碎片与范围0-11
,12-15
以及16-20
。请注意,具有路由密钥哈希范围的子分片也可能包含哈希范围重叠的其他路由密钥的文档。 - property.name=value
将核心属性name设置为value。有关受支持的属性和值的详细信息,请参阅定义core.properties一节。
- async
SPLITSHARD响应
输出将包括请求的状态和新的分片名称,它们将使用原始碎片作为基础,添加一个下划线和一个数字。例如,“shard1”将变成“shard1_0”和“shard1_1”。如果状态不是“success”,则会显示错误消息,说明请求失败的原因。
使用SPLITSHARD的例子
输入:
拆分“anotherCollection”集合的shard1。
http://localhost:8983/solr/admin/collections?action=SPLITSHARD&collection=anotherCollection&shard=shard1
输出:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">6120</int>
</lst>
<lst name="success">
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">3673</int>
</lst>
<str name="core">anotherCollection_shard1_1_replica1</str>
</lst>
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">3681</int>
</lst>
<str name="core">anotherCollection_shard1_0_replica1</str>
</lst>
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">6008</int>
</lst>
</lst>
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">6007</int>
</lst>
</lst>
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">71</int>
</lst>
</lst>
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
</lst>
<str name="core">anotherCollection_shard1_1_replica1</str>
<str name="status">EMPTY_BUFFER</str>
</lst>
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
</lst>
<str name="core">anotherCollection_shard1_0_replica1</str>
<str name="status">EMPTY_BUFFER</str>
</lst>
</lst>
</response>