如何设置一个未隐藏的mongodb延迟奴隶?

时间:2012-05-14 08:55:33

标签: mongodb database-replication

出于测试目的,我试图通过设置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
    }
]
})

2 个答案:

答案 0 :(得分:1)

据我所知,这是不可能的。您唯一的途径是通过代理模拟/强制主要和延迟辅助设备之间的实际网络延迟。有许多此类工具可用,它们将为您提供更准确的测试。

答案 1 :(得分:1)

您可以fsync并锁定辅助设备一段时间以强制它落后:

http://www.mongodb.org/display/DOCS/fsync+Command#fsyncCommand-v2.0Notes

虽然一旦你解锁就很快就会赶上来,有了体面的oplog和大的插入率,你可以反复模拟滞后效应。这意味着在开始测试之前等待它延迟等。

如果您有一个主要,一个辅助和仲裁,如您所描述并使用您所选语言的W = 2等效(REPLICAS_SAFE等),而辅助被锁定将无限期阻止,除非您设置wtimeout(你应该,如果使用W = 2,则捕获异常。