MongoDB:其中一个分片不像其他分片那样平衡

时间:2016-03-31 15:59:23

标签: mongodb sharding

我的应用程序有一个分片群集设置,但遗憾的是其中一个分片占用了17 GB的数据大小,而其他分片的平均数据大小为3 GB。可能是什么问题?

10 shards

sh.status()给了我巨大的输出。在此处分享:https://www.dropbox.com/s/qqsucbm6q9egbhf/shard.txt?dl=0

我的错误收集分片详细信息如下。

mongos> db.MyCollection_1_100000.getShardDistribution()

Shard shard_0 at shard_0/mongo-11.2816.mongodbdns.com:270                                                                              

00,mongo-12.2816.mongodbdns.com:27000,mongo-13.2816.                                                                              mongodbdns.com:27000,mongo-3.2816.mongodbdns.com:27003
     data : 143.86MiB docs : 281828 chunks : 4
     estimated data per chunk : 35.96MiB
     estimated docs per chunk : 70457

    Shard shard_1 at shard_1/mongo-10.2816.mongodbdns.com:270                                                                              00,mongo-11.2816.mongodbdns.com:27002,mongo-19.2816.                                                                              mongodbdns.com:27001,mongo-9.2816.mongodbdns.com:27005
     data : 107.66MiB docs : 211180 chunks : 3
     estimated data per chunk : 35.88MiB
     estimated docs per chunk : 70393

    Shard shard_2 at shard_2/mongo-14.2816.mongodbdns.com:270                                                                              00,mongo-3.2816.mongodbdns.com:27000,mongo-4.2816.mo                                                                              ngodbdns.com:27000,mongo-6.2816.mongodbdns.com:27002
     data : 107.55MiB docs : 210916 chunks : 3
     estimated data per chunk : 35.85MiB
     estimated docs per chunk : 70305

    Shard shard_3 at shard_3/mongo-14.2816.mongodbdns.com:270                                                                              04,mongo-18.2816.mongodbdns.com:27002,mongo-6.2816.m                                                                              ongodbdns.com:27000,mongo-8.2816.mongodbdns.com:27000
     data : 107.99MiB docs : 211506 chunks : 3
     estimated data per chunk : 35.99MiB
     estimated docs per chunk : 70502

    Shard shard_4 at shard_4/mongo-12.2816.mongodbdns.com:270                                                                              01,mongo-13.2816.mongodbdns.com:27001,mongo-17.2816.                                                                              mongodbdns.com:27002,mongo-6.2816.mongodbdns.com:27003
     data : 107.92MiB docs : 211440 chunks : 3
     estimated data per chunk : 35.97MiB
     estimated docs per chunk : 70480

    Shard shard_5 at shard_5/mongo-17.2816.mongodbdns.com:270                                                                              01,mongo-18.2816.mongodbdns.com:27001,mongo-19.2816.                                                                              mongodbdns.com:27000
     data : 728.64MiB docs : 1423913 chunks : 4
     estimated data per chunk : 182.16MiB
     estimated docs per chunk : 355978

    Shard shard_6 at shard_6/mongo-10.2816.mongodbdns.com:270                                                                              01,mongo-14.2816.mongodbdns.com:27005,mongo-3.2816.m                                                                              ongodbdns.com:27001,mongo-8.2816.mongodbdns.com:27003
     data : 107.52MiB docs : 211169 chunks : 3
     estimated data per chunk : 35.84MiB
     estimated docs per chunk : 70389

    Shard shard_7 at shard_7/mongo-17.2816.mongodbdns.com:270                                                                              00,mongo-18.2816.mongodbdns.com:27000,mongo-19.2816.                                                                              mongodbdns.com:27003,mongo-9.2816.mongodbdns.com:27003
     data : 107.87MiB docs : 211499 chunks : 3
     estimated data per chunk : 35.95MiB
     estimated docs per chunk : 70499

    Shard shard_8 at shard_8/mongo-19.2816.mongodbdns.com:270                                                                              02,mongo-4.2816.mongodbdns.com:27002,mongo-8.2816.mo                                                                              ngodbdns.com:27001,mongo-9.2816.mongodbdns.com:27001
     data : 107.83MiB docs : 211154 chunks : 3
     estimated data per chunk : 35.94MiB
     estimated docs per chunk : 70384

    Shard shard_9 at shard_9/mongo-10.2816.mongodbdns.com:270                                                                              02,mongo-11.2816.mongodbdns.com:27003,mongo-12.2816.                                                                              mongodbdns.com:27002,mongo-13.2816.mongodbdns.com:27002
     data : 107.84MiB docs : 211483 chunks : 3
     estimated data per chunk : 35.94MiB
     estimated docs per chunk : 70494

    Totals
     data : 1.69GiB docs : 3396088 chunks : 32
     Shard shard_0 contains 8.29% data, 8.29% docs in cluster, avg obj size on shard :                                                                               535B
     Shard shard_1 contains 6.2% data, 6.21% docs in cluster, avg obj size on shard : 5                                                                              34B
     Shard shard_2 contains 6.2% data, 6.21% docs in cluster, avg obj size on shard : 5                                                                              34B
     Shard shard_3 contains 6.22% data, 6.22% docs in cluster, avg obj size on shard :                                                                               535B
     Shard shard_4 contains 6.22% data, 6.22% docs in cluster, avg obj size on shard :                                                                               535B
     Shard shard_5 contains 42% data, 41.92% docs in cluster, avg obj size on shard : 5                                                                              36B
     Shard shard_6 contains 6.19% data, 6.21% docs in cluster, avg obj size on shard :                                                                               533B
     Shard shard_7 contains 6.21% data, 6.22% docs in cluster, avg obj size on shard :                                                                               534B
     Shard shard_8 contains 6.21% data, 6.21% docs in cluster, avg obj size on shard :                                                                               535B
     Shard shard_9 contains 6.21% data, 6.22% docs in cluster, avg obj size on shard : 534B

