出于测试目的,我试图通过设置slaveDelay = n的slave来模拟mongodb集群中的复制延迟。事实证明,这神奇地导致奴隶被隐藏,所以我的测试无法访问它。
mongodb documentation州 “通常我们不希望延迟成员用于slaveOkay读取。因此,设置slaveDelay也会隐藏应用程序中的成员,就好像你也设置了hidden:true。”
有没有办法配置我的“非典型”用例?或者是否有更好的方法来模拟不同时间滞后的不同奴隶的阅读?
我尝试使用TaggedReadPreference强制测试代码连接到延迟的从属设备,但这会导致
com.mongodb.MongoException: Could not find any valid secondaries with the supplied tags ('{ "delayed" : "true"}'
显然Java驱动程序确实看不到辅助。当我删除“slaveDelay”设置时,它连接正常。
这是我的群集配置:
rs.reconfig({
"_id" : "rs0",
"version" : 4,
"members" : [
{ "_id" : 0,
"host" : "localhost:27017",
"priority" : 0,
slaveDelay: 10,
tags: { delayed: "true" }
},
{ "_id" : 1,
"host" : "localhost:27018"
},
{ "_id" : 2,
"host" : "localhost:27019",
"arbiterOnly" : true
}
]
})
答案 0 :(得分:1)
据我所知,这是不可能的。您唯一的途径是通过代理模拟/强制主要和延迟辅助设备之间的实际网络延迟。有许多此类工具可用,它们将为您提供更准确的测试。
答案 1 :(得分:1)
您可以fsync并锁定辅助设备一段时间以强制它落后:
http://www.mongodb.org/display/DOCS/fsync+Command#fsyncCommand-v2.0Notes
虽然一旦你解锁就很快就会赶上来,有了体面的oplog和大的插入率,你可以反复模拟滞后效应。这意味着在开始测试之前等待它延迟等。
如果您有一个主要,一个辅助和仲裁,如您所描述并使用您所选语言的W = 2等效(REPLICAS_SAFE等),而辅助被锁定将无限期阻止,除非您设置wtimeout(你应该,如果使用W = 2,则捕获异常。