MongoDB分片群集如何在节点之间分配磁盘存储?

问题描述

我们通过以下设置成功创建了可正常使用的MongoDB集群:

  • 2个MongOS路由器
  • 2个复制的配置节点(元数据)
  • 6个非复制分片节点(有意无复制)

所有单独的实例在cpu,MEM,磁盘空间等方面都是相同的。

集群本身似乎运行良好。我们正在使用以下分片命令来分发分片:

sh.shardCollection("blockchains.ethereum_balance",{"dapp_id":"hashed"})
sh.shardCollection("blockchains.ethereum_daily",{"to":"hashed"})

但是,存储分布似乎不相等或至少没有效率:

mongodb_shards_disk_usage

问题:

  1. 如果添加新的分片,新节点是否从“较旧”的节点中获取一些信息? (“旧”碎片正在移动部分数据)
  2. 在这种情况下如何管理存储分配?

任何想法表示赞赏。

编辑:

似乎新创建的碎片仅占某些集合的一部分。自动迁移需要时间。

此外,索引仅保留一个分片。为了将Mongo的一些块移动到新创建的碎片索引中,索引也应位于目标碎片中。

解决方法

在分片群集中,您拥有Sharded Cluster Balancer,它可以确保均匀分布数据。默认情况下,您无需手动执行任何操作。

使用sh.status()db.ethereum_balance.getShardDistribution() / db.ethereum_daily.getShardDistribution()检查分片状态

也许您选择了较差的分片键,请参见Choosing a Shard Key。您的数据库中有大量未分片的集合吗?