当前位置: 首页 > article >正文

【赵渝强老师】MongoDB的WiredTiger存储引擎

在这里插入图片描述

  WiredTiger提供文档级别(Document-Level)的并发控制,检查点(CheckPoint),数据压缩和本地数据加密( Native Encryption)等功能。从MongoDB 3.2 版本开始,WiredTiger成为MongDB默认的Storage Engine。

  视频讲解如下:

MongoDB的WiredTiger存储引擎

【赵渝强老师】MongoDB的WiredTiger存储引擎

  下面将详细讨论WiredTiger存储引擎的功能特性。

一、文档级别的并发控制

  MongoDB在执行写操作时,WiredTiger存储引擎会在文档级别进行并发控制。换句话说在同一时间点上,多个写操作能够修改同一个集合中的不同文档;而当多个写操作修改同一个文档时,必须以序列化方式执行。这意味着如果当前文档正在被修改,其他写操作必须等待该文档上的写操作完成之后才能进行修改。对于大部分的文档读写操作,WiredTiger引擎使用的都是乐观锁;而在数据库和集合级别,WiredTiger使用的是意向锁。当WiredTiger存储引擎探测到两个操作之间发生了冲突,将会产生一个写冲突并将会重新执行操作。下表列出了MongoDB的操作与产生的锁类型。
在这里插入图片描述

二、预先日志与检查点

  在MongoDB数据更新时,WiredTiger存储引擎使用预写日志的机制先将数据更新写入到Journal日志文件中。然后在创建检查点操作开始时,再将日志文件中记录的操作刷新到数据文件。换句话说,通过预写日志和检查点机制可以保证将数据更新持久化到数据文件中,并实现数据的一致性。
  在检查点(Checkpoint)操作开始时,WiredTiger存储引擎将提供指定时间点的数据库快照,该快照反映的是MongoDB当前内存中的数据情况。当向磁盘写入数据时,WiredTiger存储引擎将快照中的所有数据以一致性方式写入到MongoDB的数据文件上,并保证数据文件和内存数据是一致性的。由于检查点是定期执行,因此检查点操作能够缩短MongoDB从Journal日志文件恢复数据的时间。在默认情况下,WiredTiger存储引擎创建检查点的时间间隔是60秒或产生2GB的Journal日志信息文件。在WiredTiger存储引擎创建新的检查点期间,上一个检查点仍然是有效的。这意味着即使MongoDB在创建新的检查点期间遭遇到错误而异常终止运行,只要重启MongoDB就能从上一个有效的检查点开始恢复数据。当新的检查点创建成功后,WiredTiger存储引擎以原子方式更新元数据表使其引用新创建的检查点,同时会将老的检查点占用的磁盘空间释放。
  下图说明了MongoDB写入数据时,MongoDB的预写日志机制及与产生检查点操作之间的关系。
在这里插入图片描述

提示:当第(2)步完成时,写入的数据依然在内存缓冲区中。如果此时MongoDB发生了故障导致数据丢失,在重新启动时,WiredTiger存储引擎会使用Journal日志来恢复内存中的数据。

三、有效的内存使用

  WiredTiger存储引擎利用系统内存资源缓存两部分数据,它们分别是:

  • 内部缓存(Internal Cache)
  • 文件系统缓存(Filesystem Cache)
      
      在默认情况下,WiredTiger存储引擎将使用操作系统物理内存的一半来缓存数据。如果需要修改这个设置,可以通过使用参数–wiredTigerCacheSizeGB。另一方面要监控MongoDB的内存使用情况,可以使用db.serverStatus().mem命令进行查看。
scott@nosql11 2> db.serverStatus().mem

输出的信息如下:
{ "bits" : 64, "resident" : 68, "virtual" : 1561, "supported" : true }

其中:
resident:	代表物理存储使用的情况,单位是M。
virtual:	代表虚拟内存使用的情况。

四、数据压缩

  WiredTiger存储引擎支持对集合和索引进行压缩,以减少磁盘空间消耗。WiredTiger为集合提供三个压缩选项,它们分别是:

  • 无压缩
  • Snappy:默认启用的压缩方式,能够有效地利用资源。
  • zlib:类似gzip压缩,压缩比率高但需要占用更多CPU资源。

  WiredTiger存储引擎为索引提供了两个压缩选项,它们分别是:

  • 无压缩
  • 前缀:默认启用的压缩方式,能够有效地利用资源。
      
      对于大多数工作负载的情况,使用默认的压缩设置能够均衡数据存储的效率和处理数据的需求,即压缩和解压的处理速度都是非常高的。下面的示例将创建一个使用zlib压缩的集合:
db.createCollection("email",
                    {storageEngine: 
                       {wiredTiger:{configString: 'block_compressor=zlib'}}})

  如果想进一步测量压缩前后的大小,可以执行下面的语句。该语句将以字节为单位返回MongoDB中集合与索引的大小。

db.stats(1024*1024).dataSize + db.stats(1024*1024).indexSize

五、磁盘空间回收

  当从MongoDB中删除文档或者集合的时候,MongoDB不会立即将磁盘空间释放给操作系统。MongoDB会在数据文件中维护Empty Records的列表。当重新插入数据时,MongoDB会从Empty Records列表中分配存储空间给新的文档,而不需要重新开辟空间进而有效地重用磁盘空间,但这样的机制带来的一个问题就是会产生大量的磁盘碎片。因此WiredTiger存储引擎也支持使用compact命令整理数据碎片,并将没有使用的磁盘空间进行释放。该命令的语法格式如下:

db.runCommand ( { compact: '<collection>' } )

  例如下面的命令将释放scott数据库中员工集合没有使用的磁盘空间。

db.runCommand({compact:'emp'});

提示:在执行compact命令时,WiredTiger存储引擎会对当前的数据库进行加锁,以阻塞其他操作。在compact命令执行完成之后,WiredTiger存储引擎会重建集合的所有索引。


http://www.kler.cn/a/288042.html

相关文章:

  • (一)Ubuntu20.04服务器端部署Stable-Diffusion-webui AI绘画环境
  • 坚果云·无法连接服务器(无法同步)
  • Scala的Array
  • NFS-Ganesha 核心架构解读
  • 求A/B高精度值
  • nacos-operator在k8s集群上部署nacos-server2.4.3版本踩坑实录
  • C#Math计算的几个常用方法
  • Pandas 1- 创建文件
  • 关键点检测(6)——yolov8-neck的搭建
  • 微信小程序背景图无法显示
  • 2409d,d语言非常简单利用sqlite3库
  • 前端宝典二十六:vue3的新特性
  • 群晖NAS本地使用Docker搭建Home Assistant智能家居平台与远程访问
  • vue3的学习(1)
  • vscode安装rest client插件,提示XHR failed
  • 使用EF框架进行查询(Find、where、select、count)
  • 深度学习-VGG16原理和代码详解
  • 光影漫游者:科技感十足的圆形气膜场馆—轻空间
  • C++泛型库
  • 05.整合Axios+MockJs
  • Python中传参是按值传递还是按引用传递?
  • GO、KEGG等富集棒棒图
  • 为了支持XR,3GPP R18都做了哪些增强?
  • Spring源码(9)--FactoryBean简介
  • Prometheus 学习笔记
  • vscode自动添加python文件的头部注释