在MongoDB中切分集合时,为什么我的数据目录如此大?
我正在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}
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来减少这种情况
由于您拥有的数据量非常小,因此开销很大,但随着数据的增长,这种开销将非常小
块分割是使用启发式算法先发制人地完成的,因此您将看到分割在块达到最大大小之前发生