第八章 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 |