做couchdb视图复制?

时间:2010-06-22 09:23:30

标签: couchdb

我不是指存储在_design docs中的视图源(因为它们只是文档而复制)。我的意思是视图结果(计算的btree)也会复制,或者只是复制常规文档(这就是我现在理解的方式)。

有问题的情况是:
流量出现飙升,我想提出一个临时服务器,并将一部分数据集复制到新服务器上。已经在旧服务器上计算了那些(要复制的)文档的视图,因此不需要在新服务器上重新计算...所以我希望那些旧的计算结果与文档的一部分一起转移。

另一种情况是使用后端群集来计算复杂视图,然后将这些结果复制到实际上被用户请求命中的一堆前端服务器上。

2 个答案:

答案 0 :(得分:5)

正如Till所说,结果没有复制。有关更多详细信息,您实际上不希望它们被复制。您应该记住的一般CouchDB范例是每个安装都被视为一个独立的节点 - 这就是_id,_rev和序列号如此重要的原因。这允许每个节点在不考虑任何其他节点的情况下工作:如果您的一个节点发生故障,所有其他节点将继续在世界范围内不小心处理。

当然,这引入了一些您可能不习惯的关于一致性的新考虑因素。例如,如果您有多个Web服务器,每个Web服务器上都有自己的CouchDB节点,并且这些节点在它们之间运行复制,以便每个实例保持最新,则节点之间将存在延迟。这是一个示例流程:

  1. 用户将更改写入Web服务器A.
  2. 用户向Web服务器B发出读取请求,因为您的负载均衡器确定B是更好的选择。用户获得他们的结果。
  3. Web服务器A通过复制将更新的文档发送到Web服务器B.
  4. 正如您所看到的,用户已获得其文档的先前版本,因为Web服务器B尚未了解更改。这可以用......来打败。

    • 坚持会话,以便所有读写操作都转到同一台服务器。这可能最终会击败您的负载均衡器。
    • 将CouchDB节点从Web服务器移到自己的盒子上。如果你选择这个,那么你可能想看看couchdb-lounge项目(http://tilgovi.github.com/couchdb-lounge/)。
    • 您的用户是否真的关心他们是否会得到陈旧的结果?您的用例可能是您的用户不会注意到他们的结果是否反映他们刚刚做出的更改的用例。确保你真正从这项工作中获得了显着的价值。

    干杯。

答案 1 :(得分:1)

不会复制计算结果。

以下是一些额外的想法:

  • 当您对服务器进行分区并使用它启动第二台服务器时,如何分配读/写并组合视图结果?此设置需要代理一些想法,我建议您查看CouchDB-Lounge

  • 如果您正在使用master-master,则可以使用DRDB使服务器保持同步。它已被证明可以使用mysql master-master复制,我不明白为什么它在这里不起作用。这也意味着计算结果在两台服务器上自动同步。

请告诉我这是否有帮助!