【问题标题】:Synchronize mongo databases on different servers同步不同服务器上的mongo数据库
【发布时间】:2013-05-16 06:21:34
【问题描述】:

我有下一个情况。我在不同的服务器上有两个 mongodb 实例。 例如

Mongodb instance on server "one" (host1:27017) with database: "test1"
Mongodb instance on server "two" (host2:27017) with database: "test2"

现在,我需要将“host1:27017”中的“test1”数据库与 来自“host2:27017”的“test2”。

“同步”是指下一个:

  1. 如果“test2”中不存在“test1”数据库中的某些集合,则应将该集合完全复制到“test1”数据库中。

  2. 如果集合中的某些记录在“test2”数据库中不存在,则必须添加,否则更新。如果记录在“test1”数据库的A集合中不存在,但在“test2”数据库的A集合中存在,则必须从“test2”中删除记录。

顺便说一句,这里有问题。例如: “test1”数据库有集合“A”,包含以下文档:

{
 _id: "1",
 name: "some name"
}

"test2" 数据库具有包含以下文档的集合 "A":

{
 _id: "1",
 name: "some name"
}

{
 _id: "2",
 name: "some name2"
}

如果我执行 db.copyDatabase('test1', 'test2', "host2:27017") 我得到错误:

"errmsg" : "异常:E11000 重复键错误索引:test1.A.$id 重复键:{ : \"1\" }"

cloneDatabase 命令相同。我该如何解决?

一般来说,同步数据库的方法有哪些? 我知道最简单的方法是将文件从一台服务器复制到另一台,但也许有更好的方法。

请帮忙。我是mongo的新人。谢谢。

【问题讨论】:

  • 如果你稍微搜索一下,这里有很多关于这个主题的问题,即:stackoverflow.com/questions/16171613/…
  • 为什么不将host1上的数据库转储,tar+scp数据到另一台主机做一个dbrestore呢?或者你设置一个复制集(记得包含一个仲裁器),让 mongodb 负责复制?
  • mongoDB 的更新情况如何?是否有写入到 test1 和 test2 只是一个副本?
  • 我只想在不同实例之间同步数据。在我的情况下,test1 是 master 和 test2 作为从属的方式,我想在 test1 和 test2 中有等价数据
  • 当你说master和slave时,听起来你想要一个副本集

标签: mongodb synchronize


【解决方案1】:

这个我没试过,但是目前的 MongoDB 文档描述了一个replication set equivalent to master-slave replication

使用副本集部署主从等效项

如果您想要一个类似于主从复制的复制配置,使用副本集,请考虑以下副本配置文档。在此部署中,hosts 和1 提供的复制大致相当于两个实例的主从部署:

{
   _id : 'setName',
   members : [
              { _id : 0, host : "<master>", priority : 1 },
              { _id : 1, host : "<slave>", priority : 0, votes : 0 }
  ]
}

有关副本集配置的更多信息,请参阅Replica Set Configuration

【讨论】:

    【解决方案2】:

    使用 _id 代替 id。无需在您的模型中声明它。

    如果你有很多服务器

    我在每台服务器上使用一个小的 prehook,它创建一个受控的唯一 _id。 mongoose _id 非常符合逻辑(https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectIDs-BSONObjectIDSpecification),数字 0,6 是机器标识符。我只是控制这些数字,因为我有多个服务器,并且我想确保没有勾结。如果你只有几个,不这样做可能没有风险。即使在我的情况下,我也认为这太偏执了。

    exports.useProcessId = ()->
      return process.env.INSTANCE_PROCESS_ID? && process.env.INSTANCE_PROCESS_ID.length == 4
    
    exports.manipulateMongooseId = (id) ->
      id = id.toString()
      newId = new ObjectId(id.slice(0,6) + process.env.INSTANCE_PROCESS_ID + id.slice(10,24))
      return newId
    

    架构

    mymOdelSchema.pre('save', (next) ->
      data = @
      async.parallel
        myModel: (next)->
          myModelValidator.base(data, next)
        changeMongooseId: (next)->
          if useProcessId && instanceType == 'manager' then processIdConfig.changeMongooseId(data, next) else return next()
        (err)->
          return
    
     next new Error(err) if err?
          return next()
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2011-03-26
      • 2013-02-28
      • 1970-01-01
      • 2017-11-18
      相关资源
      最近更新 更多