Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 同步不同服务器上的mongo数据库_Mongodb_Synchronize - Fatal编程技术网

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

Mongodb 同步不同服务器上的mongo数据库,mongodb,synchronize,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”数据库与 “host2:27017”中的“test2” “同步”是指下一步: 如果“tes

我有下一个情况。我在不同的服务器上有两个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”

“同步”是指下一步:

  • 如果“test1”数据库中的某个集合在“test2”中不存在,则该集合应在“test1”数据库中完全复制

  • 若集合中的某些记录不存在于“test2”数据库中,则必须添加,否则必须更新。若记录不存在于“test1”数据库的集合中,但存在于“test2”数据库的集合中,则必须从“test2”中删除该记录

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

    {
     _id: "1",
     name: "some name"
    }
    
    {
     _id: "1",
     name: "some name"
    }
    
    {
     _id: "2",
     name: "some name2"
    }
    
    “test2”数据库包含包含以下文档的集合“A”:

    {
     _id: "1",
     name: "some name"
    }
    
    {
     _id: "1",
     name: "some name"
    }
    
    {
     _id: "2",
     name: "some name2"
    }
    
    如果我执行db.copyDatabase('test1','test2','host2:27017'),我会得到错误:

    “errmsg”:“异常:E11000重复密钥错误索引:test1.A.$id重复密钥:{:\'1\'”

    cloneDatabase
    命令相同。我怎样才能解决它

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


    请帮忙。我是蒙哥的新来者。谢谢

    我还没有尝试过,但是当前的MongoDB文档描述了一个:

    使用副本集部署等效的主从机

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

    {
       _id : 'setName',
       members : [
                  { _id : 0, host : "<master>", priority : 1 },
                  { _id : 1, host : "<slave>", priority : 0, votes : 0 }
      ]
    }
    
    {
    _id:'setName',
    成员:[
    {u id:0,主机:“”,优先级:1},
    {u id:1,主机:“”,优先级:0,投票数:0}
    ]
    }
    
    有关副本集配置的更多信息,请参阅


    使用_id而不是id。不需要在模型中声明它

    如果你有很多服务器 我在每台服务器上使用一个小的预读,它创建一个受控的唯一id。mongoose id构建得非常符合逻辑(),数字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
    
    模式
    如果您搜索一下,这里就有很多关于这个主题的问题,例如:为什么不将数据库转储到host1上,tar+scp将数据发送到另一台主机并执行dbrestore?或者您设置了一个复制集(记住要包含一个仲裁器),让mongodb负责复制?mongodb中的内容是如何更新的?有写入到test1和test2只是一个副本吗?我只想在不同的实例之间同步数据。在我的例子中,test1是如何将master和test2作为slave的,我希望在test1和test2Sounds中有等价的数据,就像你说master和slave时想要一个副本集一样