第八章 Read Concern
Read Concern选项一般用来保证数据的隔离性、一致性。
1.readPreference和readConcern的区别
readPreference 决定客户端Driver到哪个节点读取数据。
primary:只从primary节点读取数据。primaryPreferred:优先从primary节点读数据,primary节点不可用时,从secondary节点读取数据。secondary:只从secondary节点读取数据。secondaryPreferred:优先从secondary节点读取数据,没有secondary节点时,从primary节点读取。nearest:就近读取数据。
readConcern:决定从节点数据读取到什么样的数据。有可能是脏数据。
local:读取任意数据。(默认从primary节点读取,不能保证数据被复制到大多数节点)avaiable:读取任意数据。(默认从secondary节点读取)majority:读取已经被复制到大多数节点的数据。这个读取级别要求使用WiredTiger存储引擎。
2.写入数据过程
先来看一下,数据被写入副本集群的过程,writeConcern为majority。

还没有执行写操作前的数据状态:Write_pre
执行完写操作后的数据状态:Write0
| 时间点 | 事件 | 最新数据状态 | 满足majority的数据状态 |
|---|---|---|---|
| T0 | Primary执行写操作 | Primary: Write0 Secondary1: Write_prev Secondary2: Write_prev | Primary: Write_prev Secondary1: Write_prev Secondary2: Write_prev |
| T1 | Secondary1执行写操作 | Primary: Write0 Secondary1: Write0 Secondary2: Write_prev | Primary: Write_prev Secondary1: Write_prev Secondary2: Write_prev |
| T2 | Secondary2执行写操作 | Primary: Write0 Secondary1: Write0 Secondary2: Write0 | Primary: Write_prev Secondary1: Write_prev Secondary2: Write_prev |
| T3 | Primary知道Secondary1成功的复制,并返回ack给客户端 | Primary: Write0 Secondary1: Write0 Secondary2: Write0 | Primary: Write0 Secondary1: Write_prev Secondary2: Write_prev |
| T4 | Primary知道Secondary2成功的复制 | Primary: Write0 Secondary1: Write0 Secondary2: Write0 | Primary: Write0 Secondary1: Write_prev Secondary2: Write_prev |
| T5 | Secondary1通过定期复制机制更新它的快照 | Primary: Write0 Secondary1: Write0 Secondary2: Write0 | Primary: Write0 Secondary1: Write0 Secondary2: Write_prev |
| T6 | Secondary2通过定期复制机制跟新它的快照 | Primary: Write0 Secondary1: Write0 Secondary2: Write0 | Primary: Write0 Secondary1: Write0 Secondary2: Write0 |
2.读级别
local级别会读取节点的最新数据,可能会发生回滚,读到脏数据。

| 读取节点 | 时间点 | 数据状态 |
|---|---|---|
| Primary | 在T0之后 | Write0 |
| Secondary1 | 在T1之前 | Write_prev |
| Secondary1 | 在T1之后 | Write0 |
| Secondary2 | 在T2之前 | Write_prev |
| Secondary2 | 在T2之后 | Write0 |
majority:可以保证数据的持久性,不会发生回滚,避免脏读。majority级别需要由存储引擎WiredTiger支持。

| 读取节点 | 时间点 | 数据状态 |
|---|---|---|
| Primary | 在T3之前 | Write_prev |
| Primary | 在T3之后 | Write0 |
| Secondary1 | 在T5之前 | Write_prev |
| Secondary1 | 在T5之后 | Write0 |
| Secondary2 | 在T6之前 | Write_prev |
| Secondary2 | 在T6之后 | Write0 |
本文解析了MongoDB中ReadConcern的概念,对比了readPreference与readConcern的区别,详细介绍了不同readConcern级别如何影响数据的一致性和隔离性。
1138

被折叠的 条评论
为什么被折叠?



