sh.shardCollection()
在此页面上
定义
sh.shardCollection(namespace, key, unique, options)
使用
key
作为 分片键以对集合进行分片。分片键决定了 MongoDB 如何在各分片之间分发集合的文档。注意
在 6.0 版本中进行了更改。
从 MongoDB 6.0 开始,对集合分片无需首先运行
sh.enableSharding()
方法来配置数据库。重要
mongosh 方法
本页面提供
mongosh
方法的相关信息。这不是数据库命令或特定语言驱动程序(例如 Node.js)的相关文档。有关数据库命令,请参阅
shardCollection
命令。如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。
sh.shardCollection()
采用以下参数:Parameter类型说明namespace
字符串要分片的集合的命名空间,格式为"<database>.<collection>"
。key
文档unique
布尔可选。指定
true
以确保基础索引执行唯一约束。默认为false
。使用哈希分片键时,不能指定
true
。对于传统mongo shell ,如果指定
options
文档,则必须显式指定unique
的值。 当您指定options
文档时,mongosh
不需要unique
。options
文档可选。包含可选字段的文档,包括numInitialChunks
和collation
。options
参数支持以下选项:Parameter类型说明numInitialChunks
整型可选。指定使用哈希分片键对空集合进行分片时最初创建的最小数据段数。然后,MongoDB 在集群中创建并均衡数据段。
numInitialChunks
参数必须小于每个分片8192
个数据段。默认为每个分片2
个数据段。如果集合不为空或分片键不包含哈希字段,则操作将返回错误。
如果使用 presplitHashedZones: true 进行分片,MongoDB 会尝试将指定数量的数据块平均分配到集群中的各区域。
如果使用 presplitHashedZones: false 进行分片或省略分片,并且没有为空集合定义区域和区域范围,则 MongoDB 会尝试在集群中的分片上平均分配指定数量的数据块。
如果使用 presplitHashedZones: false 进行分片或省略分片,并且已为空集合定义了区域和区域范围,
numInitialChunks
将不起作用。
collation
文档可选。如果向shardCollection
指定的集合采用默认排序规则,则必须包含附带“{locale: "simple" }”的排序规则文档,否则shardCollection
命令将失败。对于其字段支持分片键模式的索引,必须至少有一个索引采用简易排序规则。布尔文档
时间序列选项
5.1 版本中的新功能。
要创建一个已分片的新时间序列集合,请将 timeseries 选项指定为 sh.shardCollection()
。
timeseries 选项包含以下字段:
字段 | 类型 | 说明 |
---|---|---|
timeField | 字符串 | 必需。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须具有有效 BSON 日期,以作为 |
metaField | 字符串 | 可选。包含每个时间序列文档中元数据的字段的名称。指定字段中的元数据应是用于标记一系列独一无二的文档的数据。元数据应该很少改变(如有)。指定字段的名称可能不是 虽然 |
granularity | 字符串 | 可选。可能的值为:
默认情况下,MongoDB 将 手动设置 如果您指定 如果未指定 如果设置了 |
Considerations
分片键
虽然您可在后续更改分片键,但请务必仔细考虑分片键的选择,以免出现可扩展性与性能问题。
时间序列集合上的分片键
对时间序列集合进行分片时,您只能为分片键指定以下字段:
使用
metaField
子字段
metaField
使用
timeField
您可以在分片键中指定这些字段的组合。不允许在分片键模式中使用任何其他字段,包括 _id
。
在您指定分片键时:
提示
避免仅指定 timeField
作为分片键。由于 timeField
是单调增加的,因此,可能导致所有写入都出现在集群中的单个数据段上。理想情况下,数据均匀分布在数据段之间。
要了解如何最好地选择分片键,请参阅:
哈希分片键
使用表单 field: "hashed"
指定哈希分片键字段。
注意
如果在创建哈希分片键集合时正在进行块迁移,则初始块分布可能会不均匀,直到负载均衡器自动平衡集合。
区域分片和初始数据块分布
分片集合操作(即shardCollection
命令和 sh.shardCollection()
辅助程序)可以对空集合或不存在的集合执行初始数据块创建和分发,前提是已为该集合定义区域和区域范围。初始数据块分布允许更快地设置区域分片。在初始分布之后,负载均衡器将照例管理未来的数据块分布。
有关示例,请参阅为空集合或不存在的集合预先定义区域和区域范围。如果使用范围或单字段哈希分片键对集合进行分片,并且已为空集合定义了区域和区域范围,则 numInitialChunks
选项将不起作用。
要使用复合哈希索引对集合进行分片,请参阅使用复合哈希索引进行初始数据块分发。
使用复合哈希索引进行初始数据段分发
MongoDB 支持使用组合哈希索引对集合进行分片。在使用组合哈希分片键对空集合或不存在的集合进行分片时,需要满足额外的要求,MongoDB 才能执行初始数据块创建和分配。
如果已为空集合定义区域和区域范围且 presplitHashedZones 为 false
,则 numInitialChunks
选项无效。
有关示例,请参阅为空集合或不存在的集合预先定义区域和区域范围。
唯一性
如果指定 unique: true
:
如果集合为空,
sh.shardCollection()
将在分片键上创建唯一索引(如果这样的索引尚不存在)。如果集合不为空,则必须先创建索引,然后才能使用
sh.shardCollection()
。
尽管可以有以分片键为前缀的唯一复合索引,但如果使用unique
参数,则集合必须在分片键上有唯一索引。
另请参阅分片集合和唯一索引
排序规则
如果集合有默认排序规则,则 sh.shardCollection()
命令必须包含值为 { locale: "simple" }
的 collation
参数。对于具有默认排序规则的非空集合,您必须至少拥有一个具有简单排序规则且其字段支持分片键模式的索引。
无需为没有排序规则的集合指定 collation
选项。如果确实为没有排序规则的集合指定了排序规则选项,则它将不起作用。
写关注
mongos
使用 "majority"
处理 shardCollection
命令、其助手 sh.shardCollection()
和 sh.shardAndDistributeCollection()
方法的写关注。
示例
简易用法
假设名为 records
的数据库中有一名为 people
的集合,以下命令将按 zipcode
字段对该集合进行分片:
sh.shardCollection("records.people", { zipcode: 1 } )
用法以及选项
phonebook
数据库包含一个没有默认排序规则的集合 contacts
。以下示例使用 sh.shardCollection()
对 phonebook.contacts
进行分片,详细信息如下:
针对
last_name
字段的哈希分片键、5
初始数据段以及simple
的排序规则。
sh.shardCollection( "phonebook.contacts", { last_name: "hashed" }, false, { numInitialChunks: 5, collation: { locale: "simple" } } )