我想知道mongodb中集合的最大大小是多少。 在mongodb限制文档中,提到单个MMAPv1数据库的最大大小为32TB。
这意味着最大收集量是32TB? 如果我想在一个集合中存储超过32TB的解决方案是什么?
答案 0 :(得分:15)
有理论上的限制,正如我将在下面展示的那样,但即使下限也是漂亮高。要正确计算限值并不容易,但数量级应该足够了。
实际限制取决于一些事情,比如碎片名称的长度和相似之处(如果你有几十万个,总结一下),但这里是对现实生活数据的粗略计算。
每个分片在配置数据库中需要一些空间,在单个计算机或副本集中,它与任何其他数据库一样限制为32TB。在我管理的服务器上,config.shards
中条目的平均大小为112个字节。此外,每个块需要大约250个字节的元数据信息。让我们假设最佳块大小接近64MB。
每台服务器最多可以有500,000个块。每个分片的块信息500,000 * 250byte等于125MB。因此,根据每个碎片,如果我们将所有内容都排除在外,我们每个碎片的碎片数为125.000112 MB。将32TB除以该值表明我们可以在群集中最多略低于256,000个分片。
每个分片依次可以容纳32TB的数据。 256,000 * 32TB是8.19200艾字节或8,192,000太字节。这将是我们的例子的限制。
让我们说它是8艾字节。截至目前,这可以很容易地转化为“足够用于所有实际目的"”。给你一个印象:美国国会图书馆(可以说是世界上收藏规模最大的图书馆之一)所拥有的所有数据都包含大约20TB的估计数据大小,包括音频,视频和数字资料。你可以将它放入理论上的MongoDB集群大约400,000次。请注意,这是使用保守值的最大大小的下限。
现在有好处:WiredTiger存储引擎没有这个限制:数据库大小不受限制(因为对数据文件的使用数量没有限制),所以我们可以拥有无限数量的分片。即使我们在mmapv1上运行这些分片而在WT上只运行我们的配置服务器,但是a的大小几乎是无限的 - 64位系统上16.8M TB RAM的限制可能会在某处导致问题并导致{{的索引1}}要交换到磁盘的集合,拖延系统。我只能猜测,因为我的计算器拒绝使用该区域的数字(而且我懒得手工完成),但我估计这里的两位数yottabyte区域的限制(以及在某处托管的空间)在德克萨斯州的大小。)
不要担心分片环境中的最大数据大小。无论如何,即使采用最保守的方法也是如此。使用分片,你就完成了。顺便说一句:即使32TB也是一大堆数据:我知道的大多数集群都拥有较少的数据和分片,因为IOPS和RAM利用率超过了单个节点的容量。