在MongoDB中切分集合时,为什么我的数据目录如此大?

在MongoDB中切分集合时,为什么我的数据目录如此大?,mongodb,database-migration,sharding,Mongodb,Database Migration,Sharding,我正在MongoDB中玩切分集合的游戏,并创建了一些脚本来设置副本集,将它们添加到切分,然后将这些切分添加到我的主mongos过程中 我用一个非常愚蠢的Python脚本生成数据: import json def gen_data(filename): with open(filename, 'w') as f: for i in range(100000*33): d = {"Hello": i, "World" : 99999-i}

我正在MongoDB中玩切分集合的游戏,并创建了一些脚本来设置副本集,将它们添加到切分,然后将这些切分添加到我的主
mongos
过程中

我用一个非常愚蠢的Python脚本生成数据:

import json

def gen_data(filename):
    with open(filename, 'w') as f:
        for i in range(100000*33):
            d = {"Hello": i, "World" : 99999-i}
            json.dump(d, f)
            f.write("\n")

if __name__ == "__main__":
    gen_data("my_data.json")
我创建了四个碎片(
a、b、c、d
),每个碎片有三个repl集(
0、1、2
)。数据目录称为a0、a1、a2、b0、b1、b2、c0、c1、c2、d0、d1、d2

在启用集合的分片后,我将块大小设置为100米,
“hello.world”
。我导入数据,在
“u id”
上建立索引,然后等待迁移

在我的平衡器完成运行后,我发现每个碎片中的块数几乎相等,但块数对于数据来说没有意义:

databases:
    {  "_id" : "hello",  "primary" : "a",  "partitioned" : true }
        hello.world
            shard key: { "_id" : 1 }
            unique: false
            balancing: true
            chunks:
                a   3
                b   3
                c   3
                d   2
//...
my_data.json
是118M,但是当我检查数据目录的大小时,我非常惊讶地发现它们都比原始数据大得多:

[erip@my_host shard_experiment]$ for s in {a..d}; do for n in {0..2}; do du -sh "$s$n"; done; done;
521M    a0
420M    a1
421M    a2
344M    b0
343M    b1
342M    b2
336M    c0
337M    c1
337M    c2
335M    d0
337M    d1
337M    d2
为什么我的数据目录这么大?我在设置碎片服务器时使用了
--smallfiles
,但是我发现导入的文档如此之小,会带来很大的开销。

请注意,
--smallfiles
选项仅适用于MMAPv1存储引擎,而不适用于WiredTiger存储引擎,后者是MongoDB 3.2中的默认设置

MongoDB可能会占用相当大的空间,每个节点可能占用300MB的空间。您可以通过运行以下操作来验证这一点:

find . -name "journal" -exec du -sh {} \;
此外,可能还使用了合理的空间量。您可以通过登录mongo shell中的一个副本集并运行
db.printReplicationInfo()
来检查正在使用的oplog大小。您可以通过在首次启动复制集时设置oplogSize来减少这种情况

由于您拥有的数据量非常小,因此开销很大,但随着数据的增长,这种开销将非常小

块分割是使用启发式算法先发制人地完成的,因此您将看到分割在块达到最大大小之前发生