2013-08-01 43 views
4

我們有一個包含對象集合的開發服務器。 這些對象的實際積累是一個持續的過程,它在本地開發服務器上運行一整套標籤,驗證等過程。 一旦這些對象生產就緒,它們就會被添加到生產數據庫中,從那時起,它將在計算中使用它們。MongoDB同步開發和生產數據庫

我正在尋找一種簡單地將delta(新對象)添加到生產數據庫中,同時將所有其他集合和舊對象保留在同一集合中的方法。 到目前爲止,我們已經使用MySql,所以這個過程只涉及運行數據庫結構和數據同步(我們使用Navicat)。 我們現在轉向MongoDB,所以這個過程有點棘手。

我看着這個,我認爲以下解決方案不適合我的需求:

  1. 傾銷dev的DB和使用mongodump then mongorestore
  2. 運行db.copyDatabase Production數據庫加載它 - 實際上將生產數據庫替換爲開發數據庫的副本。

這兩種解決方案都存在問題,因爲他們實際上會替換Production DB,因爲我只想更新現有集合中的對象。 此外,正在開發=>生產不適合主從拓撲。

我能想到的最好的事情是:

  1. 複製dev的DB成「開發」 DB的生產實例。
  2. 將集合從此開發數據庫複製到實際生產數據庫,並添加一個謂詞,我將只添加生產數據庫中不存在的對象,類似於this solution

我想知道是否有人有更好的解決方案?

如果沒有,有沒有人有腳本可以執行此操作?

回答

1

您可以使用mongoexport工具從開發數據庫中導出單個集合。將它與可以表達謂詞的--query選項結合使用。例如,諸如${ts : {$gt : previous clone time}}之類的東西。

然後,使用mongoimport將您的增量文件導入生產數據庫。使用--upsert--upsertFields,如果你有不同的_id值的兩個不同的邏輯文件,但表達了同樣的文件

1

@Orid,感謝您的回答,很抱歉這麼晚纔回復。

經過大量的研究和一些試驗性錯誤,我決定使用問題中提出的解決方案(複製測試數據庫到機器,然後逐個複製集合)。 這是因爲我在這裏使用的數據是靜態數據,沒有真正的理由有時間戳。 另外,我已經決定放棄了「只更新」的要求,所以現在我使用mongorestore與--drop

我做這一切使用這個腳本:

  1. shell腳本文件:

rm -rf dump/;

mongo copyTestDb.js; 

for COLLECTION in <Collections> 
do 
mongodump -d nutrino_copy -c $COLLECTION -o dump 
mongorestore -d nutrino -c ${COLLECTION} --drop dump/nutrino_copy/${COLLECTION}.bson 
done 
  1. JS腳本文件:

    db.copyDatabase("<dbName>","<dbName_Copy>","<testMachineUrl>")

你覺得我應該用MongoImport代替MongoRestore?

1

退房mongo-sync


這是一個腳本,我寫了我自己,當我有我的地方MongoDB數據庫不斷複製,並從我的生產DB的項目(我知道這是愚蠢的)。

一旦你把你的DB細節config.yml,您可以使用兩個簡單的命令開始同步:

./mongo-sync push  # Push DB to Remote 
./mongo-sync pull  # Pull DB to Local 

如果你使用它的一些項目裏面,它的加入config.yml.gitignore

一個好主意

mongo-sync demo gif

相關問題