写操作

复制集

mongo所有的节点都是写入到primary节点,同时写入oplog,secondary 节点会持续的从primary节点上复制oplog的信息,然后根据oplog写数据。secondary 节点的复制oplog,写数据是一个异步的过程.

oplog 是一个capped collection(固定大小的集合,超过最大值后自动覆盖老的值),记录对数据库的更改操作。oplog大小默认是disk的5%,可以根据你的应用去调节

sharding 环境

sharding 集群环境,由mongos来分发,通过config server 保存的信息,将数据写到对应的shard上

write concern

write concern 其实就是写操作的一致性级别,对于cassandra,每个节点都是一样的,所以一致性等级就是设置写多少个节点成功。而mongo就比较复杂一点

{w: <value>,j: <boolean>,wtimeout: <number>}
  • w 表示写应答

    w 可以为数字,代表的是收到写入成功的mongod 数目。w也可以是”majority”,表示收到了大多数投票节点的应答。还可以是表示收到了被标记了某tag的复制集的某个节点应答。

  • j是写操作是否被写入到journal

    3.2版本,j:true 要求w中设置的节点都写入到了journal.以前版本中,只要求复制集中的primary写入到了journal接可以,而不管w设置的值。

  • wtimeout:timeout时间,避免写入时间过长,block住了其他操作

write concern具体设置成多少,由应用程序决定,应答节点设置的越多,写性能越差,数据的持久化越好。相反设置的越少,写性能越好,数据的安全性越差。

journal

为什么有journal这个,一般DB中写操作都是先写到内存中,然后flush到磁盘,这样效率比较高。但是这样有个风险,就是当内存中的数据还没有flush到磁盘中的时候,节点down掉或者数据库实例down,就会有造成这部分数据的丢失。对于cassandra,有commit log 来实现recover。对于mongo,就是journal.

以WiredTiger 存储引擎为例,WiredTiger 创建checkpoints,以60s间隔或者2G的journal data.如果在这期间节点down掉,内存数据丢失,就需要依靠journal file来实现数据的回复。journal数据包括一个写操作的所有影响,同样存储在内存中,每隔50ms flush到磁盘中。

journal记录没有到128KB,都会存储在缓冲区,journal 缓冲区每隔50ms flush到磁盘,也就是说数据还是有丢失的可能。当写操作concern加了true,可以确保数据被写入到journal file

journal vs oplog

oplog 已经记录了操作日志,为啥不可以作为数据恢复呢,cassandra中就是用commit log 写操作记录,和数据恢复。

在mongo中,oplog是比journal更高level的,文件大小要大,记录的对数据库的更改操作,用于primary,secondary数据之间的同步。

journal 文件最大100MB,主要用来数据恢复,记录的操作更加详细。比如update数据,不仅记录update什么数据,还记录对index的影响。

总结

说了这么多,对于具体的应用应该如何设置呢。

1. 不应该是为整个应用设置同一个write,需要给write 操作分别设置。

2. 应用中的操作基本可以分为两类

- 低延迟, 写性能高,可以忍受脏读。w= 1

- 数据一致性,不能忍受脏读,设置w = majority,牺牲部分性能

参考

http://stackoverflow.com/questions/8970739/how-do-the-mongodb-journal-file-and-oplog-differ

https://docs.mongodb.com/manual/reference/write-concern/

