关注我们,及时下载学习资源

内容来源:2018 年 10 月 27 日,MongoDB中文社区联席主席郭远威在“2018年MongoDB中文社区 广州大会”进行《WiredTiger存储引擎介绍》的演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:2969 | 8分钟阅读

摘要

本次分享的主题是WiredTiger的存储引擎,主要包含四部分内容,首先介绍MongoDB的插件式存储引擎的架构,然后是WiredTiger的事物,第三部分将介绍Checkpoint机制,最后通过一个案例,分析WiredTiger的cache分配和压缩特性。


获取嘉宾演讲视频及PPT,点击“阅读原文”。

插件式存储引擎架构

这个图最下层是存储引擎的最底层,中间还有一个内存的存储引擎。这些存储引擎的上面是MongoDB的文档数据模型,因此不管采用什么样的存储引擎,对于上层的应用程序开发者来说都是透明的。最上层是通过MongoDB数据库支撑的各种应用。可以看到总体的架构,实际上与Mysql有点类似,都是插件式的存储引擎架构。

事务特性与快照隔离级别

关系数据库中的事务是有隔离性的,而MongoDb也支持事务,且符合ACID事务的标准特性。通常事物会有写提交、读未提交、快照等隔离级别,MongoDB默认使用的是快照形式的隔离级别,任何事物开始的时候,先会对内存里面所有写操作但是还未完成的事务做一个拍照,然后记录这些写操作未完成事务的一个状态信息。

对于写操作事务,在写入之前先需要判断操是否与之前其他未完成的事务是否有冲突,如果有冲突的话就会执行失败,过一段时间后再重新提交事务,这里关键的在于能够判断写操作是否与其它的事务发生冲突。

MVCC实现事物的冲突检测与并发

多版本并发控制机制的引入,让我们可以检测是否冲突,它实际上是通过记录每一个事物开始的时候所操作的这条记录的版本号来实现的,这种方式在其他数据库里面同样存在。

比如我们有AB这两个写操作的事务。A事务首先从表中读取到要修改的行数据,读取到库存值为100,行记录的版本号为1。B事务也从中读取到要修改的相同行数据,读取值为100,行记录版本号为1。A事务修改库存值都提交,同时行记录版本号加1,大于一开始读取到的版本号1,因此A事务可以提交。但B事务提交时发现此时行记录版本号已经为2,产生了冲突,所以B事务会提交失败。接着B事务会尝试重新提交,在读取的版本号基础上加1,这样就不会再产生冲突,正常提交了。通过这种多版本并发控制的机制就可以防止B事物修改错误的数据。

典型操作事务执行流程

写操作事务开始执行之前,会对所有正在执行的还未提交事务进行快照。然后将本次写操作的动作保存到Operation_array中,可以从中提取出动作进行回滚,其次将修改的数据以日志形式记录下来,记录到日志缓存区域。写操作事务提交,首先会将日志缓冲区中的数据刷到磁盘上,写入到log文件,数据库意外宕机恢复时需要读取这个文件,重演文件里面的动作。

写操作引起的数据变化,首先写入到WiredTiger存储引擎的cache中,cache中的数据以btree的结构组织,btree的叶子节点是真正存放数据的page,当数据发生更改时page就变未“脏页”(在内存中);存储引擎默认从每60s将“脏页”中的数据写到物理磁盘上进行持久化。

引入checkpoint机制后的典型写操作流程

引入checkpoint后整个流程会发生相应的变化,主要是图中圈出来的地方。Checkpoint会产生在两个地方,一个是在默认情况下每60秒刷新磁盘的时候,将内存里面的脏数据刷到磁盘的时间点上,会在对应的数据文件上产生。另外一个时机是开启journal日志功能后,当日志文件达到2gb的时候,也会发生一次checkpoint。

checkpoint有两个重要的作用,一个是恢复数据库的时候,让我们只需要从最新的checkpoint时间点进行恢复,有效的缩减数据库恢复的时间。另一方面由于checkpoint完成以后,就可以认为内存里面在checkpoint时间点之前的数据都已经安全完整的写到磁盘上了,因此可以释放内存“脏页”所占的内存空间,达到节省内存空间的目的。

