【问题标题】:Replicating from a read-only couchdb从只读的 couchdb 复制
【发布时间】:2014-02-12 15:50:59
【问题描述】:

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

应用程序在可能的情况下与服务器数据库同步(以使此信息可脱机使用)。

但是,此信息对我的应用程序的每个用户来说都是全局的——因此必须将其限制为严格的只读访问权限。但是,我读到 couchdb 需要 write 访问源以便有效地复制(为了检查点)。

对性能有何影响?有没有办法解决这个问题?

【问题讨论】:

    标签: couchdb replication


    【解决方案1】:

    您可以通过在 _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/ 前缀)。但是你应该明确地尝试一下。

    性能影响:

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

    不过,您描述的设置应该不会造成问题:用户不允许写入,因此如果他们遇到慢速复制您的公共数据库也没关系。如果您的公共数据库很少更新,也不应该有任何性能问题。

    希望我能帮上忙!

    【讨论】:

    • 只是因为我花了一点时间才弄清楚应该如何创建它,这是我使用的 HTTP 请求:PUT mycouchdbserver/database/_design/readonly{ "_id": "_design/readonly", "validate_doc_update": "function(newDoc, oldDoc, userCtx, secObj) { if ((userCtx.roles.indexOf('_admin') !== -1)) { return; } throw({forbidden: 'Permission denied.'});}" }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2012-05-29
    • 1970-01-01
    • 2013-06-07
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多