shardCollection
定义
shardCollection
对集合进行分片以跨分片分发其文档。必须先对数据库运行
enableSharding
,然后才能运行shardCollection
命令。shardCollection
命令必须针对admin
数据库运行。要运行
shardCollection
,请使用db.runCommand( { <command> } )
方法。提示
在
mongosh
中,该命令也可通过sh.shardCollection()
辅助方法运行。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。shardCollection
采用以下形式:{ shardCollection: "<database>.<collection>", key: { <field1>: <1|"hashed">, ... }, unique: <boolean>, numInitialChunks: <integer>, presplitHashedZones: <boolean>, collation: { locale: "simple" } } shardCollection
有以下字段:字段类型说明shardCollection
字符串要分片的集合的命名空间,格式为<database>.<collection>
。key
文档unique
布尔指定
true
以确保基础索引执行唯一约束。默认值为false
。使用哈希分片键时,不能指定
true
。numInitialChunks
整型指定在使用哈希分片键对空集合进行分片时,要在集群中所有分片上创建的数据段初始数量。然后,MongoDB 在集群中创建并均衡数据段。
numInitialChunks
的结果必须少于每个分片的8192
。如果集合不为空或分片键不包含哈希字段,则操作将返回错误。
如果使用 presplitHashedZones: true 进行分片,MongoDB 会尝试将指定数量的数据块平均分配到集群中的各区域。
如果使用 presplitHashedZones: false 进行分片或省略分片,并且没有为空集合定义区域和区域范围,则 MongoDB 会尝试在集群中的分片上平均分配指定数量的数据块。
如果使用 presplitHashedZones: false 进行分片或省略分片,并且已为空集合定义了区域和区域范围,
numInitChunks
将不起作用。
collation
文档可选。如果指定给shardCollection
的集合具有默认排序规则,则必须包含附带{ locale : "simple" }
的排序规则文档,否则shardCollection
命令将失败。对于其字段支持分片键模式的索引,必须至少有一个索引采用简易排序规则。布尔
注意事项
使用
不要同时对同一集合运行多个 shardCollection
命令。
集合被分片后,MongoDB 就不再提供对分片集合进行取消分片的方法。
分片键
虽然您可在后续更改分片键,但请务必仔细考虑分片键的选择,以免出现可扩展性与性能问题。
哈希分片键
使用表单 field: "hashed"
指定哈希分片键字段。
注意
如果在创建哈希分片键集合时正在进行块迁移,则初始块分布可能会不均匀,直到负载均衡器自动平衡集合。
区域分片和初始数据块分布
分片集合操作(即shardCollection
命令和 sh.shardCollection()
辅助程序)可以对空集合或不存在的集合执行初始数据块创建和分发,前提是已为该集合定义区域和区域范围)。初始数据块分布允许更快地设置区域分片。在初始分布之后,负载均衡器将照例管理未来的数据块分布。
有关示例,请参阅为空集合或不存在的集合预先定义区域和区域范围。如果使用范围或单字段哈希分片键对集合进行分片,并且已为空集合定义了区域和区域范围,则 numInitialChunks
选项将不起作用。
要使用复合哈希索引对集合进行分片,请参阅区域分片和复合哈希索引。
区域分片和复合哈希索引
MongoDB 支持使用组合哈希索引对集合进行分片。在使用组合哈希分片键对空集合或不存在的集合进行分片时,需要满足额外的要求,MongoDB 才能执行初始数据块创建和分配。
如果已为空集合定义区域和区域范围且 presplitHashedZones 为 false
,则 numInitialChunks
选项无效。
有关示例,请参阅为空集合或不存在的集合预先定义区域和区域范围。
唯一性
如果指定 unique: true
:
如果集合为空,
shardCollection
将在分片键上创建唯一索引(如果这样的索引尚不存在)。如果集合不为空,则必须先创建索引,然后才能使用
shardCollection
。
尽管可以有以分片键为前缀的唯一复合索引,但如果使用unique
参数,则集合必须在分片键上有唯一索引。
另请参阅分片集合和唯一索引
排序规则
已在 3.4 版本中更改。
如果集合有默认排序规则,则 shardCollection
命令必须包含值为 { locale: "simple" }
的 collation
参数。对于具有默认排序规则的非空集合,您必须至少拥有一个具有简单排序规则且其字段支持分片键模式的索引。
无需为没有排序规则的集合指定 collation
选项。如果确实为没有排序规则的集合指定了排序规则选项,则它将不起作用。
写关注
mongos
使用 "majority"
,执行 shardCollection
命令及其辅助函数 sh.shardCollection()
的写关注。
例子
以下操作为 records
数据库中的 people
集合启用分片并使用 zipcode
字段作为分片键:
db.adminCommand( { shardCollection: "records.people", key: { zipcode: 1 } } )