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

【赵渝强老师】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存储引擎会重建集合的所有索引。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 苹果系统(MacOS)资源管理器和终端的来回切换
  • Centos7通过reposync搭建本地Yum源
  • 非局部均值降噪算法(NLM)原理及实现
  • 冒泡排序;选择排序;插入排序;快排;判断大小端;位运算
  • 【C++算法】分治(快排 归并)
  • 中国各城市、各区县、各省份-PM2.5相关数据(1998-2021年)
  • 零基础5分钟上手亚马逊云科技 - AI模型内容安全过滤
  • Flink 配置文件的深度解读
  • 评价决策类——层次分析法+数学建模+实战分析
  • Ascend C算子开发(入门)—— 算子开发初体验
  • C++ 学习 2024.9.3
  • C++ MQTT客户端库libmosquitto的使用
  • 编译与链接
  • ChatTCP:一款离线TCP数据包分析macOS APP,致力于让分析TCP数据包像看聊天记录一样简单
  • 【QT】析构函数执行引发异常
  • [译]如何构建服务器端web组件,为何要构建?
  • Angular4 模板式表单用法以及验证
  • axios 和 cookie 的那些事
  • Brief introduction of how to 'Call, Apply and Bind'
  • const let
  • CSS 三角实现
  • express.js的介绍及使用
  • JavaScript的使用你知道几种?(上)
  • learning koa2.x
  • v-if和v-for连用出现的问题
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 初探 Vue 生命周期和钩子函数
  • 大数据与云计算学习:数据分析(二)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 每天一个设计模式之命令模式
  • 浅谈web中前端模板引擎的使用
  • 深度学习入门:10门免费线上课程推荐
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习Vue.js的五个小例子
  • 转载:[译] 内容加速黑科技趣谈
  • Java总结 - String - 这篇请使劲喷我
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 积累各种好的链接
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​如何在iOS手机上查看应用日志
  • #QT(QCharts绘制曲线)
  • #微信小程序:微信小程序常见的配置传旨
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (C)一些题4
  • (java)关于Thread的挂起和恢复
  • (javascript)再说document.body.scrollTop的使用问题
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (备忘)Java Map 遍历
  • (二)换源+apt-get基础配置+搜狗拼音
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...