WiredTiger对内存的使用情况

wiredTiger对内存使用会分为两大部分,一部分是内部内存,另外一部分是文件系统的缓存。内部内存默认值有一个计算公式{ 50% of(RAM-1GB) ,or256MB },索引和集合的内存都被加载到内部内存,索引是被压缩的放在内部内存,集合则没有压缩。wiredTiger会通过文件系统缓存,自动使用其他所有的空闲内存,放在文件系统缓存里面的数据,与磁盘上的数据格式一致,可以有效减少磁盘I/O。

internal Cache的内部结构

在内存中数据是以btree的结构形式进行存储的,任何数据在写之前,都会先读取到internal cache里面。如上图第一步操作是调用块管理器,块管理器会将磁盘上的数据读取到内存。第二步修改数据的的时候,会重新分配一个新的page,在此基础上进行修改,修改完成后,原来page就会变成“脏页”,接着通过wiredTiger的内部机制将这个“脏页”重新通过块管理器刷到磁盘里面。

与internal cache相关的几个数据结构

首先是原始的page,通过列表形式把所有的数据给串起来。如果有修改动作,会再维护一个修改的page,在修改的page里面又会维护两个链表,保存的是链表的头,插入链表和修改链表的时候分别对应着两个数据结构,这样wiredTiger就不会将每一次的修改和插入操作直接写到磁盘上。当修改操作或插入操作累积到一定程度以后,在内存里面会将这些操作进行规整,整理以后,然后同时一次性的写入到的磁盘里面去。

案例:应用程序开发连接池问题

最后我们看一下与应用程序开发者比较相关的连接池的问题。当时我们有很多应用都用到了MongoDB,所有应用都创建了Mongo Client,这些应用经常会做些增删改查的动作,但是由于我们的服务器配置集成人员可能对分片集群的部署不是很熟悉,所以有些参数也没有关注到,导致了大量连接超时的的一个问题。

后续我们对此进行了分析,找到了具体原因。对于MongoDB来说,它的连接分为有两个部分,一个是驱动程序的连接词,另外一个是在服务器上,其中有一个参数决定了该服务器所能支持的最大的并发连接数。如果驱动程序的连接池远大于服务器所能支持的并发连接数,那么即使客户端程序没有出现连接问题,服务端也会出现连接拒绝的错误。为解决这方面的问题,我们可以分别从客户端和服务端的层面修改他们的默认连接池大小。

以上为今天的分享内容,谢谢大家!

本文转载自:IT大咖说


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

PRELECTION ,大讲堂讲师课程资料

近期文章

企业数据架构的云化智能重构和变革(含大会PPT)

Oracle研发总裁Thomas Kurian加盟Google Cloud

变与不变: Undo构造一致性读的例外情况

Oracle 18c新特性:动态 Container Map 增强 Application Container 灵活性

Oracle 18c新特性:Schema-Only 帐号提升应用管理安全性

Oracle 18c新特性:多租户舰队 CDB Fleet (含PPT)

为什么看了那么多灾难,还是过不好备份这一关?

