分片数据相同[MongoDB]

时间:2016-08-20 20:13:18

标签: mongodb sharding

我正在尝试设置Sharding,所以我创建了:

  • 1个配置服务器,
  • 2 shard server
  • 和主服务器

以下是我的主服务器的sh.status输出:

mongos> sh.status();
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "version" : 4,
    "minCompatibleVersion" : 4,
    "currentVersion" : 5,
    "clusterId" : ObjectId("57b86fb87925691e5a11e35f")
}
  shards:
    {  "_id" : "shard0000",  "host" : "192.168.1.3:27018" }
    {  "_id" : "shard0001",  "host" : "192.168.1.4:27018" }
  databases:
    {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
    {  "_id" : "shardDB",  "partitioned" : true,  "primary" : "shard0000" }
        shardDB.user
            shard key: { "name" : 1 }
            chunks:
                shard0000   1
            { "name" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) 

所以我认为它有效,但我不确定它是否正常。

主机上的

shard0000数据块192.168.1.3:27018user主数据192.168.1.6:27020上的用户数据具有相同的db.users.find()数据,那样可以吗?< / p>

我认为重点是在不同的分片上有不同的数据,以减少主服务器的负载?

1 个答案:

答案 0 :(得分:3)

维拉德,

这是一个生产系统吗?如果是,则应该有3个配置服务器,每个分片应该是一个副本集,每个副本至少有3个mongod守护进程。您当前的设置对于dev来说没问题,但不应该在PROD中部署。

Look at this document to see the architecture.

mongos是路由器,而不是主机。即使您始终应该从mongos查询系统,数据实际上也存在于分片服务器中。同样,mongos只是一个路由器,当您的应用程序访问群集时,它会将您的查询发送到正确的位置。

您目前只在一个分片中看到数据的原因是您还没有足够的数据来分配两个分片。随着您的数据量的增长,MongoDB将自动化#34;创建新的&#34;数据块&#34;并将它们移动到新的分片以保持群集平衡。

我还注意到您使用时间戳作为分片键。使用时间作为分片键通常是一个糟糕的选择有两个原因:

  • LOADING - 如果要插入按时间顺序排列的数据或数据 对于最后一天(日/小时/分钟),所有插入都会相同 数据块,因此到同一个分片。那会 意味着无论数量多少,您的插入都不会缩放 您添加到群集的服务器。
  • 阅读 - 如果您的分片键是时间戳,并且您经常查询 按日,按周或按月收集您的阅读查询 将在任何时候播放给所有分片。这又会 即使您添加了更多服务器,也会导致系统无法扩展。

上面描述的问题只有在您的数据量和/或查询量增加时才会显示。

Look at this presentation, it gives good insight on how to model MongoDB collections for Time Series Data.