MongoDB 副本集丟失數據的測試

在MongoDB副本集的測試中發現了一個丟數據的案例。mongodb

1. 概要描述

測試場景爲:一主一從一驗證數據庫

測試案例 服務器

 step1 :關閉從副本;測試

step 2 ;向主副本中插入那條數據;spa

step 3 :關閉主副本;code

step 4 :開啓輔助副本,此副本升級爲主副本,這是後會看到新的主副本沒有剛纔插入的幾筆數據。blog

----測試時,請注意測試步驟。table

step 5 :原主節點 再次加入到集羣中後,會變成新的輔助副本。測試插入的數據會產生回滾。class

 

2. 具體的測試步驟 

(1)測試服務器,原測試環境

主Server:Port 副Server:Port 見證Server:Port
XXX.XXX.XXX.124:27220 XXX.XXX.XXX.123:27221 XXX.XXX.XXX.134:27220

 

(2)測試步驟

Step 1 向主數據庫(XXX.XXX.XXX.124:27220),插入如下數據,執行時間要長一些。test

for(var i = 0; i < 100000; i++) { db.order0522.insert({a: i});};

 

Step 2 在上述命令執行的過程當中,關於副主Server上的mongodb服務,服務命名爲mongodboplogtest.service

systemctl stop mongodboplogtest.service

 

Step 3.查詢主副本上數據庫insert的數據量,爲100000.命令徹底插入。

 

Step 4.關閉主副本上的Mongodb 服務,服務命名爲mongodboplogtest.service

systemctl stop mongodboplogtest.service

 

Step 5 開啓輔助節點上的MongoDB服務

systemctl start mongodboplogtest.service 

 

step 6 此時輔助節點(XXX.XXX.XXX.123)升級爲主節點,此時數據爲30337(100000-30337 筆記錄丟失了)

 

 

此時 124 (原主節點)爲 "stateStr" : "(not reachable/healthy)"

 

step 7 開啓原主節點上的服務,集羣的狀態,關於原主節點的描述短暫處於 "stateStr" : "ROLLBACK"

 

 step 8 回滾後,狀態變爲 "stateStr" : "SECONDARY"

 

step 9 查詢原主節點數據,此時數據量爲30337(100000-30337 筆也記錄丟失了)

 

3.丟失的數據是否能夠找到

咱們發現,重啓原主節點(XXX.XXX.XXX.124)mongodb服務後,在數據目錄下多了一個  rollback 目錄。

重啓前的數據目錄

 

 重啓後的數據目錄

 進去這個目錄後,咱們看到生成了一個以數據庫+集合名字+時間的 bson 文件。

 

相關文章
相關標籤/搜索