分布式读

读冲突

分布式中数据库有多份数据,各份数据可能存在不一致性。

mongo 只会写到primary节点上,理论上来说不会有文档冲突,也就是说数据库中的数据都以primary节点为标准。

但是有种情况,一个主节点的数据还没有全部replicate 到secondary 节点,它down 了,这部分数据就有不一致性了,当它重新上线后变成了一个secondary 节点,就会有冲突了。需要将之前的这部分更新应用到cluster中。mongo 提供了rollback的功能来实现https://docs.mongodb.com/manual/core/replica-set-rollbacks/#rollbacks-during-replica-set-failover

并发控制

多版本并发控制(MVCC),不同的用户可以基于相同的document操作,支持并发读写,而不用锁,极大的提高了性能,MySQL,Oracle 等关系型数据库也有对此的支持。一般的做法就是在document级别多维护个version的字段。NoSQL cloudant 也支持MVCC(https://docs.cloudant.com/mvcc.html),但是mongo目前并不支持,有个基于java实现的mongo 并发控制mongo MVCC

Read Concern

mongo3.2 才引入read concern,需要在启动mongod时启动,–enableMajorityReadConcern,或者在配置文件中配置。

  • local,默认值。直接读取当前的MongoDB实例,但是可能会读到副本集中不一致的数据,甚至可能回滚。
  • majority策略读取那些已经被副本集大多数成员所认可的数据,因此数据不可能被回滚。

目前majority只被WiredTiger存储引擎所支持。

读发生回滚,这个地方可能有不理解,为什么读操作会有回滚呢。其实在上面已经提到过了,如果设置成local,不能保证读到的数据都已经被写入到replicate set的各个节点,有可能还只是在primary node上。primary node down重新上线后,就会发生roll back.

Read Preference

默认情况下,mongo从primary node读取数据,但是mongo secondary node不仅可以做数据的备份。同样也可以拿来读取,这样可以极大的提高读性能。可以在每个connection 层面配置读路由的节点:

Mongo.setReadPref(mode, tagSet)
  • mode string类型 有五种选择primary(默认值), primaryPreferred, secondary, secondaryPreferred, or nearest.

    primary:只从primary node读取

    primaryPreferred:先从primary node读取,但是如果secondary节点不可达,则查询primaryPreferred

    secondary:只从secondary读取

    secondaryPreferred: 先从secondary node上读取,如果不可达,则从primary node读取。

    nearest: 从最近的节点读取,在多个datacenter 可能会比较有用

  • tagSet array类型 .指定打了某tag的节点 不能用于primary 模式(不是指primary 节点)

db.getMongo().setReadPref('secondaryPreferred',
                          [ { "dc": "east", "use": "production" }]

如果选用了不是primary节点,必须要接受数据的不一致性,primary 节点的数据是异步复制到secondary 节点上,所以secondary 节点上的数据有可能不是最新的。

总结

mongo 读配置和写配置其实有点类似,都是需要在低延迟和高一致性做权衡,只是mongo中分primary和secondary两种节点,所以配置起来没有cassandra那么的灵活

  1. 低延迟, 应用能够忍受可能的过时数据。使用secondaryPreferred,local concern
  2. 一致性要求高 使用primary,majority

    多数时候可能需要读写一起考虑,关于写可以考虑这篇文章mongo 写分析

mongo 读分析的更多相关文章

  1. [MySQL] 一致性读分析

    MySQL MVCC MySQL InnoDB存储引起实现的是基于多版本的并发控制协议---MVCC(Multi-Version Concurrency Control),基于锁的并发控制,Lock- ...

  2. mongo explain分析详解

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

  3. mongo 写分析

    写操作 复制集 mongo所有的节点都是写入到primary节点,同时写入oplog,secondary 节点会持续的从primary节点上复制oplog的信息,然后根据oplog写数据.second ...

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

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

  5. zepto源码分析·ajax模块

    准备知识 在看ajax实现的时候,如果对ajax技术知识不是很懂的话,可以参看下ajax基础,以便读分析时不会那么迷糊 全局ajax事件 默认$.ajaxSettings设置中的global为true ...

  6. 一文彻底读懂MySQL事务的四大隔离级别

    前言 之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够清楚,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~ 事务 什么是事务? 事务,由一个有限的数据库操 ...

  7. SSD在SQLServer中的应用

        一. 首先,回顾一下 SSD 的读写特性 (1)有限次数写:        (2)随机读性能最好:        (3)顺序读性能好:        (4)顺序写性能差:        (5) ...

  8. ANTLR4权威參考手冊(一)

    写在前面的话: 此文档是对伟大的Terence Parr的著作<the definitive antlr4 reference>的翻译本.致敬!欢迎转载,请注明原地址,请尊重劳动成果.翻译 ...

  9. Mysql抓包工具 - MySQL Sniffer 使用小结 (含带general_log日志)

    在mysql运维工作中,一般会使用tcpdump做一些分析(直接读分析日志比较难以看明白,在数据库连接值高时使用):对于mysql实时的连接监控分析,通常会使用"mysqladmin/sho ...

随机推荐

  1. POJ-1062 昂贵的聘礼---Dijkstra+枚举上界

    题目链接: https://vjudge.net/problem/POJ-1062 题目大意: 中文题 思路: 1是终点,可以额外添加一个源点0,0到任意一节点的距离就是这个点的money,最终求的是 ...

  2. Bellman-Ford算法的改进---SPFA算法

    传送门: Dijkstra Bellman-Ford SPFA Floyd 1.算法思想 Bellman-Ford算法时间复杂度比较高,在于Bellman-Ford需要递推n次,每次递推需要扫描所有的 ...

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

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

  4. 一 Django模型层简介(一)

    模型 django提供了一个强大的orm(关系映射模型)系统. 模型包含了你要在数据库中创建的字段信息及对数据表的一些操作 使用模型 定义好模型后,要告诉django使用这些模型,你要做的就是在配置文 ...

  5. [Other] Nuget 构建服务器与常用命令

    公司出于某些原因需要自己在内部网络搭建一个私有的 Nuget 服务器,而且要运行在 Linux服务器上面.如果说 Windows 下搭建的话很简单,直接在项目当中引入 Nuget 的库就 OK,这儿的 ...

  6. 【转】C++ Vector(向量容器)

    转自:https://blog.csdn.net/studentyyl/article/details/21177445 vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩 ...

  7. [LeetCode] Maximum Length of Repeated Subarray 最长的重复子数组

    Given two integer arrays A and B, return the maximum length of an subarray that appears in both arra ...

  8. Anaconda入门安装教程

    Anaconda 是什么? Anaconda 是一个可用于科学计算的 Python 发行版,支持 Linux.Mac.Windows系统,内置了常用的科学计算包.它解决了官方 Python 的两大痛点 ...

  9. ●线段树题之wows

    ●模拟考试的一道似乎是学长出的题,还不错,挺考代码能力的.以此记录. ●题目以被上传(改了改说法),6128 Lence的方块们 ● (像手纸一样长的贴图……) ●题目大意: 有横向排布的n个点,每个 ...

  10. 习题 7-3 uva211

    题意:给你28个多米勒牌,要求刚好铺满一个7x8的图,输出所有答 案.每个牌只能使用一次 思路: 对每个位置分别搜索其右边 和 下边. 但是在中途,细节上有点问题.最开始想的是搜到最后一个点输出答案, ...