同步不同服务器上的mongo数据库

时间:2013-05-21 13:05:20

标签: mongodb synchronize

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

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

现在,我需要从“host1:27017”同步“test1”数据库   “test2”来自“host2:27017”。

通过“同步”我的意思是下一个:

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

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

  3. 顺便说一下这里是问题。例如: “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 dup key:{:\”1 \“}”

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

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

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

2 个答案:

答案 0 :(得分:1)

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

  

使用副本集

部署主从等价物      

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

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

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

答案 1 :(得分:1)

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

如果你有足够的服务器

我在每个服务器上使用一个小预挂,它创建一个受控制的唯一_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()
)