为什么查询路由器将所有数据存储在mongodb集群中?

时间:2016-03-14 07:33:38

标签: mongodb

我正在尝试设置mongodb群集,我有1个配置服务器,1个查询路由器和2个mongod实例。这是我设置集群的脚本

mongod --configsvr --port 27010 --dbpath ~/mongodb/data1
mongos -configdb localhost:27010 --port 27011 
mongod --port 27012 --dbpath ~/mongodb/data2 
mongod --port 27013 --dbpath ~/mongodb/data3 

sh.addShard("localhost:27012")
sh.addShard("localhost:27013")

sh.enableSharding("tags")
db.tweets.ensureIndex( { _id : "hashed" } )
sh.shardCollection("tags.tweets", { "_id": "hashed" } )

为了插入数据,我使用的是这个脚本

connection = pymongo.MongoClient("mongodb://localhost:27011")
db=connection.tags
tweets = db.tweets


def main(jsonfile):
    f = open(jsonfile)

    for line in f.readlines():
        try:
            tweet_dict = json.loads(line)
            result = tweets.insert_one(tweet_dict)
            print result.inserted_id
        except  Exception as e:
            print "Unexpected error:", type(e), e
            sys.exit()

为什么我试图插入的推文得到分片,我试图插入的所有推文也都存储在查询路由器中。预期会出现这种情况吗?

群集的整个点是水平可扩展性(即推文在机器之间分裂),所​​以所有推文在查询路由器中累积似乎都是反直觉的?

有人可以解释为什么会这样吗?为什么查询路由器包含我插入的所有推文?

1 个答案:

答案 0 :(得分:1)

你问为什么你插入的推文“也存储在查询路由器中”。简短的回答是每个文档的唯一副本存储在其中一个底层分片服务器上,查询路由器上没有任何内容。 mongos进程不是以--dbpath参数启动的,因此它无处存储数据。

我设置了一个与你类似的环境,然后我使用类似于你的python脚本连接到mongos(也就是查询路由器)并将200个文档插入tags.tweets。现在,当我连接到mongos并计算tags.tweets中的文档时,它会找到200.

$> mongo --port 27011 tags
mongos> db.tweets.count()
200

但是,当我运行getShardDistribution时,它会在第一个分片上显示docs 91,在第二个分片上显示docs 109个文档:

mongos> db.tweets.getShardDistribution()

 Shard shard0000 at localhost:27301
  data : 18KiB docs : 91 chunks : 2
  estimated data per chunk : 9KiB
  estimated docs per chunk : 45

 Shard shard0001 at localhost:27302
  data : 22KiB docs : 109 chunks : 2
  estimated data per chunk : 11KiB
  estimated docs per chunk : 54

 Totals
  data : 41KiB docs : 200 chunks : 4
  Shard shard0000 contains 45.41% data, 45.5% docs in cluster, avg obj size on shard : 210B
  Shard shard0001 contains 54.58% data, 54.5% docs in cluster, avg obj size on shard : 211B

查询路由器的工作原理是它将所有命令传递给底层分片服务器,然后在将结果返回给调用者之前组合它们的响应。上面返回的200的count()只是每个分片上完成的count()的总和。

有关在分片文档here中使用MongoDB分片进行水平可伸缩性的更多信息。您可能会发现section on metadata对您当前的问题有所帮助。