本文档解决了有关MongoDB存储系统的常见问题。
压缩数据与未压缩数据的比率取决于您的数据和使用的压缩库。默认情况下,WiredTiger中的收集数据使用Snappy块压缩;还提供zlib 和zstd压缩。索引数据默认情况下使用 前缀压缩。
通过WiredTiger,MongoDB可以利用WiredTiger内部缓存和文件系统缓存。
从MongoDB 3.4开始,默认的WiredTiger内部缓存大小是以下两者中的较大者:
例如,在总共有4GB RAM的系统上,WiredTiger缓存将使用1.5GB RAM()。相反,总内存为1.25 GB的系统将为WiredTiger缓存分配256 MB,因为这是总RAM的一半以上减去1 GB()。0.5 * (4 GB - 1 GB) = 1.5 GB
0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB
注意
在某些情况下,例如在容器中运行时,数据库的内存限制可能低于系统总内存。在这种情况下,此内存限制而不是系统总内存将用作最大可用RAM。
要查看内存限制,请参阅hostInfo.system.memLimitMB
。
默认情况下,WiredTiger对所有集合使用Snappy块压缩,对所有索引使用前缀压缩。压缩默认值是可以在全局级别配置的,也可以在收集和索引创建期间基于每个集合和每个索引进行设置。
WiredTiger内部缓存中的数据与磁盘格式使用不同的表示形式:
通过文件系统缓存,MongoDB自动使用WiredTiger缓存或其他进程未使用的所有可用内存。
要调整WiredTiger内部缓存的大小,请参阅
storage.wiredTiger.engineConfig.cacheSizeGB
和
--wiredTigerCacheSizeGB
。避免将WiredTiger内部缓存的大小增加到其默认值以上。
注意
该storage.wiredTiger.engineConfig.cacheSizeGB
限制WiredTiger内部高速缓存的大小。操作系统将使用可用的空闲内存进行文件系统缓存,从而允许压缩的MongoDB数据文件保留在内存中。此外,操作系统将使用任何可用的RAM来缓冲文件系统块和文件系统缓存。
为了容纳更多的RAM使用者,您可能必须减小WiredTiger内部缓存的大小。
默认的WiredTiger内部缓存大小值假定mongod
每台计算机有一个实例。如果一台机器包含多个MongoDB实例,则应减小设置以容纳其他mongod
实例。
如果你运行mongod
在一个容器(例如lxc
,
cgroups
,Docker,等等),它没有访问所有系统中可用的RAM,你必须设置storage.wiredTiger.engineConfig.cacheSizeGB
的值小于RAM容器使用的量。确切的数量取决于容器中运行的其他进程。请参阅
memLimitMB
。
要查看有关高速缓存和逐出速率的统计信息,请参阅命令wiredTiger.cache
返回的
字段serverStatus
。
WiredTiger在以下任一情况下将缓冲的日记记录同步到磁盘:
对于副本集成员(主要和次要成员),
如果写操作包括或暗含的写关注点
。j: true
注意
写关注"majority"
暗示了如果真是真的。j: true
writeConcernMajorityJournalDefault
每100毫秒(请参阅storage.journal.commitIntervalMs
)。
WiredTiger创建新的日记文件时。由于MongoDB使用的日志文件大小限制为100 MB,因此WiredTiger大约每100 MB数据创建一个新的日志文件。
WiredTiger存储引擎在删除文档时会维护数据文件中的空记录列表。WiredTiger可以重用此空间,但是除非在非常特殊的情况下,否则不会将其返回给操作系统。
WiredTiger可以重用的可用空间量反映在db.collection.stats()
标题下的
输出中。wiredTiger.block-manager.file bytes available for reuse
为了使WiredTiger存储引擎将该空白空间释放给操作系统,可以对数据文件进行碎片整理。这可以使用compact
命令来实现。有关其行为和其他注意事项的更多信息,请参见compact
。
要查看集合的统计信息,包括数据大小,请使用
外壳程序中的db.collection.stats()
方法mongo
。下面的例子问题db.collection.stats()
的orders
集合:
MongoDB还提供以下方法来返回集合的特定大小:
db.collection.dataSize()
返回该集合的未压缩数据大小(以字节为单位)。db.collection.storageSize()
返回磁盘存储上集合的大小(以字节为单位)。如果集合数据被压缩(为),则存储大小将反映压缩后的大小,并且可能小于所返回的值
。default for WiredTiger
db.collection.dataSize()
db.collection.totalIndexSize()
返回以字节为单位的索引大小。如果索引使用前缀压缩(即),则返回的大小将反映压缩后的大小。default for WiredTiger
以下脚本打印每个数据库的统计信息:
以下脚本打印每个数据库中每个集合的统计信息:
若要查看为每个索引分配的数据大小,请使用
db.collection.stats()
方法并检查indexSizes
返回文档中的
字段。
如果索引使用前缀压缩(即),则该索引的返回大小将反映压缩后的大小。default for
WiredTiger
Shell中的db.stats()
方法mongo
返回“活动”数据库的当前状态。有关返回的字段的描述,请参见dbStats Output。