sh.shardAndDistributeCollection()
定义
sh.shardAndDistributeCollection(namespace, key, unique, options)
对集合进行分片,并立即使用提供的分分片键重新分发数据。 数据的立即重新分布可以加快数据移动速度,减少影响工作负载的影响。
重要
mongosh 方法
本页面提供
mongosh
方法的相关信息。这不是特定于语言的驱动程序(例如 Node.js)的文档。如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。
在
mongosh
中运行sh.shardAndDistributeCollection()
与连续运行shardCollection
和reshardCollection
命令具有相同的结果。
参数
sh.shardAndDistributeCollection()
使用以下参数:
Parameter | 类型 | 必要性 | 说明 |
---|---|---|---|
| 字符串 | 必需 | 要分片的集合的命名空间,格式为 |
| 文档 | 必需 | |
| 布尔 | Optional | 指定 使用哈希分片键时,不能指定 |
| 文档 | Optional | 包含可选字段的文档,其中包括 |
options
参数支持以下选项:
Parameter | 类型 | 说明 |
---|---|---|
| 整型 | 指定对集合进行分片和重新分片时要在集群中所有分片上创建的初始数据段数。 然后, MongoDB在集群中创建并均衡数据段。 |
| 文档 | 如果指定给 |
| 布尔 | |
| 文档 |
Considerations
以下因素可能会影响性能或数据分布。
分片键
虽然您可以稍后更改分片键,但请仔细考虑分分片键的选择,以优化可扩展性和性能。
时间序列集合上的分片键
对时间序列集合进行分片时,您只能为分片键指定以下字段:
使用
metaField
子字段
metaField
使用
timeField
您可以在分片键中指定这些字段的组合。不允许在分片键模式中使用任何其他字段,包括 _id
。
在您指定分片键时:
提示
避免仅指定 timeField
作为分片键。由于 timeField
是单调增加的,因此,可能导致所有写入都出现在集群中的单个数据段上。理想情况下,数据均匀分布在数据段之间。
要了解如何最好地选择分片键,请参阅:
哈希分片键
要指定哈希分片键字段,请使用field: "hashed"
。
注意
如果在创建哈希分片键集合时正在进行块迁移,则初始块分布可能会不均匀,直到负载均衡器自动平衡集合。
区域分片和初始数据块分布
分片集合操作(即 如果已为集合定义shardCollection
区域和区域范围sh.shardCollection()
,则 命令和 辅助程序)可以为空集合或不存在的集合执行初始数据数据块创建和分配。初始数据块分布可以更快地设置分区分片。 初始分配后,负载均衡器将数据块管理未来的数据段分配。
有关示例,请参阅为空集合或不存在的集合预定义区域和区域范围。 如果使用范围或单字段哈希分片键分片键对集合进行分片,并且已为集合定义了区域和区域范围,则numInitialChunks
选项不起作用。
要使用复合哈希索引分片集合进行分片,请参阅使用复合哈希索引进行初始数据段分布。
使用复合哈希索引进行初始数据段分发
MongoDB 支持使用组合哈希索引对集合进行分片。在使用组合哈希分片键对空集合或不存在的集合进行分片时,需要满足额外的要求,MongoDB 才能执行初始数据块创建和分配。
如果已为空集合定义区域和区域范围且集合为false
,则numInitialChunks
选项不起作用。
有关示例,请参阅为空集合或不存在的集合预定义区域和区域范围。
唯一性
如果指定unique: true
,则必须在使用sh.shardAndDistributeCollection()
之前创建索引。
虽然可以具有以分分片键为 前缀 的唯一 复合索引 ,但如果使用unique
参数,则集合必须具有基于分分片键的唯一索引。
排序规则
如果集合具有默认排序规则,则sh.shardAndDistributeCollection
命令必须包含值为{ locale: "simple" }
的collation
参数。 对于具有默认排序规则的非空集合,您必须至少拥有一个具有简单排序规则且其字段支持分分片键模式的索引。
无需为没有排序规则的集合指定 collation
选项。如果确实为没有排序规则的集合指定了排序规则选项,则它将不起作用。
写关注
mongos
使用"majority"
作为 命令、其助手shardCollection
sh.shardCollection()
和 方法的 写关注(writesh.shardAndDistributeCollection()
concern) 。
示例
以下示例展示了如何使用带或不带可选参数的sh.shardAndDistributeCollection()
方法。
简易用法
名为records
的数据库包含名为people
的集合。 以下命令按zipcode
字段对集合进行分片,并立即重新分布records.people
集合中的数据:
sh.shardAndDistributeCollection("records.people", { zipcode: 1 } )
用法以及选项
phonebook
数据库有一个没有默认排序规则的contacts
集合。 以下示例使用sh.shardAndDistributeCollection()
对phonebook.contacts
集合进行分片和重新分发:
last_name
字段上的哈希分分片键。5
初始数据段。simple
排序规则。
sh.shardAndDistributeCollection( "phonebook.contacts", { last_name: "hashed" }, false, { numInitialChunks: 5, collation: { locale: "simple" } } )