拆分
定义
split
将分 片集群 中的 数据段 拆分 为两个数据段。分片根据其维护的数据段大小统计信息管理和分割数据段。
在特殊情况下,
split
命令允许管理员手动创建分割。 有关这些情况以及包装 的 命令的信息,请参阅 在分片集群中分割MongoDBshellsplit
数据段。提示
在
mongosh
中,该命令也可以通过sh.splitAt()
和sh.splitFind()
辅助函数运行。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。split
命令必须在admin
数据库中运行并使用以下形式:db.adminCommand( { split: <database>.<collection>, <find|middle|bounds> } ) split
命令接受包含以下字段的文档:字段类型说明split
字符串find
文档一个在分片键上指定等值匹配的查询声明。匹配会选择包含指定文档的数据块。您只能指定以下内容之一:
find
、bounds
或middle
。不能在空collection上使用
find
选项。bounds
阵列2.4版本新增: 要分割的数据段的边界。
bounds
适用于使用哈希分片键分区的集合中的数据段。 该参数的数组必须由两个文档组成,这两个文档分别指定数据段的下限和上限分片键值。 这些值必须与现有数据段的最小值和最大值相匹配。 仅指定以下内容之一:find
、bounds
或middle
。不能在空collection上使用
bounds
选项。middle
文档
注意事项
与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
命令。