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

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

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. 题解报告:hdu 2196 Computer(树形dp)

    Problem Description A school bought the first computer some time ago(so this computer's id is 1). Du ...

  2. Linux Ubuntu 14.04 LTS下VirtualBox连接USB

    1.环境 主机:Ubuntu 14.04 LTS 虚拟机:Windows 7 专业版本 VirtualBox: 图形用户界面版本 5.1.8 r111374 (Qt5.6.1) 2.在主机上给Virt ...

  3. Java对象的内存布局以及对象的访问定位

    一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储 ...

  4. C. Arpa's loud Owf and Mehrdad's evil plan DFS + LCM

    http://codeforces.com/contest/742/problem/C 首先把图建起来. 对于每个a[i],那么就在i --- a[i]建一条边,单向的. 如果有一个点的入度是0或者是 ...

  5. pyton 基础,运算符及字符类型。

    一.python运算符: 二.数据类型: 1.数字: int  :整型 32位机器上一个整数取值范围为-2**31~2**31-1即-2147483648~2147483647 64位机器上一个整数取 ...

  6. RHEL 6.5----heartbeat

    主机名 IP  所需软件  master 192.168.30.130  heartbeat.httpd node-1 192.168.30.131  nfs  node-2 192.168.30.1 ...

  7. Apache Cordova

    http://cordova.apache.org/ Apache Cordova is a platformfor building native mobile applications using ...

  8. html/css实现聊天布局

    效果图 项目结构 html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" / ...

  9. logging日志过滤和日志文件自动截取

    1.日志过滤 import logging class IgnoreFilter(logging.Filter): def filter(self,record): return "girl ...

  10. JS进阶-特殊形式的函数-内部私有函数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...