一致性问题

因果一致性要解决的问题(Causal Consistency and Read and Write Concerns)?

借助MongoDB的因果一致性客户端会话,读写问题的不同组合可提供不同的 因果一致性保证。如果定义因果一致性以表示耐久性,则下表列出了各种组合提供的特定保证:

阅读关注 写关注 阅读自己的文章 单调读 单调写 先读后写
"majority" "majority"
"majority" { w: 1 }
"local" { w: 1 }
"local" "majority"

如果因果一致性表示持久性,那么从表中可以看出,只有具有"majority"读关注度的读取操作和具有"majority"写关注度的写入操作才能保证所有四个因果一致性保证。也就是说, 因果一致的客户端会话只能保证以下方面的因果一致性:

  • 定义一致性名词
Guarantees 描述
阅读您的文章 读操作反映了在其之前的写操作的结果。
单调读 读取顺序,后读的内容一定比先读的内容新或者相同
单调写 后续发送的写,必须在前面发送的写完成后才能执行
写跟随读 写入时的数据状态必须包含之前的读取操作的数据状态

隔离级别

  • 阅读未提交
    使用"local""available" 读取关注点的客户端可以读取数据,这些数据随后可能会在副本集故障转移期间回滚
    读未提交是默认的隔离级别,适用于 mongod独立实例以及副本集和分片群集。
  • 阅读未提交的单文档原子性
    对于单个文档,写操作是原子的。即,如果写操作正在更新文档中的多个字段,则读操作将永远不会看到仅更新了某些字段的文档。但是,尽管客户端可能看不到部分更新的文档,但未提交的读取意味着并发的读取操作仍可以在使更改持久化之前看到更新的文档。
  • 读取未提交和写入多个文档
    当单个写入操作(例如 db.collection.updateMany())修改多个文档时,每个文档的修改都是原子的,但整个操作不是原子的。

对于需要原子性地读写多个文档(在单个或多个集合中)的情况,MongoDB支持多文档事务:

在版本4.0中,MongoDB支持副本集上的多文档事务。
在4.2版中,MongoDB引入了分布式事务,它增加了对分片群集上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。

写关注

:当写入关注程度高时,MongoDB必须等待一段时间才能响应,因此此类的关注等级适合那些数据非常重要,必须保证数据的正确性的数据,该类数据可以承受数据的时效慢的问题,比如关于金钱的修改操作等。而写入关注程度较低时,则是不关注写入操纵是否成功,直接返回结果,此类写入关注适合哪些要求时效性高,数据不太重要的操作,比如日志记录等等。
下面是MongoDB的写入关注等级表

等级 描述
-1 忽略网络错误
0 不要求进行写入确认
1 要求进行写入确认
2 要求以写入到副本集的主服务器和一个备用服务器
majority 要求已写入到副本集中的大多数服务器中

读关注

读取关注允许您控制从副本集和副本集分片读取的数据的实时性,一致性和隔离性。
通过有效使用写入关注和读取关注,可以适当调整一致性和可用性保证的级别,例如等待更强的一致性保证,或者放松一致性要求以提供更高的可用性。

现在读取关注分为了一下几个级别:

级别 描述
“local” 查询返回实例的最新数据。不保证数据已被写入大部分副本集成员(即可能回滚)。 默认操作:1.反对读取主节点 2. 如果读取与因果一致的会话相关联,反对读取从节点。local可用于与因果一致的会话(causally consistent sessions.)。
“available” 3.6版本中的新功能。查询返回实例的最新数据。不保证数据已被写入大部分副本集成员(即可能回滚)。 如果读取与因果一致的会话没有关联,则默认读取从节点。 对于分片集合,”available”读取关注提供了可能在各种读取关注点之间的最低延迟读取,但是以一致性为代价,因为”available”读取关注可以返回独立文档。 可用的阅读关注无法用于因果一致的会话。
“majority” 查询返回已由大多数副本集成员确认的实例最新数据。读取操作返回的文档即使在发生故障时也是持久的。 要使用”majority”读取关注级别,副本集必须使用WiredTiger存储引擎( WiredTiger storage engine)和选举协议版本1( protocol version 1)。 阅读关注的”majority”可以使用与会话一致的会话。
“linearizable” 查询返回的数据反映了在读取操作开始之前完成的所有成功的多数确认写入操作。在返回结果之前,查询可能会等待并行执行写入操作,以传播到大多数副本集成员。 如果大部分副本集成员在读取操作后崩溃并重新启动,如果writeConcernMajorityJournalDefault设置为默认状态true时,则读取操作返回的文档是持久的。 在writeConcernMajorityJournalDefault设置为false的情况下,MongoDB不会等待w:”majority”写入到磁盘日志中,然后再确认写入。因此,在给定副本集中的大多数节点的瞬时丢失(例如,崩溃和重新启动)的情况下,大部分写入操作可能会回滚。 您值可以为主节点的读取操作指定”linearizable”的读取关注 阅读关注linearizable不适用于因果关系一致的会话。 linearizable读取关注保证仅适用于读取操作指定唯一标识单个文档的查询过滤器。

读取偏好(Read Preference)

阅读偏好描述mongodb客户端如何将读取操作路由到副本集的成员。

注:

  1. 指定读取偏好时要小心:除主节点之外的其他模块可能会返回过时数据,因为使用异步复制时,从节点中的数据可能不会反映最近的写入操作。
  2. 读取偏好不会影响数据的可见性;即客户端可以在确认或传播给大多数副本集成员之前看到写入结果: 无论写入问题如何,使用”local” 或”available”读取关注的其他客户端都可以在写入操作被确认给发出客户端之前看到写入操作的结果。 使用”local” 或”available”读取关注的客户端可以读取可能随后回滚的数据。
阅读偏好 描述
primary 默认模式。所有操作都从当前副本集的主节点中读取。
primaryPreferred 在大多数情况下,读取操作从主节点中读取,但如果主节点不可用,操作会从从节点读取
secondary 所有的读取操作都从当前副本集的从节点中读取
secondaryPreferred 在大多数情况下,读取操作从从节点中读取,单数如果没有从节点是活跃有效的,从主节点中读取
nearest 操作从具有最少网络延迟的副本集的成员读取,而不考虑成员的类型。

客户会话和因果一致性保证

为了提供因果一致性,MongoDB 3.6启用了客户端会话中的因果一致性。因果一致的会话表示具有"majority" 读关注点的读操作和具有"majority"写关注点的写操作的关联序列具有因果关系,这由它们的顺序反映出来。 应用程序必须确保一次只有一个线程在客户端会话中执行这些操作。

对于因果相关的操作:

参考资料:
MongoDB: 通过ReadConcern 来处理备库一致读的问题

MongoDB学习笔记(九)——Write Concern、getLastError、Read Concern、Read Preference

MongoDB writeConcern和readConcern原理

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342