我正在研究Ruby MongoDB Client on Eventmachine,我想知道如何测试mongo实例失败,副本集投票(主要失败)和其他类似的东西。
在示例中。客户端应建立与副本集的连接。然后主要失败,客户端应找到下一个主要并重定向所有查询。
也许有mongodb命令来暂停/恢复实例。或者我应该分叉进程和sigstop / sigcont(但这将是依赖于操作系统的解决方案)。
UPD
看看mongodb-ruby-driver
如何做到这一点,去做同样的事情
https://github.com/mongodb/mongo-ruby-driver/blob/master/test/tools/mongo_config.rb
答案 0 :(得分:1)
我可以根据我测试Mongo副本集的方式给你一些建议,但我担心它在云中托管节点非常具体。也许你可以从中汲取一些东西。
假设你有一个副本设置:
确保所有节点具有相同的优先级。编写一个对副本集进行慢速读取的客户端(确保所有三台计算机都在客户端配置中表示)。慢读意味着写一个大查询然后在光标上缓慢迭代。继续,让主要离线,看看会发生什么。您可以为其他节点添加日志文件,以观察他们为新主节点投票。
如果您为每个节点使用主机名,请运行运行缓慢的查询,然后停止/启动节点,以使主机名获得新的IP地址。我们发现Mongo客户端不刷新DNS缓存,而您仍然使用旧的IP地址。 (这是针对Java客户端的 - 我们已经提交了一个Jira错误。)
请注意,如果重新启动副本集中的所有节点,则会转移主节点。有时它将是节点1,有时是节点2等。这假定所有节点的优先级相同。您的客户处理得好吗?我们曾经遇到过问题,因为我们有一个硬编码的节点用于写入,突然所有写入都会失败。
编写一个工具来模拟连续写入,然后开始使节点脱机,终止主节点,重新启动具有新IP的计算机等。您是否要删除任何写入?
除了停止mongod之外,没有我知道暂停/恢复实例的命令。我喜欢给机器供电以便亲自测试。
答案 1 :(得分:0)
最后,我实现了绑定到所需端口的假Mongodb服务器,回答了对查询的虚假回复。它还回复“isMaster”查询。因此,您可以随时停止主要/次要,您可以激发将成为下一个主要的投票等等。它看起来是最好的选择,因为它大约有100行代码,并且可以在任何操作系统上完美运行。 :)
https://github.com/fl00r/monga/blob/master/spec/helpers/mongodb.rb