Jas*_*ith 132
遗憾的是,没有详细的文档描述复制协议.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.
感谢杰森的出色概述!正在研究TouchDB及其Couchbase复制的Jens Alfke已经(非正式地)描述了CouchDB复制算法本身,如果您对"标准"CouchDB复制器协议如何工作的技术细节感兴趣.
总结他概述的步骤:
_changes
从那时起获取源数据库revs_diff
批量更改以查看目标上需要哪些更改bulk_docs
两者以进行优化,以便以不同于通常的更高级别MVCC处理的方式存储文档PUT
.我在这里略过了许多细节,并建议阅读原始解释.
CouchDB v2.0.0的文档更广泛地涵盖了复制算法。他们有图表、示例中间响应和示例错误。他们使用 IETF RFC 的“MUST”、“SHALL”等语言。
2.0.0(截至 2016 年 1 月仍未发布)的细节与 1.x 略有不同,但基础仍然如@natevw 所述。