mongo 写分析的更多相关文章

  1. mongo 读分析

    分布式读 读冲突 分布式中数据库有多份数据,各份数据可能存在不一致性. mongo 只会写到primary节点上,理论上来说不会有文档冲突,也就是说数据库中的数据都以primary节点为标准. 但是有 ...

  2. mongo explain分析详解

    1 为什么要执行explain,什么时候执行 explain的目的是将mongo的黑盒操作白盒化. 比如查询很慢的时候想知道原因. 2 explain的三种模式 2.1 queryPlanner 不会 ...

  3. kotlin和vertx和mongo写的一个服务器验证登陆功能(很简陋)

    包结构长这个样子: server包:(服务器相关配置) HttpServer:用ver.x创建了一个http服务器,把接收到的req请求传入RPCRequest中: RPCRequest:解析请求bo ...

  4. nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?

    我用的是ramdisk.image.gz,烧写在flash的0x10140000处 我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的? 如果ramdisk.image.gz在flas ...

  5. u-boot 的bootcmd 和bootargs详解,烧写分析

    下面链接这篇文章也非常重要,介绍DM3X的一系列烧写步骤和设置方法 http://www.61ic.com/Article/DaVinci/TMS320DM3x/201204/41827.html U ...

  6. 天啦,从Mongo到ClickHouse我到底经历了什么?

    前言: 在实现前端监控系统的最初,使用了 Mongo 作为日志数据存储库.文档型存储,在日志字段扩展和收缩上都能非常方便.天生的 JSON 格式和 NodeJs 配合也非常贴合.就这样度过了几个月的蜜 ...

  7. 用systemtap对sysbench IO测试结果的分析1

    http://www.actionsky.com/docs/archives/171  2016年5月6日  黄炎 近期在一些简单的sysbench IO测试中, 遇到了一些不合常识的测试结果. 从结 ...

  8. Linux IIO子系统分析

    最近稍微看了下LKML,发现里面有一个子系统叫做“IIO”.以前没有接触过,所以Google了下.     IIO子系统全称是 Industrial I/O subsystem(工业 I/O 子系统) ...

  9. 【转】 Linux IIO子系统分析-1-概述

    原文网址:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20543672&id=2976189 最近稍微看了下LKML ...

随机推荐

  1. 学习React系列(九)——高阶函数

    定义:高阶组件就是一个函数,且该函数接收一个组件作为参数,并返回一个新的组件. (上一篇已经说过了高阶组件可以用来解决交叉问题) 一.不要改变原始组件,使用组合 class A extends Rea ...

  2. javaScript系列 [04]-javaScript的原型链

    [04]-javaScript的原型链 本文旨在花很少的篇幅讲清楚JavaScript语言中的原型链结构,很多朋友认为JavaScript中的原型链复杂难懂,其实不然,它们就像树上的一串猴子. 1.1 ...

  3. Java进阶篇(二)——抽象类、内部类

    之前在类和对象中我们说到了类的普通特性,本篇将介绍类的一些高级特性. 一.抽象类 抽象类:抽象类是只声明方法的存在而不去具体实现它的类.抽象类不能被实例化,也就是不能创建其对象.使用abstract关 ...

  4. JavaScript 随机数相关算法

    // Math.ceil() 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 // Math.floor() 返回小于等于数字参数的最大整数,对数字进行下舍入 // Math.round ...

  5. [C#].Net Core 获取 HttpContext.Current 以及 AsyncLocal 与 ThreadLocal

    在 DotNetCore 当中不再像 MVC5 那样可以通过 HttpContext.Current 来获取到当前请求的上下文. 不过微软提供了一个 IHttpContextAccessor 来让我们 ...

  6. jq图片展示插件highslide.js简单dom

    今天用用了一款图片展示插件highslide.js,感觉用起来很是舒畅,几乎不用怎么写代码,只需要知道如何写参数就行了. 那么这么牛叉的插件我们该如何用哪,下面我就跟大家讲解一下. 一.引入   首先 ...

  7. Spring Boot简单应用——会员管理系统

    简介 本项目是使用Spring Boot编写的一个简单的会员管理系统. 提供了会员的解决方案,主要有会员模块,管理员模块,礼品模块,商品模块,会员等级模块,生日提醒模块,积分模块,详细模块如下图 准备 ...

  8. cmseasy CmsEasy_5.6_20151009 无限制报错注入(parse_str()的坑)

    来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0137013.html parse_str()引发的注入, //parse_str()的作用是 ...

  9. ●POJ 2774 Long Long Message

    题链: http://poj.org/problem?id=2774题解: 后缀自动机 使用后缀自动机匹配,思路如下: 即如果当前的x字符匹配失败了,就可以从当前已经匹配的串的后缀去继续匹配. 然后不 ...

  10. (转)FIDDER教程

    Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大 ...