我想知道MongoDB中集合最大的尺寸是多少。 在MongoDB的限制文档中提到,单个MMAPv1数据库的最大尺寸为32TB。
这意味着集合的最大尺寸是32TB吗? 如果我想在一个集合中存储超过32TB的数据,有什么解决方案吗?
理论上存在限制,如下所示,但即使最低界限也相当高。计算这些限制并不容易,但数量级应该足够了。
实际限制取决于一些因素,比如碎片名称的长度等(如果有几十万个,这些将汇总),但以下是带有真实数据的粗略计算。
每个碎片需要在配置数据库中占用一些空间,该数据库与其他任何数据库一样,在单台计算机或副本集上限制为32TB。我管理的服务器上,config.shards
中条目的平均大小为112个字节。此外,每个块需要大约250个字节的元数据信息。让我们假设块大小接近64MB。
每个服务器最多可以拥有500,000个碎片。500,000 * 250byte等于每个碎片的125MB的块信息。因此,如果我们把所有东西都最大化,那么每个碎片就有125,000112 MB的存储空间。将32TB除以该值可得出我们可以在集群中最多拥有略小于256,000个碎片。
每个碎片又可以容纳32TB的数据。256,000 * 32TB 等于8.19200 exabytes 或 8,192,000 terabytes。这将是我们示例的限制。
假设是8 exabytes。到目前为止,这可以轻松地转换为“足以实现所有实际目的”。给你一个印象:国会图书馆(可以说是世界上最大的图书馆之一)拥有的所有数据(包括音频、视频和数字资料)的估计大小约为20TB。你可以将其放入我们理论上的MongoDB集群中的400,000次。请注意,这是最大尺寸的下限,使用保守值。
现在来谈好处:WiredTiger存储引擎没有这个限制:数据库大小没有限制(因为可以使用无限数量的数据文件),所以我们可以有无限数量的分片。即使我们将这些碎片运行在mmapv1上,只有我们的配置服务器在WT上运行,a的大小也几乎是无限的 - 在64位系统上RAM的16.8M TB的限制可能会在某个地方引起问题,并导致config.shard
集合的索引被交换到磁盘上,从而使系统停滞。我只能猜测,因为我的计算器拒绝处理那个范围内的数字(而我太懒了,不想手工处理),但我估计在二位数yottabyte区域的限制和托管该限制所需的空间大约相当于德克萨斯州的大小。
不要担心在分片环境中的最大数据量。不管怎样,它绝对足够,即使采用最保守的方法也一样。使用分片,你就完成了。顺便说一下:即使32TB也是很多数据:我知道的大多数群集保存的数据都比这少,而且分片是因为IOPS和RAM利用率超过了单个节点的容量。