是否有描述两个Couches之间复制如何工作的技术文档?
CouchDB复制的基本概述是什么?它有哪些值得注意的特征?
Answers:
不幸的是,没有详细的文档描述复制协议。CouchDB中仅内置了参考实现,而Filipe Manana对该参考实现的重写可能会在将来成为新的实现。
但是,这是一个总体思路:
如果您知道Git,那么您就会知道Couch复制是如何工作的。复制与使用Git等分布式源管理器进行推送或拉取非常相似。
CouchDB复制没有自己的协议。复制器只是作为客户端连接到两个数据库,然后从一个数据库读取并向另一个数据库写入。推复制正在读取本地数据并更新远程数据库;拉复制反之亦然。
复制算法是琐碎的,无趣的。受过训练的猴子可以设计它。这很简单,因为聪明是数据模型,它具有以下有用的特征:
JOIN
事务或事务,这很糟糕,但是如果要编写复制器,那就太好了。只需弄清楚如何复制一条记录,然后为每条记录重复该过程即可。除应用程序数据({"name": "Jason", "awesome": true}
)外,每个记录还存储所有导致其自身的先前修订ID的演变时间表。
Git并不是一个线性列表。当一个父母有多个孩子时,它有叉子。CouchDB也有。
练习:比较两个不同的记录,A和B。A的修订ID不会出现在B的时间轴中;但是,在A和B的时间轴中都有一个修订IDC。因此,A不是从B进化而来的。B也不是从A进化而来的。相反,A和B具有共同的祖先C。在Git中,这是“叉子”。在CouchDB中,这是一个“冲突”。
在Git中,如果两个孩子都继续独立地制定时间表,那就太酷了。福克斯完全支持。
当一个孩子有多个父母时,Git也可以合并。CouchDB的那种具有太多。
git merge
。此文章中至少有一个句子(可能是这句话)是完整的BS。
感谢Jason的出色概述!如果您对“标准” CouchDB复制器协议将如何工作的技术细节感兴趣,那么致力于TouchDB及其Couchbase复制的Jens Alfke(非正式地)描述了CouchDB复制算法本身。
总结一下他概述的步骤:
_changes
从那时起获取源数据库revs_diff
一批更改来查看目标上需要哪些更改bulk_docs
两者进行优化,以便与通常的更高级别MVCC处理不同地存储文档PUT
。我在这里已经掩盖了许多细节,并且建议您也仔细阅读原始说明。
在Apache的CouchDB中的conf 2013,本杰明·扬介绍replication.io在他的复制,FTW!说话。定义并最终完善基于HTTP的master-master复制的规范是一项持续的工作。