MongoDB实现---WiredTiger

news2024/9/26 1:22:18

WiredTiger

参考:https://zhuanlan.zhihu.com/p/265222573

  • MongoDB默认的存储引擎,其和InnoDb类似
    • 通过MVCC实现乐观锁
    • 通过索引文件通过B-Tree树加快访问数据的速度; 数据文件通过B+Tree记录
    • 通过日志先行的策略提升并发处理能力(journal log)类似redo log
    • 通过snapshot 技术(快照)简化了 WT 的事务模型类似读视图;
    • 基于 BLOCK/Extent 的友好的磁盘访问算法类似MySQL的数据分页
    • 全局事务管理器进行事务管理
MongoDB 存储引擎 WiredTiger 原理解析

https://www.jianshu.com/p/f053e70f9b18

快速访问(CRUD)

内存预分配机制

  • 预分配:MongoDB启动时,首先从整个主机内存中切一大块出来分给WiredTiger的Internal Cache,用于构建B-Tree中的各种page以及基于这些page的增删改查等操作。
    • 数据页:默认的Internal Cache大小由下面的规则决定:比较50% of (RAM - 1 GB)和256MB的大小,取其中较大者;
    • 索引页:主机内存再额外划一小块给MongoDB创建索引专用,默认最大值为500MB;
    • 虚拟主存(虚拟硬盘):会将主机剩余的内存(排除其它进程的使用)作为文件系统缓存,供MongoDB使用;
  • 快速IO:为了节省磁盘空间,集合和索引在磁盘上的数据是被压缩的,默认情况下集合采取的是块压缩算法,索引采取的是前缀压缩算法。
    • 所有数据在File System Cache中的格式和在磁盘上的格式是一致的,将数据先加载到文件系统缓存,不但可以减少磁盘I/O次数,还能减少内存的占用;
    • 索引加载到WiredTiger的Internal Cache后,格式与磁盘上的格式不一样,但仍能利用其前缀压缩的特性(即去掉索引字段上重复的前缀)减少对内存的占用;
    • 集合数据加载到WiredTiger的Internal Cache后,其数据必须解压后才能被后续各种操作使用,因此格式与磁盘上和File System Cache都不一样。

数据内存组织形式

  • 通过WT_PAGE记录还未刷新化盘的数据的各个情况;
    • 类似undo log:两个链表(Update List和Insert List)
  • 通过B-Tree树(B+Tree)组织数据;
    • 主要有三类节点:root page、internal page和leaf page
  • Leaf page:叶子结点(数据节点)
    • 数据部分通过WT_ROW记录:
      • 保存从磁盘leaf page读取的keys/values值,每一条记录还有一个cell_offset变量,表示这条记录在page上的偏移量;
    • UPDATE和INSERT部分通过WT_UPDATE和WT_INSERT_HEAD记录:
      • WT_UPDATE每条被修改的记录都会有一个数组元素与之对应,如果某条记录被多次修改,则会将所有修改值以链表形式保存。
      • WT_INSERT_HEAD(插入数据记录):为了提高寻找待插入位置的效率,每个WT_INSERT_HEAD变量以跳转链表的形式构成。

检查点和脏页刷新

检查点

触发checkpoint执行,通常有如下几种情况:

  • 按一定时间周期:默认60s,执行一次checkpoint;
  • 按一定日志文件大小**:当Journal日志文件大小达到2GB(如果已开启),执行一次checkpoint;**
  • 任何打开的数据文件被修改,关闭时将自动执行一次checkpoint。

脏页刷新

Page的生命周期

  • 第一步:pages从磁盘读到内存;
  • 第二步:pages在内存中被修改;
  • 第三步:被修改的脏pages在内存被reconcile,完成后将discard这些pages。
    • 可能由于检查点机制触发
    • 也可能是用户(MongoDB)要求落盘;
    • 脏页内脏数据达到一定比例;
  • 第四步:pages被选中,加入淘汰队列,等待被evict线程淘汰出内存;
  • 第五步:evict线程会将“干净“的pages直接从内存丢弃(因为相对于磁盘page来说没做任何修改),将经过reconcile处理后的磁盘映像写到磁盘再丢弃“脏的”pages。

