cleanupOrphaned
¶从分片中删除其分片键值落入不属于该分片的单个或单个连续范围内的孤立文档。例如,如果两个连续范围不属于该分片,则
cleanupOrphaned
检查两个范围中是否有孤立文档。
要运行,请直接在作为分片的主副本集成员的实例上cleanupOrphaned
在admin
数据库中发出mongod
。您无需在运行之前禁用平衡器cleanupOrphaned
。
注意
不要cleanupOrphaned
在mongos
实例上
运行。
cleanupOrphaned
具有以下语法:
cleanupOrphaned
具有以下字段:
领域 | 类型 | 描述 |
---|---|---|
cleanupOrphaned |
串 | 分片集合的名称空间,即数据库和集合名称,将为其清除孤立数据。 |
startingFromKey |
文献 | 可选的。分片键值,确定清除范围的下限。默认值为 如果包含指定 |
secondaryThrottle |
布尔值 | 可选的。如果为 与 |
writeConcern |
文献 | 可选的。这表达了一个文件写入关注的是,
|
cleanupOrphaned
扫描分片中的文档,以确定文档是否属于该分片。因此,运行
cleanupOrphaned
会影响性能。但是,性能将取决于该范围内孤立文档的数量。
要删除分片中的所有孤立文档,您可以循环运行命令(有关示例,请参阅从分片中删除所有孤立的文档)。如果担心此操作对性能的影响,您可能希望在迭代之间包含一个暂停。
或者,为减轻的影响cleanupOrphaned
,您可能希望在非高峰时间运行该命令。
也可以调整对性能的影响
cleanupOrphaned
与参数,
rangeDeleterBatchSize
和
rangeDeleterBatchDelayMS
。例如:
rangeDeleterBatchSize
一个较小的值,例如32
。rangeDeleterBatchDelayMS
高于当前默认值(
20
毫秒)。注意
更改rangeDeleterBatchSize
并
rangeDeleterBatchDelayMS
影响所有范围删除,包括在正常块迁移期间。
如果要临时修改其中一个或两个参数以使其运行cleanupOrphaned
,请在运行后返回其先前的值cleanupOrphaned
。
该cleanupOrphaned
命令使用startingFromKey
值(如果已指定)确定要检查孤立文档的范围的开始:
startingFromKey
值落在该碎片不拥有的块cleanupOrphaned
的范围内,则在该范围的开始处开始检查,可能不一定是
startingFromKey
。startingFromKey
值落入分片所拥有的块的范围内,请cleanupOrphaned
移至下一个范围,直到找到该分片所拥有的块的范围。该cleanupOrphaned
删除在属于碎片块范围的开始孤立从所确定的范围和端部的开始文档。
考虑以下关键空间,其中文档分布在
和之间。Shard A
Shard B
Shard A
拥有:
Chunk 1
在范围内,{ x: minKey } --> { x: -75 }
Chunk 2
与范围,和{ x: -75 } --> { x: 25 }
Chunk 4
与范围。{ x: 175 } --> { x: 200 }
Shard B
拥有:
Chunk 3
与范围和{ x: 25 } --> { x: 175 }
Chunk 5
与范围。{ x: 200 } --> { x: maxKey }
如果,在与命令运行
还是属于范围为任何其他值
或,所述命令检查的范围删除孤立的数据。Shard A
cleanupOrphaned
startingFromKey: { x: -70 }
Chunk 1
Chunk 2
cleanupOrphaned
Chunk 3
{ x: 25 } --> { x: 175 }
如果为on ,则命令以或属于range for的任何其他值运行,该命令检查and 的组合连续范围,即删除孤立数据。Shard B
cleanupOrphaned
startingFromKey: { x: -70 }
Chunk 1
cleanupOrphaned
Chunk 1
Chunk 2
{
x: minKey } --> { x: 25 }
在运行该系统的系统上authorization
,您必须具有
clusterAdmin
运行权限cleanupOrphaned
。
每个cleanupOrphaned
命令都返回一个文档,其中包含以下字段的子集:
cleanupOrphaned.
ok
¶等于1
成功。
值1
表示已cleanupOrphaned
扫描指定的分片键范围,删除了该范围内的所有孤立文档,并确认所有删除均已复制到该分片副本集的大多数成员。如果确认未在1小时内到达,请cleanupOrphaned
超时。
值0
可能表示以下两种情况之一:
cleanupOrphaned
在分片上找到了孤立的文档,但无法删除它们。cleanupOrphaned
找到并删除了孤立的文档,但是在1小时超时之前无法确认复制。在这种情况下,确实会发生复制,但仅在cleanupOrphaned
返回之后才发生。cleanupOrphaned.
stoppedAtKey
¶分片键清除范围的上限。如果存在,则该值对应于分片上下一个块的下限。没有该字段表示清除范围是该碎片的最高范围。
以下示例cleanupOrphaned
直接在分片的主数据库上运行命令。
对于数据库中的分片集合info
,分片test
拥有范围为的单个块。{ x: MinKey } --> { x: 10 }
该分片还包含文档,这些文档的分片键值位于该分片不拥有的块的范围内:。{ x: 10 } --> { x: MaxKey
}
要删除该
范围内的孤立文档,您可以指定a ,该值属于该范围,如以下示例所示:{ x: 10 } => { x: MaxKey }
startingFromKey
或者,您可以指定一个startingFromKey
值,该值属于先前的范围,如下所示:
由于属于属于该碎片拥有的块的范围,因此在这种情况下,检查下一个范围以找到该碎片不拥有的范围。{ x: 2 }
cleanupOrphaned
{ x: 10 } => { x: MaxKey
}
cleanupOrphaned
从单个连续的分片键范围检查文档。要从分片中删除所有孤立文档,您可以cleanupOrphaned
循环运行,使用return stoppedAtKey
作为下一个startingFromKey
,如下所示: