6

我有一个大约 3GB 的 mongo 数据库,里面有几十个集合。其中三个集合每秒处理约 300 个查询,而其他集合的处理量要低得多。我预计流量将继续快速增长。

我想设置一个副本集来处理高流量的集合。这个新实例不需要复制数据库的其余部分。这可能吗?

4

3 回答 3

2

目前似乎无法通过 mongodb 的内置功能来实现,唯一的办法就是想出自己的手动复制算法或使用第三方编写的其他一些工具。

https://github.com/wordnik/wordnik-oss项目可能会根据以下帖子帮助您实现这一目标。

https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/Ap9V4ArGuFo

描述在复制中过滤文档的解决方法。

仅复制 MongoDB 中 {'public':true} 的文档

或者只是自己手动复制数据,这可能值得一试。

祝你好运。

于 2013-01-22T22:32:27.190 回答
1

不,现在不可能。您可以做的是将这些集合移动到另一个未复制的数据库中。但是,一旦这些集合也看到更高的流量,这将导致头痛,因此您需要将它们移动到您的“复制”-db。

但一般来说,如果您需要扩展,复制不是要走的路,它更适合 DR/故障转移。Replicaset Secondary 只能(可选)回答读取查询,但不能回答写入查询,这是您应该牢记的。因此,如果您的写入负载很高,这可能无法解决您的问题。
一旦您允许您的应用程序从辅助设备中读取数据,您就需要保持最终的一致性,这意味着您的应用程序不能保证总是看到最新的数据。这是由于异步复制到辅助节点造成的。
事实上,如果你配置你的 writeconcern,你可以解决这个问题,这样在所有副本上写入需要成功,然后才被认为已写入并且你的驱动程序返回。但这可能会显着减慢您的写入操作。

因此,为了扩展查询执行能力,我会选择Sharding。这在每个集合级别上是可能的,所有未分片的集合将保留在“默认分片”上。

于 2013-01-23T09:59:07.843 回答
0

不可能,但是如果数据大小如此之小并且这些集合没有更新,那么复制它们的唯一开销是辅助节点上的小存储大小。与编写自己的复制逻辑相比,这是一个相对较小的代价,特别是因为集合的大小不会增长。

于 2013-01-23T16:06:52.627 回答