基本概念
片键:mongo使用一个或者几个字段的组合来分发数据到分片的标准,一旦形成了多个分片,再修改片键是不可能的事情
随着分片的增加(成千上百个)不能做遍历所有分片才能返回的结果的操作(慢!)
分片的目的是通过增加并行性来提高mongo的吞吐量(每秒处理的IO),而不是为了降低延迟;当然也增加了数据的总存储量
数据分发
分片中的数据是以数据块chunk来管理的,块是随机分发到每个分片中;当某一片的chunk太多时,mongo平衡器会自动迁移数据块到其他的分片上,来保持每个分片数据块的基本平衡。mongo路由只需要管理请求到数据块的映射即可。
升序片键
以id大小有序的范围形成一个一个的数据块,且新的写请求都是路由到同一个分片的同一个数据块中(maxCurrentId-$maxKey数据块);mongo必须不断的才分这个不断膨胀的数据块,且迁移到其他分片中。
随机片键
以一种具有随机性的字段作为片键,电话、email、hash散列值等。这样写IO会比较均匀的路由到每个数据块;
片键策略
hash片键
Hashed shard keys use a hashed index of a field as the shard key to partition data across your sharded cluster
当集群使用片键分发数据时,hash片键使用的是字段的hash索引,所以先创建hash索引:
db.yourCollection.createIndex( { a: "hashed" } )
开启集合的hash分片
sh.shardCollection( "db.yourCollection", { a: "hashed" } )
对一个字段建立了hash索引后,还可以再建立普通的升序、降序的索引;使用范围比较的时候,mongo就会使用普通的索引
you can create both a hashed index and an ascending/descending (i.e. non-hashed) index on the same field: MongoDB will use the scalar index for range queries.