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

news2024/9/22 10:38:14

在这里插入图片描述

  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.coloradmin.cn/o/2101468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大带宽服务器推流延迟怎么回事

大带宽服务器推流延迟的原因可能涉及多个方面&#xff0c;包括编码解码的延迟、网络传输延迟、CDN分发延迟以及播放端的缓冲处理等。下面将详细解释各个影响因素&#xff0c;并提出相应的优化建议&#xff1a; 1. 编码解码的延迟 视频编码格式的影响&#xff1a;不同的编码格式…

net、udp、tcp

Makefile的main.c文件中的全局变量SONG song,要在fun.c文件里面写成extern SONG song 编译方法 第一次编写 或 网络编程 物理层的网线规定有八根,颜色不一样,功能不一样,光猫把光信号转换成电信号,光纤10Gb WiFi叫无线局域网,一般也就50米左右,手机流量叫蜂窝网络,…

无限延展(倒推法)

本题不妨逆推。 对于长度为的字符串 ,若要求第位的延展,考虑 在最后一次延展前的位置。 若延展结束后的长度为,每次考虑以下内容: 若 ​,说明本次伸展无效, ,

CTFHub技能树-备份文件下载-bak文件

当开发人员在线上环境中对源代码进行了备份操作&#xff0c;并且将备份文件放在了 web 目录下&#xff0c;就会引起网站源码泄露。 使用dirsearch扫描出index.php.bak 有些时候网站管理员可能为了方便&#xff0c;会在修改某个文件的时候先复制一份&#xff0c;将其命名为xxx.b…

没关系,会一手Git版本控制就行(全)

Git版本控制 文章目录 Git版本控制1. 版本控制1.1 概述1.2 版本控制优点1.3 本地版本控制系统&#xff08;离线版&#xff09;1.4 集中化的版本控制系统&#xff08;联网版&#xff09;1.5 分布式版本控制系统&#xff08;离线联网版&#xff09; 2. Git概述2.1 Git基本工作流程…

BUUCTF PWN wp--ciscn_2019_n_8

第一步 checksec一下&#xff0c;本题为32位。 分析一下保护机制&#xff1a; 一、RELRO: Partial RELRO Partial RELRO 提供了一定程度的保护。在这种情况下&#xff0c;部分重定位表在程序启动时被设置为只读。这可以防止一些针对重定位表的攻击&#xff0c;比如通过篡改重…

Elasticsearch 介绍

1、课程介绍 1.1 ES 8.x 演化进程 版本号发布日期多少个次要版本迭代历时8.02022年2月11日&#xff1f;至今7.02019年4月11日17个次要版本34个月6.02017年11月15日8个次要版本17个月5.02016年10月27日6个次要版本13个月 2、Elasticsearch 是什么 2.1 概念 2.1.1 标准定义 …

QLineEdit中文本显示不全,部分字符显示空白问题

环境 QT5.14.2 Windows 7 现象 触发某个条件后&#xff0c;使用QLineEdit的setText方法设置文本后&#xff0c;文本部分字符缺失&#xff0c;现象如下&#xff08;小数点后都是4位&#xff09;&#xff1a; 解决办法 设置根据显示器的像素密度进行自动缩放&#xff1b;再主…

VMware启动报错-Intel VT-x处于禁用状态,进入BIOS更改CPU设置

问题描述 VMware启动虚拟机失败&#xff0c;报错显示Intel VT-x处于禁用状态。 原因分析 打开主机的任务管理器&#xff0c;找到CPU&#xff0c;发现虚拟化处于禁用状态&#xff0c;查阅资料之后发现&#xff0c;进入BIOS模式将CPU虚拟化禁用开启即可解决。 解决步骤 1、…

KAN 学习 Day1 —— 模型框架解析及 HelloKAN

说明 最近了解到了一个新东西——KAN&#xff0c;我的毕设导师给推荐的船新框架。我看过很多剖析其原理的文章&#xff0c;发现大家对其持有的观点都各不相同&#xff0c;有的说可以颠覆传统MLP&#xff0c;有的说可以和Transformer同等地位&#xff0c;但是也有人说它训练速度…

15chatGLM3半精度微调

1 模型准备 数据依然使用之前的数据&#xff0c;但是模型部分我们使用chatglb-3&#xff0c;该模型大小6B&#xff0c;如果微调的话需要24*4 96GB,硬件要求很高&#xff0c;那么我们使用半精度微调策略进行调试&#xff0c;半精度微调有很多坑啊&#xff0c;注意别踩到…

只会SQL语句,可以做什么工作?

1、SQL是什么 首先简单介绍一下SQL&#xff08;Structured Query Language&#xff09;&#xff0c;是一种可以进行数据提取、聚合、分析&#xff0c;并对数据库进行构建和修改的编程语言。 相对来说&#xff0c;SQL上手非常容易&#xff0c;因为语法结构比较固定&#xff0c…

第一性原理计算从定义到场景到硬件配置详细讲解

第一性原理计算&#xff0c;又称为从头计算&#xff08;The Ab initio Calculation&#xff09;&#xff0c;是一种基于量子力学原理&#xff0c;通过计算机模拟来预测材料、分子、固体等体系性质的方法。这种方法的核心思想是不依赖于实验数据或经验参数&#xff0c;而是直接从…

如何纯手动的创建SpringBoot工程?

1、打开项目结构 2、new 一个新模块 3、所需全部选配好 4、 创建好之后&#xff0c;目录如下 5、在pom文件中&#xff0c;做第一件事情&#xff08;让当前的工程继承一个父工程&#xff09; &#xff08;这是一个固定的写法&#xff1a;spring-boot-starter-parent&#xff09;…

JavaWeb - Maven

Maven apache旗下的一个来源项目&#xff0c;一款用于管理和构建java项目的工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建。 作用 安装 解压官网下载的压缩包 配置本地仓库&#xff0c;修改conf/se…

接口请求400

接口请求400 在Web开发中&#xff0c;接口请求错误是开发者经常遇到的问题之一。其中&#xff0c;400错误&#xff08;Bad Request&#xff09;尤为常见&#xff0c;它表明发送到服务器的请求有误或不能被服务器理解。本文将深入探讨接口请求400错误&#xff0c;从常见报错问题…

springcloud微服务入门

1.架构的演变 目前我们接触的比较多的是单体架构&#xff0c;指的是将所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 这样的架构优点在于&#xff0c;架构简单&#xff0c;把各个功能集中在一起方便操作管理&#xff0c;部署成本也比较低但是缺点也是很明显&#…

让AI给你写代码(10.1): 按接口编程的思想,统一利用内部和外部的接口,逐步扩展和提升AI编程能力

先总结一下AI编程小助手已具备的能力&#xff0c;目前AI小助手已经可以利用本地知识库和在线大模型&#xff08;我们用的是qwen&#xff09;生成可测试&#xff0c;可执行代码的能力&#xff08;具体流程参考从让AI给你写代码&#xff08;9.1&#xff09;&#xff09;&#xff…

※※Leetcode Hot 100刷题记录 -Day8(和为k的子数组)

问题描述&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a; 输入&#xff1a…

java开发面试:AOT有什么优缺点/适用于什么场景/AOT和JIT的对比、逃逸分析和对象存储在堆上的关系、高并发中的集合有哪些问题

JDK9引入了AOT编译模式。 AOT 有什么优点&#xff1f;适用于什么场景&#xff1f; JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation) 。 和 JIT 不同的是&#xff0c;这种编译模式会在程序被执行前就将其编译成机器码&#xff0c;属于静态编译&#xff08;C、 C…