2013-03-29 177 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