实现强烈一致的观点

时间:2014-05-20 08:19:34

标签: couchbase

我刚开始使用couchbase并希望将它用作我的数据存储。

我执行查询的要求之一是返回关于所有商店中文档的某个字段。此查询在服务器启动时完成一次。 为此,我需要所有存在的文档,并且不能错过任何文档。 我理解在couchbase中的视图最终是一致的,但我仍然希望这个查询可以完成(以性能为代价)。

关于我的配置说明:

  • 我只有一个couchbase服务器实例(我不需要分片或 复制)
  • 我使用的是java客户端(1.4.1)

我试图以这种方式保存我的文件:

client.set(key, value, PersistTo.ONE).get();

使用以下方式查询:

query.setStale(Stale.FALSE);

添加PersistTo参数会导致以下异常:

Cause by: net.spy.memcached.internal.CheckedOperationTimeoutException: Timed out waiting for operation - failing node: <unknown>
  at net.spy.memcached.internal.OperationFuture.get(OperationFuture.java:167)
  at net.spy.memcached.internal.OperationFuture.get(OperationFuture.java:140)

所以我想我其实是在问3个问题:

  1. 是否有可能获得我需要的一致结果?
  2. 如果是的话,我建议采用正确的方法吗?
  3. 如何防止这些例外?
  4. 我使用的映射:

    function (doc,meta) {
        if (doc.doc_type && doc.doc_type == "MyType" && doc.myField) {
            emit(meta.id,null);
        }
    }
    

    谢谢

1 个答案:

答案 0 :(得分:2)

  

是否有可能获得我需要的一致结果?

是的,可以通过将STALE标志设置为false来将Couchbase视图设置为一致。但是这会对性能产生影响,因此根据您的数据大小,查询可能会很慢,如果您每天只进行一次,那么它应该没问题。

Couchbase被设计为包含多个节点的分布式系统,它不适合单节点部署。我已阅读(但找不到链接)视图在较大的群集中表现更好。

你也强迫更多的同步处理模型进入一个闪烁着异步请求的系统,PersistTo可以用于某些请求,但不能用于每次调用的系统范围(个人意见),它肯定会限制吞吐量和性能。

  

如果是的话,我建议采用正确的方法吗?

您说该查询是在您的应用程序服务器运行后完成的,是每天一次还是更多?如果每天一次,那么你的应用程序应该工作(我考虑增加节点;)),如果你必须经常做这个查询并且你用套装一遍又一遍地“锤击”节点,那么我希望看到你目前正在经历什么。

  

如何防止这些例外?

可能有多种原因,您的计算机,RAM,CPU,磁盘的规格是什么?为Couchbase分配了多少ram,你的水桶多少钱,使用了多少桶水锤?

当我在一些不那么神奇的网络上敲定一些低端AWS实例时,我亲眼看到了这一点。您使用的是什么版本的Couchbase?它可能是各种各样的因素,应该是一个单独的问题。

希望有所帮助!

关于Stale = false参数(来自官方文档)的更多信息的编辑

http://docs.couchbase.com/couchbase-manual-2.2/#couchbase-views-writing-stale

  

在执行查询之前更新索引。这可确保更新(并保留到磁盘)的任何文档都包含在视图中。在执行查询之前,客户端将等待索引更新,因此响应将被延迟,直到更新的索引可用。