碎片在群集中不是平衡的

时间:2012-10-16 08:56:06

标签: mongodb sharding

我有2个分片。 一个是在独立服务器上,另一个是复制副本:

mongos> db.runCommand({listshards:1})
{
        "shards" : [
            {
                "_id" : "shard0000",
                "host" : "mongo3:10001"
            },
            {
                "_id" : "set1",
                "host" : "set1/mongo1:10001,mongo2:10001"
            }
        ],
        "ok" : 1
}

我已经插入了大约30M的记录。

据我所知,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
}

我做错了什么?

感谢。

1 个答案:

答案 0 :(得分:3)

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

  1. 您选择了一个糟糕的分片键(单调增加或类似)
  2. 您的所有数据最初都在一个分片上并正在重新平衡
  3. 平衡器将不断尝试将块从高碎片移动到低碎片,同时移动max-chunk(对于选择上述单调增加键的人来说,这有帮助)。但是,当时只能进行一次迁移,因此这需要一些时间,特别是如果您同时继续从分片写入/读取。如果事情真的很糟糕,你确实选择了一个糟糕的分片键,那么这可能会持续一段时间。

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

    检查平衡器是否正在运行:

    http://docs.mongodb.org/manual/reference/method/sh.setBalancerState/#sh.getBalancerState

    然后,要查看它的内容,请连接到mongos(最近10次操作):

    use config
    db.changelog.find().sort({$natural:-1}).limit(10).pretty()
    

    同样,如果你想看到他们的表现,你会在每个分片的主要日志中看到与迁移有关的消息,他们花了多长时间等等。