我有下一个情况。我在不同的服务器上有两个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”数据库的集合“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的新人。谢谢。
我没有试过这个,但是目前的MongoDB文档描述了一个replication set equivalent to master-slave replication:
Deploy Master-Slave Equivalent using Replica Sets
如果要使用类似于主从复制的复制配置(使用副本集),请考虑以下副本配置文档。在此部署中,hosts和1提供的复制大致相当于双实例主从部署:
{ _id : 'setName', members : [ { _id : 0, host : "<master>", priority : 1 }, { _id : 1, host : "<slave>", priority : 0, votes : 0 } ] }
有关副本集配置的更多信息,请参阅Replica Set Configuration。
使用_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()
)