天天看點

網絡分區引發的 oplog 亂序問題

線上一個secondary節點crash,錯誤原因是出現了 oplogoutoforder 錯誤,也就是說secondary 重放了一條比『已經重放過最新的 oplog』更早的操作,經過分析,發現問題是因網絡分區導緻出現2個 primary 的問題導緻,詳細的過程如下表分析。

說明:node2、node1、node0分别是優先級為2、1、0的複制內建員。

timestamp

node2

node1

node0

notes

t1

primary

secondary

node2被選為主

t2

primary write a

seconary sync a

secondary sync a

node2上寫入a,并同步到 node1、node0

t3

primary write b

node2上寫入 b,但未同步到 node1、node0

t4

node2網絡與 node1、node0隔離,發生新的選舉

t5

node1被選為主

t6

primary write c

secondary sync c

node1上寫入 c,同步到 node0

t7

primary write d

secondary sync d

node1上寫入 d,同步到 node0

t8

primary write e

node2上寫入 e, a實際上是一個耗時很長的建索引操作結束

t9

network recovered, node1發現 node2的選舉時間戳更早,請求node2降級

t10

node1發現 node2優先級更高,并且oplog 足夠,主動降級

t11

node2赢得新的選舉

t12

priamry

node1 node0 從 node2同步,先復原 c d

t13

node1從 node2 同步 b e

t14

node0從 node2 同步 b e ,因為 node0已經同步過 c d,時間戳比 b 更新,觸發oplogoutoforder 錯誤 crash