Mongodb

是否可以使用轉儲將數據從分片 MongoDB 遷移到非分片 MongoDB

  • December 20, 2019

問題:

我有一個分片 mongo 集群,我想將數據從這個集群遷移到一個單節點 mongo 實例。所以我想知道是否可以使用轉儲/恢復

我使用pymongoandDjangopython3andmongo3.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,如果繼續插入新文件,則按 排序,假設這是單調遞增的)。

除非您對數據導出或節流有非常自定義的要求,否則我會傾向於使用mongodumpmongorestore 帶有適當的壓縮和並發選項(例如要轉儲的並行集合每個集合的插入工作人員數量)。

引用自:https://dba.stackexchange.com/questions/255642