MongoDB中local.replset.minvalid集合的作用
在mongodb副本集的local庫中,有一個replset.minvalid集合,這個集合正常情況下會記錄一個OpTime,包含時間戳(ts)欄位和選舉任期(t,如果使用的v1選舉協議)。有時候會有一些額外的欄位,如『begin』、『doingInitialSync:true』等,如下,摘抄自mongodb程式碼註釋:
* { _id:...,
* doingInitialSync: true // initial sync is active
* ts:..., t:... // end-OpTime
* begin: {ts:..., t:...} // a batch is currently being applied, and not consistent
* }
那這個集合是幹什麼用的呢?簡單來說這個集合是Secondary節點用來標識當前是否處於一個一致狀態。當節點已經應用到了這個集合中的OpTime對應的oplog,那麼它是一致的。具體地看,這個集合主要有如下幾個作用:
- 標記當前正在執行initial sync。在initial sync開始時,會在這個集合中寫入一個『doingInitialSync:true』的標記,結束後清除。如果initial sync過程中程式crash了,下次重啟的時候會根據這個標記重新進行initial sync。
- 保證Secondary節點在同步過程能原子性的應用一批oplog(即要麼全部應用,要麼全部不應用)。在Secondary節點同步的過程中,拉取了一批oplog後準備應用時,會在這個集合中寫入這批oplog的時間戳區間。即將集合的OpTime更新成這批oplog的結束OpTime,另外再增加一個『begin』欄位標識這批oplog的起始時間戳。當這一批oplog被成功應用完畢後,會將這個『begin』欄位移除。如果在一批oplog應用途中程式crash了,下次重啟時會通過『begin』欄位檢測到這是一次不完整的batch apply oplog操作,會將oplog截斷到『begin』欄位標識的OpTime之前,以將已應用的部分oplog刪除掉。之所以要這麼做是因為因為Secondary在apply一批oplog的時候是併發進行的,當中可能產生一些中間狀態,需要保證全部apply完畢後才能對外可見。
- 如果Secondary節點在選擇同步源的時候發現自己已經落後太多,已經跟不上其他節點,也會修改minvalid集合,將缺失的oplog時間區間(從自己的最新一條oplog的時間戳到看到的其他節點最舊的oplog時間戳)寫到minvalid集合中,並進入維護模式,變為RECOVERING狀態。從RECOVERING狀態重新回到Secondary狀態時也會檢查是否已應用完了minvalid集合中記錄的OpTime對應的oplog。
- 此外,當節點需要回滾(rollback)時,在回滾之前會獲取minvalid集合的資料進行判斷當前節點是否處於一致的狀態,如果不是則直接assert結束程式。在回滾過程中,會在這個集合中記錄當前同步源節點的最新的oplog的OpTime,以標識當前處於不一致狀態,等到回滾結束後,由同步執行緒追上這個oplog後清除。回滾過程可參加MongoDB副本集回滾那些事
相關文章
- MongoDB之固定集合MongoDB
- MongoDB 集合的插入、更新、刪除操作MongoDB
- mongodb 分片叢集建立分片集合MongoDB
- MongoDB關聯另一個集合MongoDB
- MongoDB建立大量集合測試問題MongoDB
- 技術乾貨| MongoDB時間序列集合MongoDB
- MongoDB之資料查詢(巢狀集合)MongoDB巢狀
- Java中的volatile的作用和synchronized作用Javasynchronized
- C#中的集合C#
- java中的Map集合Java
- MongoDB叢集設定集合分片生效及檢視集合分片情況MongoDB
- MongoDB 中的鎖分析MongoDB
- MongoDB 中的事務MongoDB
- Scala 中的集合(一):集合型別與操作型別
- Vue中key的作用Vue
- JAVA中initCause()的作用Java
- C++中::的作用C++
- css中!important的作用CSSImport
- JavaScript中的作用域JavaScript
- MASM中Group的作用ASM
- MongoDB mongoshake 遷移分片到複製集合MongoDB
- MongoDB如何查oplog.rs集合裡的操作日誌MongoDB
- Java集合中的排序方法Java排序
- Java集合中的框架2Java框架
- Scala 中的集合(四):CanBuildFromUI
- c++ 中的集合類C++
- MongoDB中的定時索引MongoDB索引
- mongoDB中的冪等性MongoDB
- 理解 JavaScript 中的作用域JavaScript
- vue中的css作用域VueCSS
- Java中@Override的作用JavaIDE
- JAVA中 @Override 的作用JavaIDE
- C#中#region,#if的作用C#
- ARM SMMU中 SteamTable的作用
- MongoDB Drop集合不釋放磁碟空間的解決辦法MongoDB
- MongoDB資料庫如何能備份集合的建索引語句?MongoDB資料庫索引
- Python中的不可變集合Python
- python中的集合與字典Python