5

出于测试目的,我试图通过设置 slaveDelay=n 来模拟 mongodb 集群中的复制滞后。事实证明,这会神奇地导致从属设备被隐藏,因此我的测试无法访问它。

mongodb 文档指出“通常我们不希望延迟成员用于 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
    }
]
})
4

2 回答 2

1

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

于 2012-05-14T09:31:52.773 回答
1

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

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

尽管解锁后它会很快赶上,但通过不错的 oplog 和较大的插入率,您可以反复模拟滞后效果。这意味着在开始测试等之前等待它滞后。

如果您有一个主要、一个辅助和一个仲裁器,如您所描述并在您选择的语言中使用 W=2 等效项(REPLICAS_SAFE 等),而辅助被锁定,除非您设置 wtimeout(您应该这样做,并且如果使用 W=2),则捕获异常。

于 2012-05-15T18:07:10.057 回答