分享

关于mongodb的片键问题

sc86272816 发表于 2013-10-17 21:36:44 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 6860
我现在已经做了4个shard,现在我有一个需要存储的数据对象,比较复杂,里面有list包含list那种。
我现在如果要设置片键,那么是不是可以直接
1:  db.runCommand({enablesharding:'dbname'})
2;  db.runCommand({shardcollection:'dbname.avmodel',key:{flightNo:1}})
解释一下:dbname数据库名,avmodel是collection名。而flightNo是我要存的对象里list下面list中的一个字段。。。。
这样虽然都一切正常,但是在插入数据后发现,数据库中没有数据。这事第一个问题。
于是,我删除所有数据库重来,不分配片键。在这种情况下,所有的数据只放在了其中的一个shard上,并且速度很慢。请问,是不是不设置片键,这数据不会主动分片存储在我的4个shard上?
              
               
               

已有(3)人评论

跳转到指定楼层
sc86272816 发表于 2013-10-17 21:37:35

            回去后好好想了想,突然明白了。说一下给后来人听
因为我的结构是里面直接一个list和一个对象,这样做片键因该是不行的,因为list是多个
本身mongodb就是要依据片键分配存储的范围,多个list就导致无法做,所以只有在最外层提供
片键。
至于不分配片键是否不会主动分片存储,我试了100W条数据存储,事实是如此,但是也可能是我的
配置有问题吧。
存储效率,10W条的时候1秒5000条,100W的时候1秒3000条
        
回复

使用道具 举报

u011235983 发表于 2013-10-17 21:38:35

            在分片集群里,如果数据库已经用sh.enableSharding("dbname")来启用分片的功能,但collection没有设置片键,那么这个集合所有的数据都只存放到一个叫做主分片(primary shard)的分片里,是不会自动分散到各个分片中的。我们可以用sh.status()来查看这个数据库的主分片。
比如下面的例子里test数据库启用了分片功能,sh.status()结果里的"primary" : "shard0000" 表明这个数据库的主分片是"shard0000"。
mongos> sh.enableSharding("test")
{ "ok" : 1 }
mongos> sh.status()
--- Sharding Status ---
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
        {  "_id" : "shard0000",  "host" : "localhost:40000" }
        {  "_id" : "shard0001",  "host" : "localhost:40001" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
        {  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }
        
回复

使用道具 举报

sc86272816 发表于 2013-10-17 21:39:05

            引用 2 楼 u011235983 的回复:在分片集群里,如果数据库已经用sh.enableSharding("dbname")来启用分片的功能,但collection没有设置片键,那么这个集合所有的数据都只存放到一个叫做主分片(primary shard)的分片里,是不会自动分散到各个分片中的。我们可以用sh.status()来查看这个数据库的主分片。
比如下面的例子里test数据库启用了分片功能,sh.status()结果里的"primary" : "shard0000" 表明这个数据库的主分片是"shard0000"。
mongos> sh.enableSharding("test")
{ "ok" : 1 }
mongos> sh.status()
--- Sharding Status ---
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
        {  "_id" : "shard0000",  "host" : "localhost:40000" }
        {  "_id" : "shard0001",  "host" : "localhost:40001" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
        {  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }

虽然之前就想明白了,不过还是谢谢你
        
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条