1

我正在使用 Eventmachine 上的 Ruby MongoDB 客户端,我想知道如何测试 mongo 实例故障、副本集投票(主要故障)和其他类似的东西。

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

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

UPD

只是看看mongodb-ruby-driver它是如何工作的,要做同样的事情 https://github.com/mongodb/mongo-ruby-driver/blob/master/test/tools/mongo_config.rb

4

2 回答 2

1

我可以根据我在测试 Mongo 副本集方面所做的工作给你一些建议,但恐怕它是相当特定于在云中托管节点的。仍然也许你可以从中拿走一些东西。

假设您设置了副本:

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

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

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

  4. 编写一个工具来模拟连续写入,然后开始使节点脱机、杀死主节点、使用新 IP 重新启动机器等。你要放弃任何写入吗?

  5. There is no command I know of to pause/resume instances other than just stopping mongod. I like powering machines down to test personally.

于 2013-03-29T23:25:51.553 回答
0

Finally I have implemented fake Mongodb Server that binds to required port, answers with fake replies to queries. Also it replies on "isMaster" query. So you can stop primary/secondary any time, you could fire voting who will be next primary, etc. It's look the very best choice because it is about 100 lines of code and works perfectly on any OS. :)

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

于 2013-04-22T21:57:54.493 回答