当前位置: 首页 > 工具软件 > WiredTiger > 使用案例 >

WiredTiger存储引擎

娄建义
2023-12-01

什么是存储引擎?

存储引擎是数据库的一部分,负责管理如何在内存和磁盘上存储数据。许多数据库支持多个存储引擎,其中不同的引擎对特定工作负载的性能会更好。例如,一个存储引擎可能为读取繁重的工作负载提供更好的性能,另一个可能支持更高的写入操作吞吐量。

也可以看看 存储引擎

你可以在副本集中混用存储引擎吗?

可以。您可以拥有使用不同存储引擎的副本集成员。

注意
MongoDB 4.0不推荐使用MMAPv1存储引擎。

在设计这些多存储引擎部署时,请考虑以下事项:
每个成员上的oplog可能需要设置不同的大小来负责不同存储引擎之间的吞吐量差异。
如果备份是以从MongoDB快照数据文件的方式,那么备份恢复可能会变得更加复杂:您可能需要维护每个存储引擎的备份。

WiredTiger存储引擎

我可以将现有部署升级到WiredTiger吗?

可以。参考:
将单机部署的存储引擎更改为WiredTiger
将副本集的存储引擎更改为WiredTiger
将分片集群的存储引擎更改为WiredTiger

WiredTiger提供的压缩比率是多少?

压缩数据与未压缩数据的比率取决于您的数据和使用的压缩算法库。默认情况下,WiredTiger中的集合数据使用Snappy块压缩 ;也可以使用 zlib 压缩。索引数据默认使用前缀压缩。

我应该将WiredTiger内部缓存设置为多大?

使用WiredTiger,MongoDB同时使用WiredTiger内部缓存和文件系统缓存。

从MongoDB 3.4开始,默认的WiredTiger内部缓存大小是以下两者中的较大者:
- 50%(内存大小 – 1 GB),或
- 256 MB。

例如,在总共4GB 内存的系统上,WiredTiger缓存将使用1.5GB的内存(0.5* (4 GB – 1 GB) = 1.5 GB)。相反,具有总共1.25 GB 内存的系统将为WiredTiger缓存分配256 MB,因为这超过总内存的一半减去1GB字节(0.5 *(1.25 GB – 1 GB) = 128 MB < 256 MB)。

默认情况下,WiredTiger对所有集合使用Snappy块压缩,对所有索引使用前缀压缩。压缩默认设置可在全局级别配置,也可在每个集合和每个索引创建期间单独进行设置。

WiredTiger内部缓存中的数据与磁盘上的数据使用不同表示形式的数据格式:

  • 文件系统缓存中的数据与磁盘格式相同,包括对数据文件进行的任何压缩的好处也是一样的。操作系统使用文件系统缓存来减少磁盘I / O.
  • 在WiredTiger内部缓存中加载的索引具有与磁盘格式不同的数据表示,但仍可利用索引前缀压缩来减少内存使用。索引前缀压缩从索引字段中去除重复的公共前缀。
  • WiredTiger内部缓存中的集合数据是未压缩的,并使用与磁盘格式不同的表示形式。块压缩可以节省大量的磁盘存储空间,但数据必须解压缩才能由服务器操作。

通过文件系统缓存,MongoDB自动使用WiredTiger缓存或其他进程未使用的所有可用内存。

要调整WiredTiger内部缓存的大小,请参阅 storage.wiredTiger.engineConfig.cacheSizeGB–wiredTigerCacheSizeGB。应当避免将WiredTiger内部缓存大小增加到其默认值以上。

注意
storage.wiredTiger.engineConfig.cacheSizeGB限制WiredTiger内部缓存的大小。操作系统将使用可用的空闲内存用于文件系统缓存,这允许压缩的MongoDB数据文件保留在内存中。此外,操作系统将使用任何空闲内存来缓冲文件系统块和文件系统缓存。

为了容纳其他的内存消费者,您可能必须减少WiredTiger内部缓存大小。

