Shard Keys
Shard Key决定集合中文档在shard集群中的分布。Shard key是存在于集合每一个文档中单个或组合的索引字段。
MongoDB使用shard key值的区间,对集合中的数据进行分区。每一个区间都对应相互不重叠的shar key值的范围,并与一个数据块(chunk)进行关联。
MongoDB试图在分片集群之间,均匀的分布chunk。Shard key直接决定了数据块的分布效果。参见:123
!important: 一旦你分片一个集合,shard key和shard key的值就不可以再改变
- 你不可以设置其它的shard key
- 也不可以更新shard key字段的值
Shard Key指定(Shard key Specification)
为了分片一个集合,你可以使用sh.shardCollection()
方法,并指定目标的集合和Shard Key:
sh.shardCollection( namespace, key )
namespance
参数由目标集合的全名字符串组合,格式为<database>.<collection>
key
参数由文档中的一个索引字段组成
有关使用hash分片策略,请查阅Shard a Collection using Hashed Sharding
有关使用randed分片策略,请查询Shard a Collection using Randed Sharding
Shard Key索引
所有的分片集合都必须拥有至少一个索引来支持shard key;可以使用一个单独的索引字段来作为Shard key,也可以使用一个组合索引的前面的部分来作为索引。
- 如果集合为空,当
sh.shardCollection()
方法指定的shard key索引不存在时,将自动创建它。 - 如果集合不为空时,在使用
sh.shardCollection()
方法前,你必须为shard key创建索引
如果删除了最后有效的索引,重建索引将恢复分片。
唯一索引
一个分片集合,仅_id
字段和用于shard key的索引或者锁前面部分用于shard key的组合索引可以设置为唯一:
- 无法在拥有其它唯一索引的集合上创建分片
- 也无法在分片集合上创建其它的唯一索引
通过使用分片键上的唯一索引,MongoDB可以在分片键值上强制执行唯一性。MongoDB在整个组合键上强制执行唯一性,而不是在shard key的单个个体上。可以在sh.shardCollection()
方法中给unique
参数指定true
值,来为shard key的值指定强制唯一性:
- 如果集合为空,并且唯一索引不存在时,
sh.shardCollection()
方法将为shard key创建唯一集合 - 如果集合不为空,你必须在执行
sh.shardCollection()
方法之前,创建索引
Choosing a Shard Key
Shard key选择,将决定分片集群均衡器的创建(sharded cluster balancer)和数据快在分片中的分布。将会影响整体的效率和操作的性能。
Shard Key使用的分片策略,也会影响效率和性能。
理想状态下,shard key允许MongoDB在集群之间均匀的分布数据。
At minimum, consider the consequences of the cardinality, frequency, and rate of change of a potential shard key. 创建shard key时,至少需从分片的基数、频率和变化的后果来进行考虑。
限制Restrictions