MongoDB同步开发和生产数据库

时间:2013-08-01 15:20:28

标签: mongodb deployment synchronization

我们有一个开发服务器,其中包含一组对象。 这些对象的实际累积是一个持续的过程,它在本地开发服务器上运行标记,验证等的整个过程。 一旦这些对象准备好生产,它们就会被添加到生产数据库中,从那时起,它将在计算中使用它们。

我正在寻找一种方法来简单地将delta(新对象)添加到生产数据库中,同时保留所有其他集合以及同一集合中的旧对象。 到目前为止,我们已经使用了MySql,因此这个过程只涉及运行数据库结构和数据同步(我们使用Navicat)。 我们现在转移到MongoDB,所以这个过程有点棘手。

我已经研究过了,我认为以下解决方案不符合我的需求:

  1. 转储dev DB并使用mongodump then mongorestore
  2. 将其加载到Production DB中
  3. 正在运行db.copyDatabase - 实际上使用dev DB的副本替换生产数据库。
  4. 这两个解决方案都存在问题,因为它们实际上取代了生产数据库,而我想要做的就是更新现有集合中的对象。 另外,去Dev =>生产不适合主从拓扑。

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

    1. 将dev DB复制到生产实例上的“dev”DB中。
    2. 将该集合从此dev DB复制到实际生产数据库,并添加一个谓词,我只会添加生产数据库中不存在的对象,类似于this solution
    3. 我想知道是否有人有更好的解决方案?

      如果没有,是否有人有脚本可以执行此操作?

3 个答案:

答案 0 :(得分:1)

您可以使用mongoexport工具从开发数据库中导出单个集合。将它与--query选项结合使用,您可以在其中表达谓词。例如${ts : {$gt : previous clone time}}

然后,使用mongoimport将delta文件导入生产数据库。如果您有两个具有不同--upsert值的不同逻辑文档,请使用--upsertFields_id,但要表达相同的文档

答案 1 :(得分:1)

@Orid,谢谢你的回答,对于迟到的回复感到抱歉。

经过大量研究和一些试错,我决定使用问题中所述的解决方案(复制测试数据库到机器,然后逐个复制集合)。 这是因为我在这里使用的数据是静态数据,没有真正的理由有时间戳。 此外,我已经决定放弃“仅更新”的要求,所以现在我正在使用mongorestore --drop

我使用这个脚本完成所有这些:

  1. shell脚本文件:
  2. 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>")

    2. 您认为我应该使用MongoImport而不是MongoRestore吗?

答案 2 :(得分:0)

查看mongo-sync


这是我为自己编写的一个脚本,当我不得不经常将我的本地MongoDB数据库复制到我的生产数据库以进行项目时(我知道它是愚蠢的)。

将数据库详细信息放入config.yml后,您可以使用两个简单的命令开始同步:

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

如果您在某个项目中使用它,最好将config.yml添加到.gitignore


mongo-sync demo gif