是否有技术文档描述两个Couches之间的复制是如何工作的?
CouchDB复制的基本概述是什么?关于它的一些值得注意的特征是什么?
答案 0 :(得分:130)
遗憾的是,没有详细的文档描述复制协议。 CouchDB中只有参考实现,Filipe Manana对其进行了重写,可能会成为未来的新实现。
然而,这是一般的想法:
如果您了解Git,那么您就知道Couch复制是如何工作的。复制非常类似于推送或拉动像Git这样的分布式源管理器。
CouchDB复制没有自己的协议。复制器只是作为客户端连接到两个DB,然后从一个读取并写入另一个。推送复制是读取本地数据并更新远程数据库;拉复制反之亦然。
复制算法很简单,无趣。受过训练的猴子可以设计它。它很简单,因为聪明才是数据模型,它具有以下有用的特性:
JOIN
或一个事务,这很糟糕,但如果你想写一个复制器,这很棒。只需弄清楚如何复制一个记录,然后为每条记录重复。除了应用程序数据({"name": "Jason", "awesome": true}
)之外,每条记录都存储了所有先前修订版ID的进化时间轴。
Git实际上不是一个线性列表。当一方父母有多个孩子时,它有分叉。 CouchDB也有。
练习:比较两个不同的记录,A和B. A的修订ID不会出现在B的时间轴中;但是,一个修订版ID C在 A和B的时间轴中。因此A不是从B.进化而来的.B不是从A演化而来的。而是,A和B有一个共同的祖先C.在Git中,这是一个“分叉”。在CouchDB中,这是一个“冲突”。
在Git中,如果两个孩子继续独立开发时间表,那很酷。福克斯完全支持这一点。
当一个孩子有多个父母时,Git也有合并。 CouchDB 那种也有。
git merge
。 本文中至少有一个句子(可能是这个)是完整的BS。
答案 1 :(得分:9)
感谢Jason的出色概述!正在研究TouchDB及其Couchbase复制的Jens Alfke如果您对“标准”CouchDB复制器协议如何工作的技术细节感兴趣,则(非正式地)描述the CouchDB replication algorithm本身。
总结他概述的步骤:
_changes
revs_diff
以查看目标bulk_docs
进行优化,以便存储文档的方式与通常更高级别的MVCC处理{{1 }}。我在这里略过了许多细节,并建议阅读原始解释。
答案 2 :(得分:4)
documentation for CouchDB v2.0.0 covers the replication algorithm更为广泛。它们具有图表,示例中间响应和示例错误。他们使用IETF RFC的" MUST",#34; SHALL"等语言。
2.0.0的具体内容(截至2016年1月仍未发布)与1.x略有不同,但基础仍为as @natevw described。
答案 3 :(得分:1)
在Apache CouchDB Conf 2013,Benjamin Young在replication.io中介绍了Replication, FTW! talk。这是为基于HTTP的主 - 主复制定义并最终制定规范的持续努力。
答案 4 :(得分:0)