默认的WiredTiger内部缓存大小值假定每台计算机只有一个mongod实例。如果单个计算机包含多个MongoDB实例,则应减少该设置以适应其他mongod 实例。

如果您的mongod是运行在无法访问系统中所有可用内存 的容器(例如lxc, cgroups,Docker等)中时,则必须将storage.wiredTiger.engineConfig.cacheSizeGB设置为小于容器中可用内存大小的值。确切的大小取决于容器中运行的其他进程。

要查看有关缓存和缓存淘汰率的统计信息,请参阅从serverStatus命令返回的 wiredTiger.cache字段。

WiredTiger写入磁盘的频率如何?

Checkpoints(检查点)

从版本3.6开始,MongoDB配置WiredTiger以60秒的间隔创建checkpoints(即将快照数据写入磁盘)。在早期版本中,MongoDB在WiredTiger中以60秒的间隔设置检查点,或者在写入2 GB的预写日志(journal)数据时,以先发生者为准。

Journal Data(预写日志数据)

  • MongoDB根据以下间隔或条件写入磁盘:
  • MongoDB每50毫秒将缓冲的预写日志(journal)数据同步到磁盘(从MongoDB 3.2开始)
  • 如果写入操作包括写关注(write concern)的j参数:j: true,则WiredTiger强制同步WiredTiger日志文件。
  • 由于MongoDB使用的预写日志(journal)文件大小限制为100 MB,因此WiredTiger大约每100 MB数据创建一个新的日志文件。当WiredTiger创建新的日志文件时,WiredTiger会同步以前的日志文件。

如何在WiredTiger中回收磁盘空间?

WiredTiger存储引擎在删除文档时维护数据文件中的空记录列表。此空间可以由WiredTiger重用,但除非在非常特定的情况下,否则不会返回到操作系统。

可供WiredTiger重用的空白空间量反映在db.collection.stats()输出的wiredTiger.block-manager.file字段中(单位为字节)

要允许WiredTiger存储引擎将此空白空间释放到操作系统,您可以对数据文件进行碎片整理。这可以使用compact命令来实现。有关其行为和其他注意事项的更多信息,请参阅compact

数据存储诊断

如何查看集合的大小?

要查看集合的统计信息(包括数据大小),请使用mongo shell中的db.collection.stats()方法。以下示例为orders集合执行db.collection.stats():
复制
db.orders.stats ();

MongoDB还提供以下方法来返回集合的特定大小信息:
- db.collection.dataSize() 返回集合的未压缩数据大小(以字节为单位)。
- db.collection.storageSize()返回磁盘存储上集合的字节大小。如果集合数据被压缩(wiredTiger默认配置会压缩),则存储大小反映压缩大小,并且可能小于db.collection.dataSize()返回的值 。
- db.collection.totalIndexSize()返回集合的索引大小(以字节为单位)。如果索引使用前缀压缩(wiredTiger默认配置会对索引前缀压缩),则返回的大小反映压缩的大小。

以下脚本打印每个数据库的统计信息:

db.adminCommand("listDatabases").databases.forEach(function (d) {
mdb = db.getSiblingDB(d.name);
printjson(mdb.stats());})

以下脚本打印每个数据库中每个集合的统计信息:

db.adminCommand("listDatabases").databases.forEach(function (d) {
mdb = db.getSiblingDB(d.name);
mdb.getCollectionNames().forEach(function(c) {
s = mdb[c].stats();
printjson(s);
})})

如何检查集合的各个索引的大小?

要查看为每个索引分配的数据大小,请使用 db.collection.stats()方法并检查返回文档中的 indexSizes字段。

如果索引使用前缀压缩(wiredTiger默认配置会对索引前缀压缩),则该索引的返回大小反映压缩大小。

如何获取有关数据库存储使用的信息?

mongo shell中的db.stats()方法返回“活跃”数据库的当前状态。有关返回字段的说明,请参见 dbStats输出

 

 类似资料: