我有一个运行在亚马逊ec2实例上的couchDB服务器。这是1.2.0的股票,来自每分钟转速。
我还有几个运行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">>}该应用程序的设计方式是,该文档不会被其他设备或服务器编辑,因此不存在版本冲突。
在此之后,在我重新启动应用程序之前,不会再复制、推送或拉取任何文档。(连续复制在应用启动时初始化)。重新启动后,它可以正常工作。
这是什么意思?你知道是什么原因造成的吗?
发布于 2013-03-28 20:10:09
我以前见过这种情况,因为复制ids冲突。
在_replicator数据库中设置复制时,将在文档中添加一个_replication_id字段(例如,当前复制的bf69ede4416770a1fef28ffb4c4e6950+continuous )。复制过程本身使用它来跟踪复制过程,方法是在复制的两端管理http://server:5984/dbname/_local/replication-id上的文档,并在那里记录最后看到的序列号等内容。
如果您设置了两个复制来做相同的事情,这也可以用来识别,因为id完全是从参数中生成的,所以具有相同目标和源的两个复制将具有相同的id。
我不完全确定replication_id是如何生成的(也许在某个地方有某种种子?)但我以前肯定遇到过这样的问题:在涉及的每台机器上生成相同的db/_local/id文档(它们都有相同的复制文档,如{source:localDb, target:remoteServer:5984/remoteDb}),所以它们都尝试使用相同的db/_local/id文档,然后引发了大量的冲突,因为它们都同时在远程服务器上更改相同的文档。
您可以通过比较两个移动设备上的_replication_id字段并查看它们是否是相同的来检查这是否是问题所在。
我修复了这个问题,将本地机器的地址包含在源代码中,这样每个id都是不同的,冲突也就消失了。然而,这对于使用移动设备的您来说可能并不实用,除非您可以在每个移动设备上获得一致的本地地址(一些生成的主机名?)。我找不到任何手动设置replication_id的方法。
如果这就是问题所在,那么解决方案基本上就是以某种方式使每个复制文档与其他复制文档唯一。你能以某种方式给每个移动设备上的数据库命名不同的东西吗?
https://stackoverflow.com/questions/15647998
复制相似问题