CouchDB - 移动应用程序架构 - 复制性能

时间:2015-10-12 08:58:29

标签: performance couchdb replication

我构建了一个基于CouchDB的移动应用程序。

出于安全原因,我必须确保文档只能由允许执行此操作的用户读取。由于我无法在文档级别管理访问权限,因此我为每个用户创建一个couchdb数据库,并使用过滤后的复制从每个用户数据库中的主couchDB数据库复制文档。

这种模式运作良好,但今天我遇到了巨大的性能问题。

我试图将所有复制连续,过滤和双向复制,但是在80个用户(因此81个数据库和160个同时连续复制)之后,复制过多并且我的couchDB服务开始减速甚至有时崩溃。注意到所有数据库都在同一台服务器上(我不能有多台服务器)

我试图设置一个"手册"复制,但即使这样,当我需要将文档从我的主数据库复制到我的所有80个用户数据库时,每个从我的主数据库到用户数据库的过滤复制大约需要30秒。

也许我的复制过滤器存在问题,我为每个文档存储了允许查看它的用户列表。由于每个用户都拥有自己的数据库,因此我只复制允许用户在其数据库中查看的文档。这是我的复制功能:

<%= f.select :status, [["Single", "single"], ["Married", "married"], ["Engaged", "engaged"], ["In a Relationship", "relationship"]], {}, {class: "form-control"} %>

我的应用程序的目标是获得大约1000名用户,这对于当前的架构/性能来说是完全不可能的。

我有三个问题: 1.即使我认为它不可能,是否有可能在同一台服务器上连续复制大约1000个数据库? 2.我的复制过滤器有什么问题吗?有没有办法改进它以实现快速数据库复制? 3.如果当前的架构一点都不好,那么在我的案例中你会建议什么样的架构?

非常感谢!

2 个答案:

答案 0 :(得分:1)

我们终于改变了我们的全球项目架构。 在80个同步数据库couchdb日志开始爆炸后,即使可以更改配置限制,主服务器也无法处理超过100个复制数据库。我可能错了,但我认为这种架构在单个服务器上是不可能的。

以下是我们制定的解决方案。 我们删除了所有用户数据库,并将所有移动应用程序直接插入主数据库,并直接在主数据库上进行过滤复制:http://pouchdb.com/api.html#replication使用此解决方案:示例3:设计文档中的过滤器功能< / p>

这个新模型现在正在运行我们做了一些压力测试,直到1000个同时用户我们没有遇到任何问题。

请注意,复制数据库的pouchDB要求couchdb自上次同步以来对主数据库应用的所有修改(即使是过滤复制)。因此,当您创建一个新的pouchdb数据库并进行同步时,如果您的主couchDB已经过时且具有很大的历史(检查couchdb _changes API),则可能需要非常长的时间!

答案 1 :(得分:0)

步骤0始终确定瓶颈。我根据您的场景概述我的第一个猜测是查看I / O性能。看看

libbootloader.a

GET /_stats/couchdb

每个数据库都有自己的读取和读取功能。写入文件描述符,以便服务器上的打开数据库数量增加,所需的I / O资源也会增加。希望这有帮助