Mongodb 碎片在集群中并不均衡

Mongodb 碎片在集群中并不均衡,mongodb,sharding,Mongodb,Sharding,我有两块碎片。 一个在独立服务器上,另一个在复制集上: mongos> db.runCommand({listshards:1}) { "shards" : [ { "_id" : "shard0000", "host" : "mongo3:10001" }, { "_id" : "set1",

我有两块碎片。 一个在独立服务器上,另一个在复制集上:

mongos> db.runCommand({listshards:1})
{
        "shards" : [
            {
                "_id" : "shard0000",
                "host" : "mongo3:10001"
            },
            {
                "_id" : "set1",
                "host" : "set1/mongo1:10001,mongo2:10001"
            }
        ],
        "ok" : 1
}
我插入了大约3000万张唱片

据我所知,mongo应该平衡碎片之间的数据,但事实并非如此:

mongos> db.stats()
{
    "raw" : {
        "set1/mongo1:10001,mongo2:10001" : {
            "db" : "my_ginger",
            "collections" : 3,
            "objects" : 5308714,
            "avgObjSize" : 811.9953284354742,
            "dataSize" : 4310650968,
            "storageSize" : 4707774464,
            "numExtents" : 23,
            "indexes" : 2,
            "indexSize" : 421252048,
            "fileSize" : 10666115072,
            "nsSizeMB" : 16,
            "ok" : 1
        },
        "mongo3:10001" : {
            "db" : "my_ginger",
            "collections" : 6,
            "objects" : 25162626,
            "avgObjSize" : 1081.6777010475776,
            "dataSize" : 27217851444,
            "storageSize" : 28086624096,
            "numExtents" : 38,
            "indexes" : 6,
            "indexSize" : 1903266512,
            "fileSize" : 34276900864,
            "nsSizeMB" : 16,
            "ok" : 1
        }
    },
    "objects" : 30471340,
    "avgObjSize" : 1034.6936633571088,
    "dataSize" : 31528502412,
    "storageSize" : 32794398560,
    "numExtents" : 61,
    "indexes" : 8,
    "indexSize" : 2324518560,
    "fileSize" : 44943015936,
    "ok" : 1
}
我做错了什么


谢谢。

根据注释中的
sh.status()
输出,shard0000(单个主机)上有164个块,set1(副本集)上有85个块。出现这种不平衡的原因有两个:

  • 您选择了错误的切分关键点(单调递增或类似)
  • 您的所有数据最初都在单个碎片上,并且正在重新平衡
  • 平衡器将不断尝试将块从高切分移动到低切分,同时移动最大块(对于选择上述单调递增键的人,这会有所帮助)。但是,一次只能进行一次迁移,因此这需要一些时间,特别是如果您同时继续从碎片中写入/读取。如果情况真的很糟糕,并且您选择了一个糟糕的切分键,那么这种情况可能会持续一段时间

    如果您的所有数据首先在一个碎片上,然后您添加了另一个碎片,那么您也会遇到类似的问题—区块数需要一段时间才能稳定下来,因为必须将一半数据从原始碎片上移动(除了它的其他活动外),以平衡数据。平衡器通常会首先选择较低范围的块进行移动,因此如果这些块不太可能在内存中(再次返回到较差的切分键),则必须先将它们分页,然后才能进行迁移

    要检查平衡器是否正在运行,请执行以下操作:

    然后,连接到mongos(最后10个操作),查看它在做什么:


    同样,如果您想查看其性能,您将在每个分片的主日志中看到与迁移相关的消息,以及迁移所需的时间等。

    似乎有3个未分片的集合。你在其中插入了很多文档吗?mongos的
    sh.status()
    的输出是什么?我有3个未归档的集合,但它们几乎是空的(40条记录)mongos>sh.status()---分片状态---分片版本:{“\u id”:1,“version”:3}分片:{“\u id”:“set1”,“host”:“set1/mongo1:10001,mongo2:10001”}{u-id:“shard0000”,“host:“mongo3:10001”}数据库:{u-id:“admin”,“partitioned”:false,“primary”:“config”}{u-id:“my\u-db”,“partitioned”:true,“primary”:“shard0000”}my_db.query_数据块:shard000164 set1 85要打印的块太多,如果要强制打印,请使用verbose,这样所有内容都将进入shard0000。您是如何创建以下shard-`{“\u id”:“set1”,“host”:“set1/mongo1:10001,mongo2:10001”}`您好。碎片键是随机生成的GUID。我刚刚运行了一个脚本,它创建了数百万个具有相同结构但不同GUID的条目。当您说“某个时间”时,它大约是什么时间?秒、小时、天、周?“某个时间”是各种因素的组合:内存中有多少数据(必须读入才能迁移),对于不在内存中的部分,可以以多快的速度从磁盘分页,集群上的负载(在源上读取和在目标上写入),每个区块有多少文档(每个文档基本上都插入到目标上),这些文档的大小,以及机器之间的网络速度(通常不是问题)。因此,一般情况下无法进行估计-在群集不太忙的情况下,估计速度也会更快。
    use config
    db.changelog.find().sort({$natural:-1}).limit(10).pretty()