拆分
定义
split
将分 分片集群 中的 数据段 数据块 为两个数据段。分片根据其维护的数据数据块大小统计信息管理和分割数据段。
在特殊情况下,
split
命令允许管理员手动创建分割。 有关这些情况以及包装 的 命令的信息,请参阅 在分片集群中分割MongoDBshellsplit
数据段。split
命令必须在admin
数据库中运行。提示
在
mongosh
中,该命令也可以通过sh.splitAt()
和sh.splitFind()
辅助函数运行。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
无服务器实例不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
db.adminCommand( { split: <database>.<collection>, <find|middle|bounds> } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 |
---|---|---|
split | 字符串 | |
find | 文档 | 一个在分片键上指定等值匹配的查询声明。匹配会选择包含指定文档的数据块。您只能指定以下内容之一: 不能在空collection上使用 |
bounds | 阵列 |
不能在空collection上使用 |
middle | 文档 |
Considerations
与find
或bounds
选项一起使用时, split
命令会沿中位数分割数据段。 因此,该命令不能使用find
或bounds
选项来分割空数据段,因为空数据段没有中位数。
要在空数据段中创建分割,请将middle
选项与split
命令一起使用或使用sh.splitAt()
命令。
命令格式
要创建数据段分割,请连接到mongos
实例,并向admin
数据库发出以下命令:
db.adminCommand( { split: <database>.<collection>, find: <document> } )
或者:
db.adminCommand( { split: <database>.<collection>, middle: <document> } )
或者:
db.adminCommand( { split: <database>.<collection>, bounds: [ <lower>, <upper> ] } )
要为使用哈希分片键的collection创建分割,请使用bounds
参数。请勿将middle
参数用于此目的。
警告
在拆分分片collection中的数据以创建新数据块时要小心。当您对包含现有数据的collection进行分片时,MongoDB 会自动创建数据块以均匀分布collection。要在分片集群中有效分割数据,必须考虑数据块中的文档数量和平均文档大小,以创建统一的数据块大小。当数据块大小不规则时,分片可能具有相同数量的数据块,但数据大小差异很大。避免创建导致collection具有不同大小数据块的分割。
示例
下文将举例说明 split
命令。
分割数据块为二
db.adminCommand( { split : "test.people", find : { _id : 99 } } )
split
命令标识test
数据库的people
集合中包含与{
_id : 99 }
匹配的文档的数据段。 split
不要求存在匹配项来识别适当的数据段。 然后该命令将其拆分为两个大小相等的数据段。
注意
split
按范围(而不是大小)创建两个相等的数据段,并且不使用选定的点作为新数据段的边界。
定义任意分割点
要定义任意分割点,请使用以下形式:
db.adminCommand( { split : "test.people", middle : { _id : 99 } } )
split
命令标识test
数据库的people
集合中的数据段,该数据段将保存与查询{ _id : 99 }
匹配的文档。 split
不要求存在匹配项来识别适当的数据段。 然后,该命令将其拆分为两个数据段,并将匹配的文档作为其中一个拆分数据段的下限。
这种形式通常在预分片collection中的数据时使用。
使用哈希分片键的值分割数据块
此示例使用database的collection集合中的 哈希分片键 。userid
people
test
以下命令使用一个包含两个单字段文档的数组来表示哈希分片键的最小值和最大值,以分割数据段:
db.adminCommand( { split: "test.people", bounds : [ { userid: NumberLong("-5838464104018346494") }, { userid: NumberLong("-5557153028469814163") } ] } )
注意
MongoDB 使用64位NumberLong类型来表示哈希值。
使用sh.status()
查看分片键的现有边界。
元数据锁错误
如果另一个进程(例如负载均衡器进程)在split
运行时更改元数据,您可能会看到metadata lock error
。
errmsg: "The collection's metadata lock is already taken."
此消息表示分割失败,没有副作用。 重试split
命令。