MongoDb:有没有更好的方法将生产环境数据复制到测试环境

时间:2012-09-04 16:13:20

标签: mongodb

现在我有两个分片:shard3(16g),shard4(15g)和三台机器: 像这样的部署: 10.10.10.5:(mongoS,configureserver,shard3 primary,shard4 primary) 10.10.10.6:(mongoS,configureserver,shard3 secondary,shard4 secondary) 10.10.10.7:(mongoS,configureserver,shard3 arbitor,shard4 arbitor)

现在我想进行性能测试(关于添加新的分片),我知道我不能使用生产环境进行测试,因为这会影响生产性能,所以我想将所有数据复制到我的测试中三台机器:20.20.20.5,20.20.20.6和20.20.20.7,我看过手册,但找不到更好的方法,亲爱的家伙,请你给我一个建议。

顺便问一下,问两个小问题:第一:像我的生产环境一样,如何将仲裁节点更改为辅助节点,即我想将10.10.10.7更改为辅助分片,因为我想要10.7分享读取压力10.6 。 第二:如何指示Mongos读取主节点而不是辅助节点,您知道mongoS在辅助节点上读取时在主节点上写入,但我想在主节点上读取和写入以立即获取最新数据。 提前致谢 千斤顶

2 个答案:

答案 0 :(得分:1)

您应该查看以下文档:http://www.mongodb.org/display/DOCS/Import+Export+Tools。你可以使用mongoexport和mongoimport来做你想做的事情。或者您也可以使用mongodump& mongorestore。这样您就可以将数据备份并恢复到测试环境中。

第一个问题:您无法将仲裁者“转换”为辅助仲裁者。唯一真正的方法是将新节点添加到副本集,然后取下仲裁器,然后将其从副本集中删除。您可以在现有副本集节点上使用rs.add()将新mongod添加到副本集。您按此顺序执行此操作以避免停机。如果您不介意停机,那么订单并不特别重要。有关将节点添加到副本集的文档,请访问:http://www.mongodb.org/display/DOCS/Replica+Sets+-+Basics

此外,如果您正在执行readScaling并使用SlaveOK(),请务必记住,如果从主服务器到任何辅助服务器之间存在复制延迟,则您有可能读取过时数据。如果这对于您的应用程序而言是可接受的,那么对您来说很重要的是,如果您同时查询副本集中的两个节点,则可以基于复制滞后为同一查询读取两个不同的值。

第二个问题:如果您希望始终只读取/写入主要内容,则不应该使用SlaveOK运行。 SlaveOK off是默认值,但是如果你已经打开它,只需再次调用它传递false。

答案 1 :(得分:0)

只要您拥有主副本和大部分副本集,副本集就是可写的。很自然地,只要主节点没有超载并且您没有取下4个节点中的2个节点,您就可以写入主节点。它只会复制到大多数已启动的节点。

一般情况下,我们会尝试阻止偶数编号的副本集,因此我会将仲裁器脱机并坚持使用3个副本集。这是因为你真的没有赢得仲裁者的任何东西。如果2个节点以任何方式失败,则您没有多数,并且副本集将变为只读。如果一个节点出现故障,您仍然需要写入。仲裁器在偶数集中没有任何帮助。

当您尝试执行仅发送到一个辅助节点的查询时,新的辅助节点是否都是按数据方式捕获的?如果它处于“恢复”状态,那么由于它没有复制所有数据,因此读取可能还没有进入。除此之外,还有一些方法可以指定读取首选项。

有关所有不同阅读偏好以及如何使用它们的文档,请访问:http://docs.mongodb.org/manual/applications/replication/#read-preference