網路分割槽引發的oplog亂序問題
線上一個Secondary節點crash,錯誤原因是出現了 OplogOutOfOrder 錯誤,也就是說Secondary 重放了一條比『已經重放過最新的 oplog』更早的操作,經過分析,發現問題是因網路分割槽導致出現2個 Primary 的問題導致,詳細的過程如下表分析。
說明:Node2、Node1、Node0分別是優先順序為2、1、0的複製整合員。
Timestamp | Node2 | Node1 | Node0 | Notes |
---|---|---|---|---|
t1 | Primary | Secondary | Secondary | Node2被選為主 |
t2 | Primary write A | Seconary sync A | Secondary sync A | Node2上寫入A,並同步到 Node1、Node0 |
t3 | Primary write B | Secondary | Secondary | Node2上寫入 B,但未同步到 Node1、Node0 |
t4 | Primary | Secondary | Secondary | Node2網路與 Node1、Node0隔離,發生新的選舉 |
t5 | Primary | Primary | Secondary | Node1被選為主 |
t6 | Primary | Primary WRITE C | Secondary SYNC C | Node1上寫入 C,同步到 Node0 |
t7 | Primary | Primary WRITE D | Secondary SYNC D | Node1上寫入 D,同步到 Node0 |
t8 | Primary Write E | Primary | Secondary | Node2上寫入 E, a實際上是一個耗時很長的建索引操作結束 |
t9 | Secondary | Primary | Secondary | network recovered, Node1發現 Node2的選舉時間戳更早,請求Node2降級 |
t10 | Secondary | Secondary | Secondary | Node1發現 Node2優先順序更高,並且oplog 足夠,主動降級 |
t11 | Primary | Secondary | Secondary | Node2贏得新的選舉 |
t12 | Priamry | Secondary | Secondary | Node1 Node0 從 Node2同步,先回滾 C D |
t13 | Primary | Secondary | Secondary | Node1從 Node2 同步 B E |
t14 | Primary | Secondary | Secondary | Node0從 Node2 同步 B E ,因為 Node0已經同步過 C D,時間戳比 B 更新,觸發oplogOutOfOrder 錯誤 crash |
上述問題也提給了MongoDB 官方團隊,參考https://jira.mongodb.org/browse/SERVER-25838,這個問題在『3.0及以前的版本』或『使用 protocol version 為0的3.2版本』都有可能發生,但機率很小,使用 MongoDB 的同學不用擔心,我們也是因為MongoDB雲資料庫 使用者比較多,才觸發了一例;MongoDB 3.2引入了 raft 協議,避免了上述場景發生,遇到類似問題的使用者可以升級到 MongoDB-3.2,並使用複製集協議protocoal version 1。
相關文章
- hive Sql的動態分割槽問題HiveSQL
- 資料庫分割槽表分割槽未分配導致的一些問題資料庫
- 重建Windows引導分割槽Windows
- var分割槽不足%15問題處理
- 網路損傷儀WANsim中的亂序功能
- 關於修改分割槽表的問題總結
- kafka指定key進行分割槽遇到的問題Kafka
- MongoDB的複製延遲和網路分割槽MongoDB
- 一個bug引發的Android分割槽儲存的思考Android
- 探索RocketMQ的重複消費和亂序問題MQ
- Oracle分割槽資料問題的分析和修復Oracle
- 【SQL】Oracle交換分割槽中引數without validation引發的症狀(二)SQLOracle
- 【SQL】Oracle交換分割槽中引數without validation引發的症狀(一)SQLOracle
- Oracle有沒有MySQL的分割槽DDL遇到的問題OracleMySql
- fdisk 更改分割槽容量遇到問題,還以為是oracle asm的問題OracleASM
- request的get和post引數亂碼問題
- 如何查詢分割槽表的分割槽及子分割槽
- 4種Kafka網路中斷和網路分割槽場景分析Kafka
- 分割槽表中的maxvalue引數設定
- PostgreSQL/LightDB分割槽表之常見問題SQL
- 分割槽使用與Oracle許可證問題XSOracle
- Windows啟動問題修復(重建活動分割槽)Windows
- mysql 5.7.11查詢分割槽表的一個問題MySql
- 分割槽表放入keep pool,recycle pool的問題及解析
- 關於分割槽表中的全partition掃描問題
- 關於磁碟陣列,分割槽載入的問題(轉)陣列
- 網際網路公司為啥都不用MySQL分割槽表?MySql
- 如何排查網路問題-開發眼裡的網路
- PLSQL根據分割槽表的分割槽名批次truncate分割槽SQL
- JavaScript專題之亂序JavaScript
- MongoDB 如何保證 oplog 順序?MongoDB
- 用oracle的job在搞分割槽的時候,經常出現分割槽沒有自動建的問題Oracle
- rebuild分割槽表分割槽索引的方法Rebuild索引
- Oracle帶區域性分割槽索引的分割槽表刪除舊分割槽新增新分割槽Oracle索引
- oracle交換分割槽所引起的索引失效問題探究測試Oracle索引
- rabbitmq 學習與實踐分享之網路分割槽MQ
- MySQL 指定各分割槽路徑MySql
- Windows系統問題,兩個隱藏分割槽無法刪除問題.Windows