Mongodb
是否可以使用轉儲將數據從分片 MongoDB 遷移到非分片 MongoDB
問題:
我有一個分片 mongo 集群,我想將數據從這個集群遷移到一個單節點 mongo 實例。所以我想知道是否可以使用轉儲/恢復?
我使用
pymongo
andDjango
和python3
andmongo3.4
如果答案是
No
,那麼將數據從 mongo 集群遷移到單節點 mongo 實例的最佳方法是什麼?我試圖編寫一個腳本來遷移數據:
# fetch data from old cluster data = MongoCollection._get_collection().find(query) # insert data to new single mongo instance NewMongoCollection.insert(data)
我所做的有很多問題,例如:
- 獲取整個數據並將數據儲存在 RAM 中
- 如果出現問題,我必須重新開始
- …
mongodump
從一個分片集群mongorestore
到另一個部署(獨立、副本集或分片集群)絕對是可能的。使用這種方法,需要注意一些一般注意事項:
- 您應該始終為分片集群提供
mongodump
數據。mongos
mongodump
需要通過mongod
程序的記憶體讀取所有請求的數據,因此這會對正在備份的部署產生重大的資源和性能影響(特別是如果未壓縮的數據集遠大於可用 RAM)。mongorestore
將為正在恢復的集合重建所有索引,這會對目標集群產生重大的性能影響。如果您使用的 MongoDB 伺服器版本早於 4.2,預設的前台索引建構將阻止對目標數據庫的其他讀取和寫入。MongoDB 4.2 的索引建構過程影響較小(請參閱:基於填充集合的索引建構)。mongodump
不進行時間點備份,因此如果源集群正在被主動更新,您的備份可能會不一致。- 如果您的部署使用 MongoDB 4.2 或更新的分佈式事務,則不應使用
mongodump
/ (在這種情況下,缺乏時間點一致性尤其成問題)。mongorestore
如果您進行迭代而不是嘗試將整個結果集儲存在 RAM 中,那麼您最初編寫腳本來遷移數據的方法也是可行的。您可以通過以可預測的順序掃描集合來使這種方法可恢復(例如
_id
,如果繼續插入新文件,則按 排序,假設這是單調遞增的)。除非您對數據導出或節流有非常自定義的要求,否則我會傾向於使用
mongodump
並mongorestore
帶有適當的壓縮和並發選項(例如要轉儲的並行集合和每個集合的插入工作人員數量)。