1

Amazonec2インスタンスで実行されているcouchDBサーバーがあります。rpmからのストック1.2.0です。

また、couchbase-mobile-2.0を実行しているAndroidデバイスがいくつかあります。

これらのデバイスは、サーバーから継続的なプッシュおよびプルレプリケーションを開始します。これらのデバイスはすべて、結果整合性が必要です。

ただし、モバイルデバイスの1つがドキュメントをプッシュするときに、他のモバイルデバイスがこのドキュメントをプルしようとすると、デバイスログに次のエラーが表示されます。

 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両端でドキュメントを管理し、最後に確認されたシーケンス番号などを記録することにより、レプリケーションのプロセスを追跡します。

これは、同じことを行うように2つのレプリケーションが設定されているかどうかを特定するためにも使用されます。これは、IDが純粋にパラメーターから生成されるため、同じターゲットとソースを持ち、他のオプションがない2つのレプリケーションが同じIDを持つためです。

Replication_idがどのように生成されるかは完全にはわかりませんが(おそらくどこかに何らかのシードがありますか?)、関係するすべてのマシンで同じように生成される前に、間違いなく問題がありました(すべて同じレプリケーションドキュメントがありました{source:localDb, target:remoteServer:5984/remoteDb})そのため、全員が同じdb / _local / idドキュメントを使用しようとしましたが、リモートサーバー上の同じドキュメントを同時に変更していたため、多数の競合が発生しました。

両方のモバイルデバイスの_replication_idフィールドを比較し、それらが同じであるかどうかを確認することで、これが問題であるかどうかを確認できます

ソースにローカルマシンのアドレスを含めることでこれを修正しました。これにより、すべてのIDが異なり、競合が解消されました。ただし、各モバイルで一貫して機能するローカルアドレス(生成されたホスト名はありますか?)を取得できない限り、モバイルデバイスでは実用的ではない可能性があります。手動でreplication_idを設定する方法が見つかりませんでした。

これが問題である場合、解決策は基本的に、各レプリケーションドキュメントを他のレプリケーションドキュメントとは何らかの方法で一意にすることです。どういうわけか、各モバイルデバイスでデータベースに異なる名前を付けることができますか?

于 2013-03-28T12:10:08.827 に答える