深入浅析mongodb的一致性模型及其实现_Ricky的技术小站的博客-CSDN博客


本站和网页 https://blog.csdn.net/qianfeng_dashuju/article/details/93626406 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

深入浅析mongodb的一致性模型及其实现_Ricky的技术小站的博客-CSDN博客
深入浅析mongodb的一致性模型及其实现
Ricky的技术小站
于 2019-06-25 16:01:36 发布
2446
收藏
分类专栏:
个人技术分享
个人技术分享
专栏收录该内容
1403 篇文章
34 订阅
订阅专栏
  我们已经知道,在zookeeper中,写请求转发给leader,读请求follower自己处理,没有sync的情况下达不到linearizability。Mongodb呢?官方文档是这么说的,“MongoDB is consistent by default: reads and writes are issued to the primary member of a replica set. ”
  这句话误导了我很多年,让我一直以为默认情况下,读写操作都发给primary,这总应该linearizable了吧?结果得知真相之后让我眼泪掉下来。
  Write Concern,Read Concern和Read Preference
  Mongodb能够提供灵活的一致性,原因在于它可以设置不同的Write Concern,Read Concern和Read Preference。
  Write Concern决定了对数据库写入操作的确认级别,比如是否大多数节点都写入成功了才向客户端返回确认。
  Read Concern决定了读取操作的返回数据的隔离级别,比如是否将大多数节点都希尔成功的数据返回给读操作。
  Read Preference决定了从哪个节点进行读取操作。
  默认情况
  在mongodb 4.0版本中,默认的Read Preference是primary,也就是读写操作都发送给primary。
  默认的Write Concern是w:1,对于副本集来说,就是只要primary确认写入就可以了。所以你以为你写入成功了,但是primary没有把数据分发出去之前就挂掉了,那么你以为写入成功的数据,就消失得无影无踪了。默认的Read Concern呢?居然是local!所以你从primary读到了一个数据x,在x还没被分发时primary挂了,新的primary没有x的信息,那么再从新的primary读数据时,x就好像从来没存在过一样。
  所以,默认情况下,mongodb的一致性和Linearizability差得远呢。
  Majority
  那把Write Concern和Read Concern都设置为majority会怎么样呢?
  Majority的Write Concern指的是数据分发给副本集的大多数成员之后再确认。
  Majority的Read Concern指的是读取到的数据是被副本集大多数成员确认的。
  想象以下情况:
  N1是副本集的primary,N2和N3是两个secondary。客户端S1读写请求都发给N1。
  N1突然发生了网络隔离,不能和N2,N3通信了。
  N2被选举为primary,但是N1对此一无所知,仍然认为自己是primary,所以此时副本集里实际上有两个primary。
  客户端S2以majority的Write Concern写入新的数据到N2。
  N2将数据写入N3后,向S2返回写入确认。
  客户端S1以majority的Read Concern从N1读取数据。
  很容易看出,这种情况下是没有linearizability的。
  
  其实,Mongodb还有一种更糟的情况,N1和N2同时作为primary的时候,S1有可能写请求发给N2,读请求发给N1。这样它连自己写入的数据都读不出来。因为mongodb的driver一般都需要连接池,而mongodb又有Read Preference这种实现读写分离的选项,所以实现起来就很麻烦。driver除了官方的以外,还有开源社区维护的,没注意到这些细节的话,很容易出现这种问题。
  而且早期的mongodb中,根本没给你检测stale primary的机会。。。
  https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst#using-setversion-and-electionid-to-detect-stale-primaries
  Linearizable Read Concern
  Linearizable Read Concern是mongodb 3.4中出现的,为了解决上面的问题。有了linearizable的Read Concern,终于可以读取副本集中最新的数据啦。Linearizable Read Concern有一些使用上的限制:
  只能用在primary的read操作上
  查询条件必须唯一的确定一个document
  linearizable Read Concern的实现原理是在read操作之前添加了一个空的写操作,如果当前的primary是stale的,空的写操作就会失败,从而被检查出来。实际上和zookeeper的sync如出一辙殊途同归。
  Causal Consistency
  上面的例子中,client的读写都发给了primary,不过总让secondary闲着也不太好,不如搞个读写分离吧。
  不过一开始的读写分离是容易出现问题的:
  N1是副本集的primary,N2和N3是两个secondary。
  客户端S设置Read Preference,可以让读请求发给secondary,写请求发给primary。
  S在N1上以majority的Write Concern写入订单数据x。
  N1把x分发给了N2之后,判定超过半数了,返回成功。
  S在N3上读取x,发现没有这个订单。
  
  这真是非常尴尬,自己写的数据,自己都看不到。所以mongodb 3.6增加了Causal Consistency一致性。
  为了实现它,mongodb每个节点都需要能获取正确的时间。时钟是分布式系统非常重要的组成部分,在其他文章中我们会着重介绍。
  现在mongodb这样工作:
  N1是副本集的primary,N2和N3是两个secondary。
  客户端S设置Read Preference,可以让读请求发给secondary,写请求发给primary。
  S在N1上以majority的Write Concern写入订单数据x,记录时间T。
  N1把x分发给了N2之后,判定超过半数了,返回成功。
  S在N3上读取x,读取操作带有T作为参数。
  N3没有时间T的操作,开始等待。
  N3从N1得到x的数据,意味着N3拥有了T时间的数据。
  N3将数据返回给S。
  
  为了达到Causal Consistency,mongodb的客户端需要额外进行一些操作,例如开启client session,同时也有相应的一些限制,例如同一时刻只能有一个线程在client session中执行操作。
