線上一個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