MVCC

  • 和MySQL的MVCC一样,实现依赖于:读视图和undo log
  • 前面介绍了MongoDB的undolog的实现,下面介绍读视图:

WWT_TXN

图片
  • MVCC的读视图实现:
    • 数据结构:当前事务id、最小事务id、最大事务id+1、活跃事务id数组组成;
    • 产生:当前事务可读、根据事务隔离性决定读视图产生的时机;
    • 规则:略
  • MongDB和MySQL实现的区别:
    • MongoDB支持语句级别的设置:所以MVCC的读视图需要记录当前语句的隔离级别
    • MongoDB通过事务提交和产生时间和事务id实现隔离检查控制;
    • MongoDB通过文档的field的版本号version确定是否对修改进行乐观锁控制;

读视图

  • id字段
    • 这是事务的全局唯一标识,通过它与具体的操作关联,这样就能知道一个事务里面包含哪些操作。
  • snapshot_data字段
    • 因为MongoDB使用的是快照隔离级别的事务,这个字段保存事务的快照信息,具体来说它会有snap_min和snap_max两个属性,通过这两个属性能够计算一个事务开始时能够看到的数据范围,每个事务开始时都会构造一个这样的快照。
  • commit_timestamp字段
    • 表示事务提交的时间。
  • durable_timestamp字段
    • 表示事务修改的数据已持久化的时间,与具体操作里面的durable_ts字段关联。
  • prepare_timestamp字段
    • 表示事务开始准备的时间。
  • WT_TXN_OP字段
    • 包含事务的修改操作,用于事务rollback和生成事务的Journal日志。
  • logrec字段
    • 表示事务日志的缓存,用于在内存里面保存事务日志(对于MongoDB来Journal日志就是事务日志)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439218.html

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

相关文章

ASP.NET Core MVC 从入门到精通之路由

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生&#xff0c…

TCP协议内部工作机制一(确认应答,超时重传,连接管理)

目录 TCP报文结构 TCP的首部长度 保留(6位) TCP特点 TCP内部的工作机制 一确认应答 超时重传 连接管理 建立建立(三次握手) TCP断开连接(四次挥手) TCP报文结构 TCP的报文结构中,16位源端口,16位目的端口,16位校验和和UDP是一样的,本篇文章就暂不介绍了,可参考俺之前写…

设计模式:创建者模式 - 建造者模式

文章目录 1.概述2.结构3.实例4.优缺点5.使用场景6.模式扩展 1.概述 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某…

记录一次VMwame的故障

故障发生时间 2023年4月12日 故障发生现象 无法启动虚拟机 启动虚拟机,报错权限不足,无法访问文件,打不开磁盘"******"或它所依赖的某个磁盘快照,启动”Disk”模块失败 故障解决过程 找资料,网上的解…

vba:文件夹和文件夹的处理,dir

Option Explicit 1 判断文件夹是否存在 dir函数的第二个参数是vbdirectory时可以返回路径下的指定文件和文件夹,如果结果为"",则表示不存在。 Sub w1() If Dir(ThisWorkbook.path & "\2011年报表2", vbDirectory) &q…

( “树” 之 BST) 230. 二叉搜索树中第K小的元素 ——【Leetcode每日一题】

二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。 二叉查找树中序遍历有序。 230. 二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查…

Oracle中Interval几种常用的写法

目录 每分钟执行💨 每天定时执行💨 每周定时执行💨 每月定时执行💨 每季度定时执行💨 每半年定时执行💨 每年定时执行💨 其他更多示例🤷‍♀️🤷‍♀️ 每分钟执…

【线性dp 例题 大综合】dp——数字三角形模型【线性dp】

数字三角形模型 一、数字三角形模型1. 摘花生(最大值)2. 最低通行费(需要把边界置成0x3f)我的错题点 3. ★★★ 取方格数路径长度为k,第一条路线到x1i,第二条路线到x2j的所有方案 4. ★★★★★ 传纸条就是 取方格数 的 题意延申一下 0x51 线性dp经典例题:LIS LCS 数…

