2013-03-29 176 views
1

我在Ruby MongoDB Client on Eventmachine上工作,我想知道如何测试mongo实例失败,副本集投票(主要失败)和其他类似的东西。MongoDB实例失败测试

例如。客户端应建立与副本集的连接。然后主服务器失败,客户端应该找到下一个主服务器并在那里重定向所有查询

也许有mongodb命令来暂停/恢复实例。或者我应该分叉进程和sigstop/sigcont(但这将是取决于操作系统的解决方案)。

UPD

只是看着怎么mongodb-ruby-driver做的工作,会做同样的 https://github.com/mongodb/mongo-ruby-driver/blob/master/test/tools/mongo_config.rb

回答

0

最后,我已经实现了假的Mongodb服务器绑定到所需的端口,与假回复查询答案。它也回答“isMaster”查询。因此,您可以随时停止主要/次要事件,您可以发起未来主要投票,等等。它看起来是最好的选择,因为它大概有100行代码,可以在任何操作系统上完美运行。 :)

https://github.com/fl00r/monga/blob/master/spec/helpers/mongodb.rb

1

我可以给你一些建议基于我所用的测试蒙戈副本集完成,但我担心它在云中托管节点相当具体。也许你可以带走一些东西。

假设你有一个副本设置:

  1. 确保所有节点都具有相同的优先级。编写一个客户端,对副本集进行缓慢读取(确保所有三台机器都在您的客户端配置中)。慢速读取意味着写入一个大的查询,然后在光标上缓慢迭代。继续,让主要离线,看看会发生什么。您可以对其他节点的日志文件进行尾部处理,以观察它们为新的主节点投票。

  2. 如果您使用主机名的每个节点,运行慢跑查询,然后停止/启动节点,使得主机名获得一个新的IP地址。我们发现Mongo客户端而不是刷新了DNS缓存,并且您被一个旧的IP地址卡住了。 (这是针对Java客户端的 - 我们已经提交了Jira bug)。

  3. 请注意,如果您重新启动副本集中的所有节点,则会将主要副本转移。有时它会是节点1,有时候是节点2等。这假定所有节点的优先级是相同的。你的客户处理得好吗?我们以前遇到过问题,因为我们为写入硬编码了一个节点,并且突然间所有写入都会失败。

  4. 写来模拟连续写一个工具,然后开始服用节点脱机,杀一次,重新启动机器新的IP等你打算将降大任写?

  5. 没有命令我所知道的暂停/恢复的不仅仅是停止mongod的其他实例。我喜欢给机器供电,以便亲自测试。

+0

嗨瑞安,谢谢你的回应!但是我询问了在功能/单元测试中模拟实例失败的情况,因此任何运行测试的人都可以在任何操作系统中满足。而不是嘲笑。无论如何,你写的所有内容对我来说都是非常有用的! – fl00r

+0

对不起。我将检查嵌入式Mongo以便在单元/功能测试中模拟。 https://github.com/flapdoodle-oss/embedmongo.flapdoodle.de – ryan1234

+0

哼。 Embededmongo看起来很有前途!非常感谢 – fl00r