1

我有一个在亚马逊 ec2 实例上运行的 couchDB 服务器。它是 1.2.0 的股票,来自 rpm。

我还有几个运行 couchbase-mobile-2.0 的 android 设备。

这些设备从服务器启动连续推送和拉取复制。所有这些设备都应该最终保持一致。

但是,当其中一台移动设备推送文档时,当另一台移动设备尝试拉取此文档时,我在设备日志中收到以下错误:

 E/CouchDB(9896): [error] [<0.199.0>] Replication `bf69ede4416770a1fef28ffb4c4e6950+continuous` (`treatment` -> `http://portecTest:*****@50.150.250.165:5984/treatment/`) failed: {checkpoint_commit_failure,<<"Error updating the target checkpoint document: conflict">>}

该应用程序的设计方式是该文档不会被其他设备或服务器编辑,因此它不是修订冲突。

在此之后,在我重新启动应用程序之前,不会再复制、推送或拉取文档。(连续复制在应用启动时初始化)。重新启动后,它可以工作。

这是什么意思?有什么想法可能导致它吗?

4

1 回答 1

1

由于复制 ID 冲突,我以前见过这种情况。

当您在_replicator 数据库中设置复制时,_replication_id会向文档中添加一个字段(例如,bf69ede4416770a1fef28ffb4c4e6950+continuous,用于您当前的复制)。复制过程本身使用它来跟踪复制过程,方法是在复制的http://server:5984/dbname/_local/replication-id两端管理文档,并在那里记录最后看到的序列号等内容。

这也用于发现您是否设置了两个复制来执行相同的操作,因为 id 完全由参数生成,因此具有相同目标和源且没有其他选项的两个复制将具有相同的 id。

我不完全确定 replication_id 是如何生成的(也许某处有某种种子?)但我肯定遇到过问题,之前它在所涉及的每台机器上都以相同的方式生成(它们都有相同的复制文档,如{source:localDb, target:remoteServer:5984/remoteDb}) ,因此他们都尝试使用相同的 db/_local/id 文档,然后引发大量冲突,因为他们都在同时更改远程服务器上的同一个文档。

您可以通过比较两个移动设备上的 _replication_id 字段并查看它们是否相同来检查这是否是问题所在

我通过在源中包含本地机器的地址来解决这个问题,这样每个 id 都不同,冲突就消失了。但是,这对您使用移动设备可能不切实际,除非您可以在每台移动设备上获得一致的本地地址(某些生成的主机名?)。我找不到任何手动设置replication_id 的方法。

如果这是问题所在,解决方案基本上是使每个复制文档以某种方式与其他文档不同。你能以某种方式在每个移动设备上为数据库命名不同的东西吗?

于 2013-03-28T12:10:08.827 回答