Ricky的技术小站
关注
关注
点赞
收藏
评论
深入浅析mongodb的一致性模型及其实现
  我们已经知道,在zookeeper中,写请求转发给leader,读请求follower自己处理,没有sync的情况下达不到linearizability。Mongodb呢?官方文档是这么说的,“MongoDB is consistent by default: reads and writes are issued to the primary member of a replica set....
复制链接
扫一扫
专栏目录
MongoDB如何确保一致性
杨春建的博客
09-24
3464
原文地址:https://www.mongodb.com/faq
How does MongoDB ensure consistency?
Back to Table of Contents
MongoDB is consistent by default: reads and writes are issued to the primary member of a replica set.
【理论篇】浅析分布式中的 CAP、BASE、2PC、3PC、Paxos、Raft、ZAB
最新发布
码农札记
11-19
146
在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟、丢失、重复、乱序,还有网络分区)等情况。基于此,产生了适应各种场景的一致性 算法,解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致, 并且保证不论发生以上任何异常,都不会 破坏整个系统的一致性。
参与评论
您还未登录,请先
登录
后发表或查看评论
[mongodb文档]分布式一致性
weixin_34289454的博客
06-05
87
[mongodb文档]分布式一致性(一)[1]一致性模型对于一个分布式数据库来说是至关重要的。这里我们将专门一个专题的形式来讲解一些主题:例如:针对一些具体的应用场景应该使用什么样的模型。首先从一些最基本的理论知识开始。CAPCAP理论指出任何一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availibility)和分区容错性性(Partition T...
读策略majority
zxwjx的专栏
05-12
476
目录1 性能2 可用性3 示例4 存储引擎的支持5 读策略"majority"和事务5 读策略"majority"和聚合5 读自己写入的数据6 禁用读策略Majority
进入MongoDB中文手册(4.2版本)专栏
对于与多文档事务无关的读取操作,读策略"majority" 确保大多数副本集成员已确认读取的数据(即,读取的文档是持久化的并且保证不会回滚)。
对于多文档事务中的操作,仅当事务以写策略“majority”提交时,读策略"majority"才提供其保证。否则, 读策略"majority"不能保证
故障案例--mongodb副本集write concern为majority的一个坑
cug_jiang126com的专栏
08-23
8487
故障现象:
一个副本集下四个节点,一个primary,两个Secondary,一个arbiter,其中将一个Secondary关闭后,修改primary节点的密码,这时修改命令会卡住直到超时失败。
udb-aqmp5a:PRIMARY> db.changeUserPassword("root","123123")
2016-08-23T17:05:30.879+0800 E QUERY
MongoDB读隔离Majority和Linearizable的区别
qq_37135640的博客
10-10
472
看了很多文章包括文档都没怎么理解Read Concern这两个级别的具体区别,最后还是在Mongo的git里翻到了最有力的解释。
15.MongoDB的一致性(读关注与写关注)
mijichui2153的博客
08-22
1285
https://docs.mongodb.com/manual/reference/read-concern/
https://docs.mongodb.com/manual/reference/write-concern/
https://docs.mongodb.com/manual/core/replica-set-write-concern/
https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/
一、
mongodb集群强一致性问题
kuangle的博客
01-14
783
mongodb集群带来的一致性问题
关键词
mongodb、集群、强一致性问题、Write Concern、事务
环境
mongoDB version: 4.0.18
mongoDB集群:一主两从(主写从读)
golang version: 1.14.4
驱动库: gopkg.in/mgo.v2@v2.0.0
问题描述
这几天线上环境反馈了一个小小的bug,一个更新操作无法正常执行。我的更新业务是先写更新,再读取刚刚更新的内容,再写入到另外一个表。表现出得bug就是,写入另外一个表的数据是旧的。
根据分
故障案例--mongodb writeconcern为majority时的又一个bug
cug_jiang126com的专栏
04-14
2156
前言
之前的文章有提到过majority的一个坑,还谈不上bug,链接如下点击打开链接
故障现象
majority下应用层一直报错,但实际数据写入成功,包括主从节点都成功;w设置为1以后没有报错,写入成功
044dd16e-7706-4a49-b4ff-73d86a99d6fd:PRIMARY> db.setWriteConcern({w:"majority",wtimeout:30
技术干货| MongoDB事务原理
MongoDB中文社区
06-20
4421
MongoDB作为领先的NoSQL,为了支撑更多的需求场景,也在不断完善其功能。从早期支持大吞吐量读/写操作的MMAPv1存储引擎,到引入支持高并发操作的WiredTiger存储引擎,以及对事务功能的持续演进,MongoDB不仅保留了最初的架构优势,同时又汲取了其他数据库的优点。MongoDB从 3.0版本引入WiredTiger存储引擎之后开始支持事务,MongoDB 3.6之前的版本只能支持单文档的事务,从MongoDB 4.0版本开始支持复制集部署模式下的事务,从MongoDB 4.2版本开始支持分片
mongodb主从同步、数据一致性和高可用分析
whycold的专栏
04-08
1829
mongodb主从同步、数据一致性和高可用分析
mongodb一致性协议_mongo的事务一致性如何保持
weixin_35149268的博客
12-30
294
Upsert的意思是没有数据的时候加入一条,那么“多条数据”指的是什么呢?If set to true, creates a new document when no document matches the query criteria.回到一致性和这个文章上,中国社区非常给力,官方文档也有中文翻译了!这篇文章是为了模拟出传统数据库中 ACID 里多个操作的 Atomic 和 Consisten...
MongoDB中的一致性总结
jeff_fangji的专栏
06-17
4000
根据Write Concern, Read Concern和Read Preference, MongoDB可以有多种不同的一致性。下面是我总结的内容,如有不对的地方,请帮忙指正。
Mongodb关于读取的问题(Read Concern)和Write Concern
qq_33642970的博客
02-03
1859
readConcern选项允许您控制从复制集和复制集碎片读取的数据的一致性和隔离属性。
通过有效地使用写关注点和读关注点,您可以适当地调整一致性和可用性保证的级别,例如等待更强的一致性保证,或者放松一致性要求以提供更高的可用性。
MongoDB驱动程序更新为MongoDB 3.2或更新后的支持指定读的关注。
阅读关注水平
以下是已阅读的关注程度:
level
Description...
如何利用MongoDB实现高性能,高可用的双活应用架构?
郁闷阳光的专栏
04-02
2127
【51CTO.com原创稿件】投资界有一句至理名言——“不要把鸡蛋放在同一个篮子里”。说的是投资需要分解风险,以免孤注一掷失败之后造成巨大的损失。随着企业服务窗口的不断增加,业务中断对很多企业意味着毁灭性的灾难,因此,跨多个数据中心的应用部署成为了当下最热门的话题之一。如今,在跨多个数据中心的应用部署最佳实践中,数据库通常负责处理多个地理区域的读取和写入,对数据变更的复制,并提供尽可能高的可用性、...
Mongodb事务
zzy19920502的博客
03-21
1059
在前一篇《理解数据库的事务,ACID,CAP和一致性》我已经将数据库的一些基本概念包括事务,ACID,CAP,一致性,隔离性等都深入的介绍了一遍,而此篇主要是针对MongoDB数据库系统做一下深入的了解,主要希望弄清楚如下几个问题:
MongoDB是如何实现事务的?有哪些局限?
MongoDB的一致性是如何保证的?
MongoDB的事务
首先我们需要知道MongoDB是有多种存储引擎的,不同的存储引擎在实现ACID的时候,使用不同的机制。而Mongodb从3.0开始默认使用的是WiredTiger引擎,本文
MongoDB的一致性——Raft
深海微澜
11-13
2445
概述
Raft : raft is a consensus algorithm for managing a replicated log.
分布式存储系统通常通过维护多个副本来进行容错,提高系统的可用性。要实现此目标,就必须要解决分布式存储系统的最核心问题:维护多个副本的一致性。
一致性(consensus): 它是构建具有容错性(fault-tolerant)的分布式系统的基础。 在一个...
MongoDB 入门教程实战学习笔记-26-mongo 读取时的隔离级别
热门推荐
12-24
1万+
read-concern
“readConcern” 选项允许您控制从副本集和副本集分片读取的数据的一致性和隔离属性。
通过有效使用写入关注点和读取问题, 您可以根据需要调整一致性和可用性保证的级别, 例如等待更强的一致性保证, 或放松一致性要求以提供更高的一致性要求可用性。
mongodb 驱动程序更新为 mongodb 3.2 或更高版本的支持, 指定读取注意事项。
读取的级别
local
查...
mongodb中走过的那些坑
yue492008824的专栏
04-19
3396
吐槽一下windows的服务器那叫一个难用,
公司的爬虫需要跑在一台windows的服务器上,mongo本来自然也要装在windows上,想往常一样现在安装,然后问题就来了,只能本地连,于是修改配置文件如下:
# mongodb.conf
# Where to store the data.
# dbpath=/var/lib/mongodb
dbpath=C:\Program File
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:编程工作室
设计师:CSDN官方博客
返回首页
Ricky的技术小站
CSDN认证博客专家
CSDN认证企业博客
码龄5年
暂无认证
652
原创
2万+
周排名
2万+
总排名
148万+
访问
等级
2万+
积分
1180
粉丝
1282
获赞
244
评论
5568
收藏
私信
关注
热门文章
C语言学习路线图
70370
聚类方法的区别解读:各种聚类分析
48549
浅析微信支付:如何使用沙箱环境测试
38753
【Python数据分析基础】: 异常值检测和处理
32718
Python打印对象的全部属性
31081
分类专栏
大数据学习
302篇
面试题系列
80篇
前端技术总结
23篇
笔记
25篇
视频课程
5篇
个人技术分享
1403篇
最新评论
http cookie的domain使用
a_littleStory:
图片没显示出来
详解数组的下标
智慧派蒙:
并不能
给go项目打最小docker镜像,足足降低99%
xwklib:
只能用离谱来形容
Const的几大用法(常用)
黄绿色盲:
写的很清晰 各种用法都总结到位了 nice
SpringBoot2.x教程——SpringBoot中整合Redis实现持久化缓存
一一哥Sun:
这是你写的吗?要点脸行不行?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
云计算该怎么学——浅谈Linux IO
给go项目打最小docker镜像,足足降低99%
有了这款Linux网络延迟排查方法,再也不用加班了 ~
2022年24篇
2021年4篇
2020年601篇
2019年720篇
2018年562篇
2017年4篇
目录
目录
分类专栏
大数据学习
302篇
面试题系列
80篇
前端技术总结
23篇
笔记
25篇
视频课程
5篇
个人技术分享
1403篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值