WiredTiger存储引擎知多少?相关推荐

  1. Mongodb WiredTiger存储引擎特性

    数据库的存储引擎组件,负责管理存储在内存和硬盘上的数据.MongoDB支持多个存储引擎,为特定的工作指派合适的存储引擎为您的用例可以显著提高应用程序的性能. **MongoDB WiredTiger* ...

  2. WiredTiger存储引擎分析

    初始化 mongodb中wiredtiger初始化 MONGO_INITIALIZER_WITH_PREREQUISITES(WiredTigerEngineInit, ("SetGloba ...

  3. 一个简单的程序来使用WiredTiger 存储引擎

    前言 WiredTiger 自 mongodb3.0 集成进来之后为mongodb拉回了大量的口碑,从而在mongodb-3.2 版本直接代替了in-memory存储引擎,作为了mongodb的默认存 ...

  4. MongoDB Wiredtiger存储引擎实现原理——Copy on write的方式管理修改操作,Btree cache...

    转自:http://www.mongoing.com/archives/2540 传统数据库引擎的数据组织方式,一般存储引擎都是采用 btree 或者 lsm tree 来实现索引,但是索引的最小单位 ...

  5. MongoDB Wiredtiger存储引擎实现原理

    Mongodb-3.2已经WiredTiger设置为了默认的存储引擎,最近通过阅读wiredtiger源代码(在不了解其内部实现的情况下,读代码难度相当大,代码量太大,强烈建议官方多出些介绍文章),理 ...

  6. Wiredtiger 存储引擎概述

    存储引擎在任何的数据库里面都是非常重要的模块, 它主要负责数据的写入, 读取以及管理.Mongodb 从3.2之后, 采用WiredTiger 作为默认的存储引擎,其主要的特性如下: btree.pa ...

  7. wiredtiger存储引擎介绍——本质就是LSM,当然里面也可以包含btree和列存储

    见:http://www.slideshare.net/profyclub_ru/4-understanding-and-tuning-wired-tiger-the-new-high-perform ...

  8. MongoDB 初体验:存储引擎 MMAPv1 与高内存消耗及升级迁移

    想不到我和MongoDB的第一次亲密接触竟然是这样开始的. 当我对公司的一个内部系统性能无可忍受时,意外发现在这个内存仅为 32G 的服务器上,运行着一个 MongoDB 数据库,其主进程 mongo ...

  9. MONGODB 的存储引擎更快,更高,更强的秘诀 --译

    在过去的20年里,存储硬件的性能提高了两个数量级,首先固态存储系统 SSD 的引入,同时SATA导向了PCIE 的接口方式,最终非易失性的技术以及制造工艺的创新.2019年4月,Intel 发布了首款 ...

最新文章

  1. 基于python物流管理系统毕业设计-Python程序设计实验报告八:文件
  2. 时间控件_Selenium时间控件的处理
  3. python课程典范选优_python 实现选课系统
  4. Unity使用MikuMikuDance
  5. 阅读引擎开源项目调研总结
  6. python第三方库安装位置_python第三方库安装在哪
  7. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table doesn't exist
  8. 【每日一题】一起冲击蓝桥杯吧——Day6【蓝桥真题一起练】
  9. WPS表格2013怎么进行数据合并计算将多个区域进行合并计算
  10. MOS管的行业应用领域-KIA MOS管
  11. 六相PMSM电驱平台及电机相序、参数测试流程
  12. bzoj 3728 zarovik 买灯泡
  13. 数据可视化之小提琴图(原理+Python代码)
  14. MySql查询当前版本
  15. html如何实现小语种翻译,如何使用“小语种自动翻译”功能?
  16. 零售企业如何快速开上千家门店,揭秘名创优品的低价超级产品战略
  17. shell语法 函数
  18. 技术总监/技术leader 职责与工作记录 第一天
  19. 【无标题】3ds max 室内设计后期PS调整
  20. S3C6410学习笔记

热门文章

  1. dhh basecamp_使Basecamp的薪酬透明化保留了人才
  2. opensource项目_最佳Opensource.com:硬件
  3. 开源虚拟示波器-_一个新的开源数据库,TP-Link路由器上的开源固件以及更多新闻
  4. 猎聘 大街_大街开放时
  5. nde升级_NDE新闻编辑室工具KDE Plasma Mobile和更多新闻
  6. 开源 非开源_打破开源中的怪胎刻板印象
  7. mysql5.7下载及详细安装教程_MySQL 5.7 下载及安装教程(详细)
  8. 三.因子图优化学习---董靖博士在泡泡实验室的公开课学习
  9. 视觉SLAM十四讲学习笔记-第四讲-Sophus实践、相似变换群与李代数
  10. NORDIC 52832开发1之环境搭建及PTR5618模块性能测试