此文已由作者温正湖授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

MongoDB中WiredTiger的参数配置主要通过 wiredtiger_open (http://source.wiredtiger.com/2.9.1/group__wt.html#ga9e6adae3fc6964ef837a62795c7840ed)进行配置。

checkpoint检查点:

默认60s或2G redo触发checkpoint,也可以通过syncPeriodSecs调整,但官方强烈建议不调整;WT可通过checkpoint_sync(未在MongoDB中暴露)来调整checkpoint时的行为,默认会将数据持久化到存储介质中。

journal:

即redo日志,默认开启redo,每50ms刷新一次,时间无法设置。与MySQL的InnoDB redo不同,wt的redo类似MySQL Binlog文件,大约每写满100MB就会创建新的redo文件,此时会刷新旧的redo文件,最后一次检查点前的redo日志文件会被自动删除。

MongoDB wt的崩溃恢复大概流程为:查找wt元数据,先将数据恢复到最近一个已完成的checkpoint点,由于wt数据插入和更新采用COW(copy on write)机制,所以该恢复过程非常快;之后,在redo文件中查找是否有checkpoint点之后的日志,若有,则回放这些日志。

WT层持久性

从上可以看出,MongoDB中的wt并未设置为commit-level的数据持久性,而仅仅是checkpoint-level的持久性,但由于每50ms都会flush redo,所以虽有数据丢失,但由于每50ms一刷新,正常情况下丢失数据量很少,最多也不会超过100MB。由于生产环境中,MongoDB一般配置为replica set,丢失的那部分数据,也可以通过oplog复制从其他节点补上。

WT层IO方式

此项在MongoDB中没有显式配置,所以使用默认值。

WT可通过direct_io来调整打开文件时的行为,可配置data、log文件或checkpoint时走DirectIO,默认为空,也就是说这三种IO都走Buffer IO模式,即使用Linux内核的page cache;可通过mmap配置项来设置是否尽可能走MMAP内存访问模式,默认开启;

此外,还可为每次事务定义IO行为,通过transaction_sync进行配置,包括详细可参考(http://source.wiredtiger.com/2.9.1/tune_durability.html),默认在事务提交的时候不flush日志,仅在checkpoint的时候,或sync的时候刷。刷日志的行为可选择fsync或dsync(官方说区别不大)。

MongoDB层持久性

虽然MongoDB在wt设置层面没有做到commit-level的持久性。但对于MongoDB插入和更新操作,如果write concern中设置j:true,则确保了每次操作内容都会持久化到redo中。而且MongoDB 3.2复制集协议protocolVersion: 1(类raft)时,如果开启了journal,则write concern中的j为true,除非用户修改了驱动/复制集设置,或者在操作时显式指定j:false。

所以,从MongoDB整体上看,实现了操作级别(事务级别)的数据持久性。如果复制集配置write concern的w为majority,则能够确保插入和更新操作成功返回用户后,数据已经持久化到大多数节点。

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 Foxman,基于微核架构的Mock解决方案
【推荐】 Message Loop 原理及应用

MongoDB中WiredTiger的数据可用性设置的更多相关文章

  1. 用nodejs删除mongodb中ObjectId类型数据

    mongodb中"_id"下面有个ObjectId类型的数据,想通过这个数据把整个对像删除,费了半天劲终于搞定费话少说上代码 module.exports = function ( ...

  2. Winfrom 中 ComboBox 绑定数据后设置选定项问题

    在为 ComboBox 当定数据的时候,如果遇到界面显示需要用文本,而获取选定项的值时需要用数字,我们就很习惯使用 DataSource  来进行绑定. 例如以下代码: List<TextVal ...

  3. mysql中表里的数据重新设置自增的id的方法

    如果删除表数据用这个 TRUNCATE TABLE tablename 如果不删除表 alter table table_name AUTO_INCREMENT=;

  4. MongoDB中的数据类型

    mongoDB中存储的数据单元被称作文档.文档的格式与JSON很类似,只不过由于JSON表达的数据类型范围太小(null,boolean,numeric,string和object),mongoDB对 ...

  5. CODESOFT中怎样打印数据库中的特定数据?

      CODESOFT可用于打印.标记和跟踪的零售库存标签软件,每种产品的售卖都代表着需要打印大量的条码标签.通常我们采用的方法就是在CODESOFT连接数据库批量打 印.但是如果数据量很大,该如何选择 ...

  6. MongoDB中如何优雅地删除大量数据

    删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求.除了正常的业务需求,我们需要通过这种方式来为数据库"瘦身". 为什么要"瘦身"呢? 表的数据量到达一定 ...

  7. MongoDB 中数据的替换方法实现 --类Replace()函数功能

    关键字: MongoDB,Replace,forEach 近日接到一个开发需求,因业务调整,需要DBA协助,将MongoDB数据库中某集合的进行替换.例如我们需要将集合A中B字段中,有关<美好& ...

  8. 用java在客户端读取mongodb中的数据并发送至服务器

    使用Java自带的socket端口来实现,程序如下: Client.java package com.cn.gao; import java.net.*; import java.io.*; impo ...

  9. MongoDB中的数据聚合工具Aggregate和Group

    周煦辰 2016-01-16 来说说MongoDB中的数据聚合工具. Aggregate是MongoDB提供的众多工具中的比较重要的一个,类似于SQL语句中的GROUP BY.聚合工具可以让开发人员直 ...

随机推荐

  1. Educational Codeforces Round 19 C

    Description Petya recieved a gift of a string s with length up to 105 characters for his birthday. H ...

  2. Clone a Pluggable Database – 12c Edition

    1. 1.Tnsnames when connecting to either Container or Pluggable instance The tnsnames.ora should be c ...

  3. Linux遗忘命令

    1.查找文件的安装目录,拿nginx来说 find /|grep nginx.conf 2.   a.查询某个端口是否被占用,如8080端口 netstat –apn | grep 8080 b.查看 ...

  4. P1615 西游记公司

    题目背景 一道极其无厘头的题目 题目描述 事情是这样的:西游记中的孙沙猪(孙杀猪)三徒弟在西天取经之后开始进入厦门大学经贸系学习经济,在1个小时的学习后,他们用暴力手段毕业了.然后,他们创办了三个公司 ...

  5. java 获取ip地址

    1.使用WIFI 首先设置用户权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"& ...

  6. iOS 获取真机上系统动态库文件

    iOS 获取真机上所有系统库文件 系统动态库文件存放真机地址(/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64) 在Mac\i ...

  7. SQL Server中的事务日志管理的阶梯,级别1:事务日志概述

    SQL Server中的事务日志管理的阶梯,级别1:事务日志概述 翻译:刘琼滨 谢雪妮 许雅莉 赖慧芳 级别1:事务日志概述 事务日志是一个文件,其中SQL服务器存储了所有与日志文件关联的数据库执行的 ...

  8. qt QTableView/QTableWidget样式设置

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7591409.html 选中设置: QTableView::item:selected { background ...

  9. 推荐一个高大上的网易云音乐命令行播放工具:musicbox

    网易云音乐上有很多适合程序猿的歌单,但是今天文章介绍的不是这些适合程序员工作时听的歌,而是一个用Python开发的开源播放器,专门适用于网易云音乐的播放.这个播放器的名称为MusicBox, 特色是用 ...

  10. 【Conclusion】MySQL的安装和使用

    MySQL使用 因为数据库实验用到了MySQL,这里对现在已经涉及到的MySQL部分操作做一个简单的小结. 1.安装MySQL 上MySQL的官网下载对应自己OS平台的MySQL安装文件,有在线安装和 ...