先上一張準備測試的MongoDB設計圖:
圖上已經說明很清楚了。可以參加我其它筆記:http://blog.csdn.net/crazyjixiang/article/category/844957 如果覺得不清楚 請留言
這裡使用replication set來避免單節點資料的丟失。
測試情況如下:
在228伺服器上插入 1000W條資料 。在插入完成後先斷掉 162 伺服器,然後迅速在mongos那裡執行
> db.users.count()Fri Jul 29 16:05:11 uncaught exception: count failed: { "assertion" : "DBClientBase::findOne: transport error: 10.10.21.162:27017 query: { setShardVersion: \"test.users\", configdb: \"10.7.3.228:27019\", version: Timestamp 5000|1, serverID: ObjectId('4e325735277d2098a18b5cca'), shard: \"set162163228\", shardHost: \"set162163228/10.10.21.162:27018,10.10.21.163:27017\" }", "assertionCode" : 10276, "errmsg" : "db assertion failure", "ok" : 0}
可見拋出一個異常,再執行下 db.users.count()
> db.users.count()10000000
發現正常了,163變成Primary 。
然後繼續執行插入 10000W資料,在插入過程中斷再斷掉 163 伺服器
插入正常進行中,插入完後 對比了下 164的伺服器資料 + 串連上162伺服器上的資料 正好等於2000W。
把 162, 163兩個伺服器再串連上後,資料不停變化,這時進行中Server Load Balancer.
附:若機房出現瞬間停電,那麼資料還是會出現問題的,但是這種機率很小。