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

前面的博文把MongoDB的一些基础介绍,以及MongoDB的一些组件的使用等博文,从该篇开始,开始学习MongoDB的操作内容。首先我们需要了解一些内容

写入关注(writeConcern)

官方文档

在前面的博文中,介绍了MongoDB shell现有的所有方法,我们经常看到有的方法可以传入一个参数:writeConcern(写入关注),所以在说明MongoDB增加数据操作之前,我们需要先了解一下MongoDB的写入关注概念:

写入关注指的是MongoDB连接报告写入操作成功时的写入保障等级,写入关注程度越强,保障等级越高。

其概念是,写入关注程度较高时,MongoDB必须等到数据完全写入磁盘后才做出响应,当写入程度较低时,MongoDB会在成功调用写入的修改后就会做出响应。从这一句话我们可以分析出其优缺点:当写入关注程度高时,MongoDB必须等待一段时间才能响应,因此此类的关注等级适合那些数据非常重要,必须保证数据的正确性的数据,该类数据可以承受数据的时效慢的问题,比如关于金钱的修改操作等。而写入关注程度较低时,则是不关注写入操纵是否成功,直接返回结果,此类写入关注适合哪些要求时效性高,数据不太重要的操作,比如日志记录等等。

下面是MongoDB的写入关注等级表

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

从上面可以看出,写入关注等级越高,其数据的安全性就越高,当然需要的时间也越长,对于操作的写入关注如何取舍,这要根据数据的重要性,其处理的功能来评定了。

读取关注(readConcern)

官方文档

3.2版本以后支持读取关注

读取关注允许您控制从副本集和副本集分片读取的数据的实时性,一致性和隔离性。

通过有效使用写入关注和读取关注,可以适当调整一致性和可用性保证的级别,例如等待更强的一致性保证,或者放松一致性要求以提供更高的可用性。

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

级别描述
“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操作从具有最少网络延迟的副本集的成员读取,而不考虑成员的类型。

getLastError

我们可以通过getLastError命令来配置数据库连接在写入关注和超市方面的行为,该命令是一个文档,描述了用于数据库请求的选项。当我们修改MongoDB数据库中的文档时,在该命令中指定了链接将要为操作完成等待多长时间、是否使用日志功能等。

若运行getLastError,可以使用runCommand()方法,其语法如下:

dbname.runCommand({ getLastError:1,
                    w:1,
                    j:true,
                    wtimeout:1000
                   }
                )

geLastError可设置选项

选项描述
w指定数据库链接的写入关注等级
wtimeout指定写入操作完成等待多长时间,单位毫秒;将这个值与正常的链接超时时间想加
j布尔值,如果为true,写入请求将等到日志同步完成后再返回

getLastError返回对象属性

属性描述
ok布尔值,返回getLastError命令是否成功完成
err描述错误的字符串,在最后一个请求没有发生错误时为null
errmsg2.6版本新功能,errmsg包含了错误的描述,只有在前面操作出现错误时才会出现。
code最后一次操作的错误代码
connectionId连接ID
lastOp在最后一个操作是对副本集车管员的写入或更新操作时,为存储请求修改的oplog中的option时间戳
n最后一次操作时更新或删除操作时,为更新或删除的文档数
syncMillis等待写入磁盘操作时花费的毫秒数。
shards当对一个分片集群进行写入操作时,shards会标识要写入操作的片。只有当写入操作针对多个片时,该参数才会出现。
singleShard当对一个分片集群进行写入操作时,shards会标识要写入操作的片。如果写入操作只有一个片时,则只能出现singleShard。
updatedExisting布尔值,如果最后一个操作时更新操作时,且至少影响到一个文档,同时没有导致upsert时,这个属性将为true
upserted如果最后一个操作为更新请求且导致的时插入,该属性将为插入的文档的ObjectId
wnote布尔值,如果错误与写入关注有关,则为true
wtimeout布尔值,返回是否因wtimeout设置而超时,
waited如果最后一个曹祖音wtimeout设置而超时,则为超时前等待的毫秒数
wtime最后一次操作完成前等待的毫秒数
writtenTo如果写入到副本集,则writtenTo是一个数组,该数组包含根据命令中w字段的值确认先前写入操作的成员的主机名和端口号。

待补充

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值