MongoDB 分片仅在一个实例上工作

MongoDB sharding working on only one instace

我在本地主机上用不同的端口创建了三个 mongodb 实例,例如

mongod.exe --config C:\MongoDB2.6\mongod.cfg

mongod.exe --config D:\MongoDB2.6\mongodinst1.cfg

mongod.exe --config E:\MongoDB2.6\mongodinst2.cfg

这 3 个正在成功实例化(运行 在端口 2021、2022、2023 上)。 现在我正在使用 mongos 命令对这三个实例进行集群,我的命令是这样的

mongos.exe --configdb 127.0.0.1:2021,127.0.0.1:2022,127.0.0.1:2023

正在成功同步三个 mongodb 实例。现在我连接到端口 27017 上的 mongos 实例并创建分片

 sh.addShard("127.0.0.1:2021")
 sh.addShard("127.0.0.1:2022")
 sh.addShard("127.0.0.1:2023")

这个过程也成功了。在此之后,在 mongos 实例 (27017) 上,我正在创建一个 db(myshard) 和 collection(mycoll)。

现在我向这个集合中插入数据:

db.myshard.insert([
...
{
   title: 'NoSQL Database', 
   description: 'NoSQL database doesn',
   by: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 20, 
   comments: [  
      {
         user:'user1',
         message: 'My first comment',
         dateCreated: new Date(2013,11,10,2,35),
         like: 0 
      }
   ]
},
...
])

现在它在我的一个实例 运行 上的端口 2021 上向我反映了这些值,但在 2022 和 2023 端口等其他实例上没有。

我是 mongodb 的新手,不明白为什么会这样。有人可以解释这种行为吗?

基本上这里发生的事情是分片集群根据您的分片键(默认为 _id)决定使用哪个分片。您不一定提前知道将使用哪个分片以及文档将存储在何处。

这个 "issue" 由 mongos 和配置服务器处理。配置服务器保存有关集群的元信息,例如,数据在分片集群中的位置。

为了利用分片机制,您的所有查询都应在 mongos shell 上执行。这是您可以用来从您的任何分片中提取任何数据的唯一方法。 mongos shell 将根据您的配置服务器包含的元信息查询您的数据库和集合。