mongodb 等待写入复制

如果希望不管发生什么都将写入操作保存到副本集中,那么必须要确保写入操作被同步到副本集的"大多数"
可以使用 getLastError命令来检查写入是否成功,有一个特殊的关键字"w"就是"majority"
    
    
    
    
rs0:PRIMARY> db.runCommand({"getLastError":1,"w":"majority"})
{
"lastOp" : {
"ts" : Timestamp(1465822911, 1),
"t" : NumberLong(7)
},
"connectionId" : 1,
"n" : 1,
"syncMillis" : 0,
"wtime" : 0,
"writtenTo" : [
"mongodb2:27017",
"mongodb3:27017"
],
"err" : null,
"ok" : 1
}
当使用了w参数后,就会出现writtenTo字段.如果secondary节点挂了,这时候主节点无法将这个操作复制到副本集中,那么getLastError会一直等待下去.因此要给 wtimeout设置一个等待时间.例如这里设置等待1s:
    
    
    
    
rs0:PRIMARY> db.runCommand({"getLastError":1,"w":"majority","wtimeout":1000})
{
"lastOp" : {
"ts" : Timestamp(1465823080, 1),
"t" : NumberLong(7)
},
"connectionId" : 1,
"n" : 1,
"syncMillis" : 0,
"wtime" : 0,
"writtenTo" : [
"mongodb2:27017",
"mongodb3:27017"
],
"err" : null,
"ok" : 1
}
"w"还可以是其它值,mongodb允许w为任意整数,例如w为2表示写操作复制到两个成员,否则会一直等待(包括主节点).
如果有两个个数据中心,想将数据至少复制到每个数据中心的一台机器上,可以使用对数据中心成员分类,使用config中的tags字段
第一.先将每个数据中心的成员打上tags
    
    
    
    
var config=rs.config()
config.members[0].tags={"dc":"east"}
config.members[1].tags={"dc":"east"}
config.members[2].tags={"dc":"west"}
config.members[3].tags={"dc":"west"}
tags是一个数组,"dc"是标识,"east"和"west"是值,这些都可以自己定义
第二.创建规则,通过配置 getLastErrorMode字段实现,每条规则的形式为: "name":{"key":number}.其中name是规则的名字,自己定,key就是上面tags的标识,number表示复制操作至少复制到多少个分组上,每个分组内至少一台机器上.
    
    
    
    
 
config.settings={}
config.settings.getLastErrorModes=[{"eachDC":{"dc":2}}]
rs.reconfig(config)
上面的意思就是创建了一个规则叫eachDC,保证dc分组中至少复制到2个分组中,每个分组中至少一台主机上,由于上面我们dc只有两个分组分别为"east"和"west",那么这就实现了两个中心至少一台机器保证复制成功.
最后就可以使用getLastError来对应这条规则:
    
    
    
    
db.runCommand({"getLastError":1,"w":"eachDC","wtimeout":1000})

你可能感兴趣的:(mongodb 等待写入复制)