从只读的couchdb复制

时间:2014-01-22 14:21:14

标签: couchdb replication

我有一台服务器,其中包含一个couchdb数据库,其中包含我的应用程序所需的信息。它包含几兆字节的东西,一些日常变化的文档(添加最新消息,删除旧文档,更新一些)。

应用程序尽可能与服务器数据库同步(使此信息可脱机使用)。

但是,此信息对我的应用程序的每个用户都是全局的 - 因此必须限制为严格只读访问。但是,我读到couchdb需要访问源代码才能有效复制(为了检查点)。

性能影响是什么?有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:6)

您可以通过在_design文档中编写validate_doc_update()函数来限制写访问权限。您可以在official CouchDB documentation

中找到详细信息

例如,此函数会将写入操作限制为仅限管理员:

function(newDoc, oldDoc, userCtx, secObj) {
    // allow modifications by admins only.
    if ((userCtx.roles.indexOf('_admin') !== -1)) {
            return;
    }
    throw({forbidden: 'You are not allowed to edit public documents.'});
}

将其放入_design/readonly文档(或您对设计文档的任何名称),并将函数命名为validate_doc_update

每个设计文档只能有一个validate_doc_update函数,但您当然可以定义多个设计文档。每当任何人尝试写入操作时,文档将按顺序发送到所有这些验证功能。如果任何函数抛出错误,则拒绝更新。

因此,请注意不要将此设计文档复制到普通用户应该能够写入的数据库中!

据我所知,常规复制仍然有效,因为验证函数不会针对复制检查点文档执行(它们具有特殊的/ _local /前缀)。但你应该明确地尝试这一点以确定。

性能影响:

每次发生文档写入时都会执行验证功能,即使对于管理员写入也是为了复制。根据您的应用程序,您可能会考虑一些特殊的复制策略来提高性能。

您描述的设置不应该造成问题:不允许用户写入,因此如果他们的公共数据库的复制速度很慢 ,则可以。如果您的公共数据库很少更新,也不会出现任何性能问题。

希望我能帮忙!