大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

MongoDB学习笔记——Sharding

1、Sharding Key

Sharding key决定了shard在对document进行分发时的策略,它是由在目标collection中每个document中都存在的字段组成,当对非空collection进行分片时,collection必须有以sharding key开头的索引。

  1. Ranged Shard Key:根据 shard key 的取值,它把数据切分成连续的几个区间。取值相近的纪录会放进同一个 shard 服务器。好处是查询连续取值纪录时,查询效率可以得到保证。当数据库查询语句发送到 mongos 中时,mongos 会很快的找到目标 shard,而且不需要将语句发送到所有的 shard 上,一般只需要少量的 shard 就可以完成查询操作。缺点是不能保证数据的平均分配,在数据插入和修改时会产生比较严重的性能瓶颈。
  2. Hashed Shard Key:与Ranged Shard Key 对应的一种被称之为 Hashed Shard Key,它采用字段的索引哈希值作为 shard key 的取值,这样做可以保证数据的均匀分布。在 mongos 和各个 shard 集群之间存在一个哈希值计算方法,所有的数据在迁移时都是根据这个方法来计算数据应当被迁移到什么地方。当 mongos 接收到一条语句时,通常他会把这条语句广播到所有的 shard 上去执行。

选择字段作为sharding key时,应该考虑该字段一下几个参数:

  1. Cardinality(基数):该字段的基数范围,可以理解为该字段可能出现的值的个数。选择尽量大基数的字段,这样才可能尽量多的分发到多个chuank(如果基数为5,只可能分发到5个chuank,也就最多分发到5个shard中),更好地在shard间进行chuank迁移。如果非要使用低基数字段作为key,可以考虑加入大基数字段作为复合索引。
  2. Frequency(频率):该字段有多少相同值得记录。由于相同值得key只能被分发到同一个chuank中,所以如果一个有一些值得频率过高的话就会形成junbo chuank(巨型块),不可切分,严重影响水平扩展。如果非要用频率高的字段,可以考虑加入低频值的字段作为复合索引。
  3. Monotonically(单调性):该字段是否单调增长或减小。在使用ranged key时,尽量不要取单调性的字段,不然后加入的数据只会往最后或者最前的shard中插入,不断增大边缘shard的大小。因此尽量使用hashed sharding。