1. 写事务
1.1 什么是 writeConcern ?
writeConcern 决定一个写操作落到多少个节点上才算成功。writeConcern 的取值包括:
- 0:发起写操作,不关心是否成功
- 1~集群最大数据节点:写操作需要被复制到指定节点数才算成功
- majority:写操作需要被复制到大多数(超过半数)节点上才算成功
- all:全部节点都写入才返回成功,弊端是若某个节点出现问题会导致一直处于全部阻塞中。
发起写操作的程序将阻塞到写操作到达指定的节点数为止。
注意:
默认MongoDB所谓的“写入成功”指写入到节点内存即算成功,无需等待数据真实写入硬盘(落盘)。
journal则定义如何才算成功:
writeConcern 设置代码格式如下:
{
writeConcern:{w:"majority",j:true,wtimeout:3000}
}
<aside>
💡
注意事项
- 虽然多于半数的 writeConcern 都是安全的,但通常只会设置 majority,因为这是等待写入延迟时间最短的选择。
- 不要设置 writeConcern 等于总节点数,因为一旦有一个节点故障,所有写操作都将失败。
- writeConcern 虽然会增加些操作的延迟时间,但并不会显著增加集群压力,因此无论是否等待,写操作最终都会复制到所有节点上。设置 writeConcern 只是让写操作等待复制后再返回而已。
- 应对重要数据,应使用 {w:“majority”},普通数据可以应用{w:1} 以确保最佳性能。
</aside>
2. 读数据
在读取数据的过程中,我们需要关注以下两个问题:
- 从哪里读? 关注数据节点位置
- 什么样的数据可以读?关注数据的隔离性
第一个问题是由 readPreference 来解决。
第二个问题是由 readConcern 来解决。