大型mongodump
後跟mongorestore
我有一個相當大的 (~240GB) Mongo 數據庫,我需要將它通過緩慢的網路傳輸到新伺服器上。
傳統上,對於這些情況,我發現 a
mongodump
後跟 a比mongorestore
方法快得多db.cloneCollection()
。然而,我今天意識到做一個完整的mongodump
後跟mongorestore
一個有點浪費(我認為),因為我做了所有的數據傳輸,然後做所有的插入。我更願意從舊的 mongo 傳輸數據(
mongodump
步驟),同時將可用數據插入新數據庫(mongorestore
步驟)。有誰知道如何在 MongoDB 中並行化轉儲和插入過程?(這實際上會更快嗎?)
首先,您可以使用管道
mongodump -h sourceHost -d yourDatabase … | mongorestore -h targetHost -d yourDatabase …
這減少了時間,因為每個讀取的文件或多或少都會立即恢復到
targetHost
.但是,這樣做的缺點是,如果由於某種原因(例如網路故障)中止該過程,您可能會遇到問題。至於並行化,您可以為每個集合執行上述操作,但我懷疑您是否會獲得任何性能提升,因為最有可能是 IO 的限制因素,即使不是,並發也很可能是一個殺手。
我要做的是創建一個臨時副本集,由舊伺服器、新伺服器和仲裁器組成。初始同步相當快,即使遇到網路問題,同步機制也會確保一切正常。初始同步完成後,您只需將舊伺服器降級為主伺服器並重新啟動不帶replSetName 選項的新伺服器,使其再次成為獨立伺服器。現在您可以連接到新伺服器並傳輸所有數據。
這樣做的好處是停機時間最短且無需出勤。初始化副本集後,您的應用程序仍然可以使用舊伺服器,甚至新數據也會自動傳輸到新伺服器。所以你不必坐在旁邊——而且我們都知道這個過程很可能在凌晨 3 點結束,無論時區如何。;)初始同步完成後的任何時間(甚至幾小時或幾天后),您都可以使新伺服器成為獨立伺服器,並將應用程序的連接字元串更改為新伺服器。如果計劃得當,這只需 2 或 3 分鐘。
編輯
但是,此方法有一個缺點:您只能從一個版本升級到更高版本。因此,從 2.4(撰寫本文時的考古學)遷移到 3.4(前沿),您必須多次重複該過程:
- 從 2.4 到 2.6
- 從 2.6 到 3.0
- 從 3.0 到 3.2
- 從 3.2 到 3.4