清除jumbo
标记
在此页面上
如果MongoDB无法分割数据块指定范围大小的数据段,则MongoDB会将该数据段标记为数据块 。
以下过程概述了手动清除jumbo
标志的步骤。
步骤
可分割的数据块
清除数据块中jumbo
标志的首选手动方法是尝试分割数据块。如果数据块可分,则 MongoDB 会在成功分割数据块后删除该标志。
找到jumbo
数据段。
运行sh.status(true)
以查找标记为jumbo
的数据段。
sh.status(true)
例如,sh.status(true) 的以下输出显示分片键范围为{ "x" : 2 } -->> { "x" : 4 }
的数据块为jumbo
。
--- Sharding Status --- sharding version: { ... } shards: ... databases: ... test.foo shard key: { "x" : 1 } chunks: shard-b 2 shard-a 2 { "x" : { "$minKey" : 1 } } -->> { "x" : 1 } on : shard-b Timestamp(2, 0) { "x" : 1 } -->> { "x" : 2 } on : shard-a Timestamp(3, 1) { "x" : 2 } -->> { "x" : 4 } on : shard-a Timestamp(2, 2) jumbo { "x" : 4 } -->> { "x" : { "$maxKey" : 1 } } on : shard-b Timestamp(3, 0)
拆分jumbo
数据段。
使用sh.splitAt()
或sh.splitFind()
分割jumbo
数据段。
sh.splitAt( "test.foo", { x: 3 })
成功分割数据块后,MongoDB 会删除jumbo
标志。
不可分割的数据块
在某些情况下,MongoDB 无法分割不再是jumbo
的数据段,例如具有一系列单个分片键值的数据段。 因此,您无法分割数据段以清除标志。
在这种情况下,您可以更改分片键以使数据块可以整除,也可以手动清除该标志。
优化分片键
MongoDB提供了refineCollectionShardKey
命令。 使用refineCollectionShardKey
命令,您可以通过向现有分片键添加一个或多个后缀字段来优化集合的分片键。 通过向分分片键添加新字段,不可再分的巨型数据段可以变为可再分的。
找到jumbo
数据段。
运行sh.status(true)
以查找标记为jumbo
的数据段。
sh.status(true)
例如, sh.status(true)
的以下输出显示,对于分片collectiontest.orders
,分片键范围为{ "status" : "A" } -->> {
"status" : "D" }
的数据块和范围为{ "status" : "D" }
-->> { "status" : "P" }
的数据块均为jumbo
。
--- Sharding Status --- sharding version: { ... } shards: ... databases: ... test.orders shard key: { "status" : 1 } unique: false balancing: true chunks: shardA 2 shardB 2 { "status" : { "$minKey" : 1 } } -->> { "status" : "A" } on : shardB Timestamp(3, 0) { "status" : "A" } -->> { "status" : "D" } on : shardA Timestamp(5, 1) jumbo { "status" : "D" } -->> { "status" : "P" } on : shardA Timestamp(4, 2) jumbo { "status" : "P" } -->> { "status" : { "$maxKey" : 1 } } on : shardB Timestamp(5, 0)
优化test.orders
集合的分片键。
要解决键status
关联基数低的问题,请优化test.orders
集合的键。 例如,将order_id
和customer_id
字段作为后缀添加到当前分片键中;即优化后分片键将为{ status: 1, order_id: 1,
customer_id: 1 }
。
首先,如果索引尚不存在,则
create the index
支持分片键{ status: 1, order_id: 1, customer_id: 1 }
。db.orders.createIndex( { status: 1, order_id: 1, customer_id: 1 } ) 有关优化分片键的其他索引注意事项,请参阅索引注意事项。
在
admin
数据库中,运行refineCollectionShardKey
命令以将order_id
和customer_id
字段作为后缀添加到现有密钥:db.adminCommand( { refineCollectionShardKey: "test.orders", key: { status: 1, order_id: 1, customer_id: 1 } } )
refineCollectionShardKey
命令会更新数据块范围和区域范围以包含新字段,而无需修改现有键字段的范围值。也就是说,分片键的细化不会立即影响跨分片或区域的数据块分布。任何未来的数据块分割或迁移都会作为常规分片操作的一部分发生。
提示
优化分片键后,可能并非集合中的所有文档都具有后缀字段。要填充缺失的分片键字段,请参阅缺失的分片键字段。
在细化分片键之前,请确保集合中的所有或大多数文档都具有后缀字段(如果可能),以避免后期再填充字段。
手动清除不可分割数据段的jumbo
标志
要手动清除jumbo
标志,可以使用clearJumboFlag
命令。 如果清除仍然超过数据段大小的数据段的jumbo
标志,则当 MongoDB 尝试移动该数据段时,MongoDB 会将该数据段重新标记为jumbo
。
重要
仅当首选方法不适用时才使用此方法。
要手动清除该标志,请执行以下步骤:
找到jumbo
数据段。
运行sh.status(true)
以查找标记为jumbo
的数据段。
sh.status(true)
例如,sh.status(true) 的以下输出显示分片键范围为{ "x" : 2 } -->> { "x" : 3 }
的数据块为jumbo
。
--- Sharding Status --- sharding version: { ... } shards: ... databases: ... test.foo shard key: { "x" : 1 } chunks: shard-b 2 shard-a 2 { "x" : { "$minKey" : 1 } } -->> { "x" : 1 } on : shard-b Timestamp(2, 0) { "x" : 1 } -->> { "x" : 2 } on : shard-a Timestamp(3, 1) { "x" : 2 } -->> { "x" : 3 } on : shard-a Timestamp(2, 2) jumbo { "x" : 3 } -->> { "x" : { "$maxKey" : 1 } } on : shard-b Timestamp(3, 0)
运行clearJumboFlag
命令。
从admin
数据库运行clearJumboFlag
,传入分片collection的命名空间和以下任一项:
jumbo
数据块的边界:db.adminCommand( { clearJumboFlag: "test.foo", bounds: [{ "x" : 2 }, { "x" : 3 }] }) 查找文档,其分片键和值包含在
jumbo
数据块中:db.adminCommand( { clearJumboFlag: "test.foo", find: { "x" : 2 } }) 注意
如果collection使用哈希分片键,请勿将字段与
find
clearJumboFlag
一起使用。对于哈希分片键,请改用bounds
字段。