Mongodb事务
Mongodb 写操作事务
writeConcern
writeConcern 决定一个写操作落到多少个节点上才算成功。
writeConcern 的取值包括:
• 0:发起写操作,不关心是否成功;
• 1~n (集群最大数据节点数):写操作需要被复制到指定节点数才算成功;
• majority:写操作需要被复制到大多数节点上才算成功。
发起写操作的程序将阻塞到写操作到达指定的节点数为止
属性
w
- all
- 0~n
- majority
journal
( j: true / false)
writeConcern是决定写操作落到多少个节点才算成功,
journal定义如何才算成功;
- journal: true 表示写到journal文件才算成功
- journal: false 表示写入内存就算成功
case: 对于5个节点的复制集来说,写操作落到多少个节点上才算是安全的?
1,2,3,4,5,majority
答案: 3 4 5 majority
Mongodb shell 实验
db.amber.insert( {count: 1}, {writeConcern: {w: 1, wtimeout:3000, j: true }})
注意事项
- 虽然多于半数的 writeConcern 都是安全的,但通常只会设置 majority,因为这是等待写入延迟时间最短的选择;
• 不要设置 writeConcern 等于总节点数,因为一旦有一个节点故障,所有写操作都将失败;
• writeConcern 虽然会增加写操作延迟时间,但并不会显著增加集群压力,因此无论是否等待,写操作最终都会复制到所有节点上。设置 writeConcern 只是让写操作等待复制后再返回而已;
• 应对重要数据应用 {w: “majority”},普通数据可以应用 {w: 1} 以确保最佳性能。
读操作事务(readPreferen)
主要解决以下问题:
- 什么是 readPreference
- readPreference 的使用场景
在读取数据的过程中我们需要关注以下两个问题:
• 从哪里读?
回答: readPreference 来解决
• 什么样的数据可以读?
回答: readConcern 来解决
什么是readPreference?
readPreference 决定使用哪一个节点来满足正在发起的读请求。可选值包括:
• primary: 只选择主节点;
• primaryPreferred:优先选择主节点,如果不可用则选择从节点;
• secondary:只选择从节点;
• secondaryPreferred:优先选择从节点,如果从节点不可用则选择主节点;
• nearest:选择最近的节点;
readPreference 场景举例
• 用户下订单后马上将用户转到订单详情页——primary/primaryPreferred。因为此时从节点可能还没复制到新订单;
• 用户查询自己下过的订单——secondary/secondaryPreferred。查询历史订单对时效性通常没有太高要求;
• 生成报表——secondary。报表对时效性要求不高,但资源需求大,可以在从节点单独处理,避免对线上用户造成影响;
• 将用户上传的图片分发到全世界,让各地用户能够就近读取——nearest。每个地区的应用选择最近的节点读取数据。
readConcern
什么是 readConcern?
在 readPreference 选择了指定的节点后,readConcern 决定这个节点上的数据哪些是可读的,类似于关系数据库的隔离级别。可选值包括:
• available:读取所有可用的数据;
• local:读取所有可用且属于当前分片的数据;
• majority:读取在大多数节点上提交完成的数据;
• linearizable:可线性化读取文档;
• snapshot:读取最近快照中的数据;
常用的是local, 和majority