mongodb 上億數據建索引出現的異常

mongodb數據量比較大,有上億數據,在建索引時使用了命令:db.collection.createIndex({"key":'hashed'},{"background":true}),覺得在後臺執行就能夠高枕無憂,結果在有的分片集上就出現了異常,分片集的複製集還掛掉了,時間一長,重啓以後就有可能跟不上,日誌中會報錯:too stale to catch up -- entering maintenance mode,表示已經太太久遠,沒法跟上primary的節奏,進入了保持狀態,這個狀態在rs.stats()表示爲recovering,不過頗有可能沒法徹底恢復,因此沒有試過,另外一個複製集日誌中出現了回滾的異常,我擦,真是禍不單行,該分片集一共就3個複製集,只剩下primary還在扛着,1個在recovering,1個在rollback,writeconcern還設置爲2,致使數據寫到primary上沒法同步到secondary,一直報wait for replicaset timeout,其實數據都在primary上,沒有丟失,只是因爲沒法同步到secondary,因此纔會超時mongodb

 

如何解決的?日誌

後來咱們直接將有問題的複製集的dbpath內容清空,從新啓動,這樣作相似於全量同步。啓動後複製集的狀態由startup2變成secondary,這樣就滿血復活了,不過在startup2的過程當中操做時間比較長,它會根據複製集的oplog先恢復數據,以後建索引,而後有個btree的過程,而後就是secondary,若是在建索引的過程當中有數據還在插入,那麼在索引建完後會再次同步數據,若是數據不一致還會先同步數據,而後再次從新開始建索引,我建了2次索引以後就變成secondary了,比較幸運,以爲應該是當時數據量差異不太大,若是真的數據差別太大,這確定就會變成一個同步數據--->創建索引-->同步數據-->創建索引的死循環索引

 

如果想使用全量同步,須要保證數據都在primary上沒有丟失,不然就麻煩了同步

相關文章
相關標籤/搜索