MongoDB–数据分发的三种方式
数据的分发是依据指定的片键进行的
1. 升序片键
升序片键是一种稳定增长的片键,例如date和ObjectId。如果依据升序片键分片,每一个插入的新文档都会插入到最大块中(就是包含maxKey的块)。
所有的写请求都会被路由到一个分片中,从该分片中不断的进行chunk的分裂和迁移,而不是只需要纠正比较小的均衡
2. 随机分发的片键
随机分发的键可以是用户名,邮件地址,UUID,MD5散列值,或者是数据集中其他没有规律的一些键。由于写入数据是随机分发的,个分片增长的速度应该是大致相同的,这就减少了需要进行迁移的次数
弊端是:MongoDB在随机访问超出RAM大小的数据的时候效率不高。如果有足够的RAM或者是不介意系统性能的话,可以使用随机片键在集群上分配负载
3. 基于位置的分片
数据会依据指定的位置(IP,经纬度,地址)分发,索引与该减值比较接近的文档都会被保存在同一个范围的块中。可以为分片添加tag,然后为块指定相应的tag。
//为指定分片打上一个标签,参数一:分片名;参数二:标签名
sh.addShardTag("shard1","AAA")
//在指定集合上,为标签指定范围,参数一:集合名;参数二:范围首,参数三:范围尾;参数四:标签名
sh.addTagRange("testdb.table1",{"_id":100},{"_id":200},"AAA")
balancer(均衡器)在移动块的时候,会试图将这些范围内的块移动到这些分片上,该过程不会立即生效。