我有150多个类似的集合,我按照user_id的

划分数据
e.g. MyCollection_1_100000
MyCollection_100001_200000
MyCollection_200001_300000

这里我将MyCollection_1_100000中用户ID的数据分为1到100000,其他集合也是如此

所有150+集合的分片键是序号,但它是hashed。通过以下方式应用

db.MyCollection_1_100000.ensureIndex({"column": "hashed"})
sh.shardCollection("dbName.MyCollection_1_100000", { "column": "hashed" })

请建议我采取纠正措施以消除不平衡的碎片问题。

1 个答案:

答案 0 :(得分:5)

非共享集合

Shard 5是群集中的主要分片,这意味着它将占用所有 unsharded 集合,因此会变得更大。你应该检查一下。请参阅here

Chunk Split

正如马库斯指出的那样,分配是通过块而不是文档来完成的。块可以长大到它们定义的块大小。当它们超过块大小时,它们被拆分并重新分配。在您的情况下,似乎至少有一个集合比其他所有分片都有1个额外的块。原因可能是块尚未达到它的块限制(检查db.settings.find( { _id:"chunksize" })默认大小为64MB,另请参阅here)或者块无法拆分,因为范围由块表示的不能自动进一步分割。您应该使用sh.status(true)命令检查范围(对于您发布的大输出中的某些集合,省略了范围的输出) 但是你可以split the chunk manuallydba forum还有一个很好的答案。

碎片键

如果您没有未加密的集合,则问题可能是分片键本身。 Mongo suggest使用具有高基数和高度随机性的分片键。在不知道列的值范围的情况下,我假设基数相当低(即1000列),比如说,时间戳(每个条目为1,构成很多不同的值)。

此外,数据应均匀分布。因此,假设您有10个可能的列。但是有更多条目具有列名称的特定值,所有条目都将写入同一个分片。例如

  • entries.count({column:" A"} = 10 - > shard 0
  • entries.count({column:" B"} = 10 - > shard 1
  • ...
  • entries.count({column:" F"} = 100 - > shard 5

sh.status()命令应该为您提供有关块的更多信息。

如果使用对象id或时间戳 - 这些值是单调递增的 - 将导致数据也被写入同一块。 所以Mongo建议使用复合键,这将导致更高的基数(field1的值范围,字段2的值范围)。在您的情况下,您可以将列名称与时间戳组合在一起。

但不管怎样,你当前的安装都没有运气,因为你不能change the shard key afterwards

数据库设计

您打印的详细输出也表示,您有几个具有相同架构或目的的dbs /集合,这些dbs /集合在我看来是一种手动分区。这有什么特别的原因吗?这可能会影响集群中数据的分布以及每个集合开始在主节点上填充。至少有一个集合在主服务器中只有一个块,有些总共有3或4个块,所有在主服务器上至少有一个块(即z_best_times_*)。 优选地,您应该只为一个目的使用单个集合,并且可能使用复合分片键(即,另外还有散列时间戳)。