我刚开始使用couchbase并希望将它用作我的数据存储。
我执行查询的要求之一是返回关于所有商店中文档的某个字段。此查询在服务器启动时完成一次。 为此,我需要所有存在的文档,并且不能错过任何文档。 我理解在couchbase中的视图最终是一致的,但我仍然希望这个查询可以完成(以性能为代价)。
关于我的配置说明:
我试图以这种方式保存我的文件:
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个问题:
我使用的映射:
function (doc,meta) {
if (doc.doc_type && doc.doc_type == "MyType" && doc.myField) {
emit(meta.id,null);
}
}
谢谢
答案 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
在执行查询之前更新索引。这可确保更新(并保留到磁盘)的任何文档都包含在视图中。在执行查询之前,客户端将等待索引更新,因此响应将被延迟,直到更新的索引可用。