Databend v1.1 版本发布!

各位社区小伙伴们,Databend 于 2023 年 4 月 14 日迎来了 v1.1.0 版本的正式发布! 这次新版本是 Databend 发布1.0 版本之后的第一个大版本!相较于 v1.0.0 版本,开发者们一共新增了 1,616 次commit, 共计 505 个优化和…

程序员跳槽,要求涨薪50%过分吗?

如果问在TI行业涨工资最快的方式是什么? 回答最多的一定是:跳槽! 前段时间,知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 ,有网友提问 “程序员跳槽要求涨薪50%过分吗?” 截图来源于知乎,…

uni-app生成海报并分享

lime-painter是一款canvas海报组件,可以更轻松的生成海报 海报画板 - DCloud 插件市场 一款canvas海报组件,更优雅的海报生成方案https://ext.dcloud.net.cn/plugin?id2389插件提供 JSON 及 Template 的方式绘制海报 1、Template方式 提供l-painter-…

【Transformer系列(4)】Transformer模型结构超详细解读

前言 前一篇我们一起读了Transformer的论文《Attention Is All You Need》,不知道大家是否真的理解这个传说中的神(反正俺是没有~) 这两天我又看了一些视频讲解,感谢各位大佬的解读,让我通透了不少。 这篇文章就和…

前沿的Web前端技术趋势与应用实践

近年来,Web前端技术发展迅猛,各种新技术层出不穷,为了跟上潮流,我们需要不断学习新知识,应用新技术,不断提高自己的技术水平,为自己的职业生涯打下坚实的基础。本篇博客将为大家详细介绍前沿的W…

【Mysql】主从复制

【Mysql】主从复制 文章目录 【Mysql】主从复制1. 概述2. 原理3. 搭建3.1 准备工作3.2 主库配置3.3 从库配置 1. 概述 主从复制是指主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后再从库上对这些日志重新执行(也叫重做),从而使得从库和…

小红书行业趋势分析,女性种草关键词有哪些?

在“她力量”崛起的当今,女性用户正不断引领新潮流,驱动产品、内容升级。女性个人观念、生活方式、消费偏好演变,需求重点势必不断更新。 今儿就女性用户的聚集地小红书平台,以及女性最关注的美妆、母婴两大行业,通过数…

完整支持Oracle PL/SQL,星环科技KunDB高兼容性实现低成本国产化替代

从中兴、华为等一系列高新科技企业被美国制裁,到俄乌冲突事件爆发后,西方各国相继宣布制裁俄罗斯,以Oracle、IBM、微软、SAP为代表的科技巨头暂停在俄服务,这一系列动作给我们敲响了加速国产化替代的警钟。数据库作为提供数据存储…

2024年浙大MBA提前批面试即将开始申请,如何操作?

在去年的这个时间点,浙大MBA提前批面试的申请系统已经打开并可以正常开始接受申请报名,而今年的申请时间会在什么时间点?那么又如何准备浙大MBA的提面申请呢?本期专注浙大的杭州达立易考教育为大家做一下梳理,帮助大家…

【机器学习】P21 正则化 Regularization(L1正则化 Lasso、L2正则化 Ridge、弹性网络正则化、Dropout正则化、早停法)

既然模型有概率发生过拟合现象,那么如何才能减少过拟合,或者防止过拟合的产生?方法之一就是正则化方法,Regularization; 我对正则化,有这样的理解:“我们既希望能够通过权重的调整从而建立更好…

数据结构考研版——括号的匹配问题栈的计算问题

一、括号的匹配问题 这玩意太简单了没什么讲头,就是括号一个一个进栈,匹配就出,以此类推 二、括号匹配问题代码 int isMatched(char left, char right) {if (left (&& right ))return 1;else if (left [ && right ])ret…

还在发愁项目去哪找?软件测试企业级Web自动化测试实战项目

今天给大家分享一个简单易操作的实战项目(已开源) 项目名称 ET开源商场系统 项目描述 ETshop是一个电子商务B2C电商平台系统,功能强大,安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城…