当前位置: 首页 > 知识库问答 >
问题:

分片的mongodb不会重新分配数据

施永宁
2023-03-14

我在localhost上设置了一个分片的mongo db环境,有3个配置服务器、2个分片的mongo实例和一个mongos。

集群启动后,我运行以下命令序列:

sh.addShard( "127.0.0.1:27010")
sh.addShard( "127.0.0.1:27011")

a = {"_id" : 1, "value" : 1}
b = {"_id" : 2, "value" : 2}
c = {"_id" : 3, "value" : 3}
d = {"_id" : 4, "value" : 4}

use foobar;
db.foo.insert(a);
db.foo.insert(b);
db.foo.insert(c);
db.foo.insert(d);

我启用数据库进行分片,并创建一个索引等。

sh.enableSharding("foobar");
db.foo.ensureIndex({"value":"hashed"});
sh.shardCollection("foobar.foo", { value: "hashed" } )

以上所有操作的结果都是成功的。

但是一旦我做到了:db.foo.stats()

我看到所有的数据都在一个分片中结束,而没有被分发。和运行

db.printShardingStatus();

生产:

--- Sharding Status --- 
sharding version: {
"_id" : 1,
"version" : 3,
"minCompatibleVersion" : 3,
"currentVersion" : 4,
"clusterId" : ObjectId("52170e8a7633066f09e0c9d3")
}
 shards:
{  "_id" : "shard0000",  "host" : "127.0.0.1:27010" }
{  "_id" : "shard0001",  "host" : "127.0.0.1:27011" }
 databases:
{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
{  "_id" : "foobar",  "partitioned" : true,  "primary" : "shard0000" }
    foobar.foo
        shard key: { "value" : "hashed" }
        chunks:
            shard0000   1
        { "value" : { "$minKey" : 1 } } -->> { "value" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) 

然而,有趣的是,如果我从一个空白集合开始,并在向其中添加任何数据之前对其启用分片,结果会非常不同:

db.foo.stats();
{
"sharded" : true,
"ns" : "foobar.foo",
"count" : 4,
"numExtents" : 2,
"size" : 144,
"storageSize" : 16384,
"totalIndexSize" : 32704,
"indexSizes" : {
    "_id_" : 16352,
    "value_hashed" : 16352
},
"avgObjSize" : 36,
"nindexes" : 2,
"nchunks" : 4,
"shards" : {
    "shard0000" : {
        "ns" : "foobar.foo",
        "count" : 1,
        "size" : 36,
        "avgObjSize" : 36,
        "storageSize" : 8192,
        "numExtents" : 1,
        "nindexes" : 2,
        "lastExtentSize" : 8192,
        "paddingFactor" : 1,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 16352,
        "indexSizes" : {
            "_id_" : 8176,
            "value_hashed" : 8176
        },
        "ok" : 1
    },
    "shard0001" : {
        "ns" : "foobar.foo",
        "count" : 3,
        "size" : 108,
        "avgObjSize" : 36,
        "storageSize" : 8192,
        "numExtents" : 1,
        "nindexes" : 2,
        "lastExtentSize" : 8192,
        "paddingFactor" : 1,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 16352,
        "indexSizes" : {
            "_id_" : 8176,
            "value_hashed" : 8176
        },
        "ok" : 1
    }
},
"ok" : 1
}

所以问题是,如果我分割现有的收藏,我是否错过了什么?

共有2个答案

祁曦哲
2023-03-14

目前您的数据集太小,以至于您只有1块数据。MongoDB将根据迁移阈值平衡您的数据-以便将平衡器的影响保持在最低限度。尝试添加更多数据:),平衡器会随着时间的推移拆分您的数据并平衡块。

如果集合中没有数据,每个碎片将被分配一定范围的块,这就是为什么在第二种情况下您会看到跨碎片的数据。

郭琨
2023-03-14

您需要键入db.collection。getShardDistribution()以查看块是如何被分割的。

mongos> db.people.getShardDistribution()
Shard S1 at S1/localhost:47017,localhost:47018,localhost:47019
 data : 32.37MiB docs : 479349 chunks : 1
 estimated data per chunk : 32.37MiB
 estimated docs per chunk : 479349
Shard foo at foo/localhost:27017,localhost:27018,localhost:27019
 data : 67.54MiB docs : 1000000 chunks : 2
 estimated data per chunk : 33.77MiB
 estimated docs per chunk : 500000
Totals
 data : 99.93MiB docs : 1479349 chunks : 3
 Shard S1 contains 32.4% data, 32.4% docs in cluster, avg obj size on shard : 70B
 Shard foo contains 67.59% data, 67.59% docs in cluster, avg obj size on shard : 70B

谢谢,内哈

 类似资料:
  • 我们有一个相对简单的分片MongoDB设置:4个分片,每个分片是一个副本集,至少有3个成员。每个集合都由从大量文件加载的数据组成;每个文件都被赋予一个单调递增的ID,并且根据ID的哈希完成分片。 我们的大部分产品都在按预期工作。然而,我有一个集合似乎没有正确地将块分布到各个碎片上。在创建索引之前,集合加载了大约30GB的数据,并且进行了分片,但是据我所知,这并不重要。以下是该集合的统计数据: 这个

  • 主要内容:MongoDB 中的分片,分片实例分片是跨多台机器存储数据的过程,它是 MongoDB 满足数据增长需求的方法。随着数据的不断增加,单台机器可能不足以存储全部数据,也无法提供足够的读写吞吐量。通过分片,您可以添加更多计算机来满足数据增长和读/写操作的需求。 为什么要分片? 在复制中,所有写操作都将转到主节点; 对延迟敏感的查询仍会转到主查询; 单个副本集限制为 12 个节点; 当活动数据集很大时,会出现内存不足; 本地磁盘不够大;

  • 问题内容: 我试图通过在会话中设置项目列表来将它们发送到JSP。我在这里使用Spring控制器。 会话对象包含所有三个项目。 问题: 预期: 会话对象应包含3个项目。 实际: 会话中只有2个项目可用,因为删除了第三个项目更新了会话对象。但是我从未将更新的l对象添加到会话中。为什么Java在返回页面之前重新分配会话对象?因此,我是否需要将l复制到另一个列表并使用它? 问题答案: 您必须首先了解Jav

  • 我在5台机器上安装了MongoDB 3.2.6,这些机器都形成了由2个碎片组成的碎片集群(每个碎片都是具有主次仲裁器配置的副本集)。 我还有一个数据库,其中包含非常大的集合(约50M记录,200GB),它是通过mongos导入的,mongos将其与其他集合一起放入主分片。 我在该集合上生成了散列ID,这将是我的分片密钥。 在thay之后,我用: 命令返回: 它开始碎裂。碎片的状态如下所示: 这一切

  • 本文向大家介绍MongoDB分片测试,包括了MongoDB分片测试的使用技巧和注意事项,需要的朋友参考一下 分片是mongoDB扩展的一种方式。分片分割一个collection并将不同的部分存储在不同的机器上。当一个数据库的collections相对于当前空间过大时,你需要增加一个新的机器。分片会自动的将collection数据分发到新的服务器上。 1. 连接到mongos可查看系统相关信息 2.

  • 出于某种原因,我使用Node编写的bot。和不和谐。当成员加入时,js不会将角色分配给他们。有人能帮忙吗? 我试过两种