什么是CouchDB复制协议?像Git吗?


Answers:


136

不幸的是,没有详细的文档描述复制协议。CouchDB中仅内置了参考实现,而Filipe Manana对该参考实现的重写可能会在将来成为新的实现。

但是,这是一个总体思路:

关键点

如果您知道Git,那么您就会知道Couch复制是如何工作的。复制与使用Git等分布式源管理器进行推送或拉取非常相似。

CouchDB复制没有自己的协议。复制器只是作为客户端连接到两个数据库,然后从一个数据库读取并向另一个数据库写入。推复制正在读取本地数据并更新远程数据库;拉复制反之亦然。

  • 有趣的事实1:在它自己的过程中,复制器实际上是一个独立的Erlang应用程序。它连接到两个沙发,然后从一个沙发读取记录,然后将它们写入另一个沙发。
  • 有趣的事实2:CouchDB无法知道谁是普通客户端,谁是复制者(更不用说复制是推式还是拉式了)。一切看起来都像客户端连接。他们中有些人读记录。其中一些人写记录。

一切都源于数据模型

复制算法是琐碎的,无趣的。受过训练的猴子可以设计它。这很简单,因为聪明是数据模型,它具有以下有用的特征:

  1. CouchDB中的每个记录都完全独立于其他所有记录。如果要执行JOIN事务或事务,这很糟糕,但是如果要编写复制器,那就太好了。只需弄清楚如何复制一条记录,然后为每条记录重复该过程即可
  2. 像Git一样,记录具有链接列表修订历史记录。记录的修订ID是其自身数据的校验和。后续的修订ID是以下各项的校验和:新数据,加上先前的修订ID。
  3. 除应用程序数据({"name": "Jason", "awesome": true})外,每个记录还存储所有导致其自身的先前修订ID的演变时间表。

    • 练习:花点时间安静地思考。考虑任意两个不同的记录,即A和B。如果A的修订ID出现在B的时间轴中,那么B肯定是从A演变而来的。现在考虑Git的快速合并。你听到了吗 那就是你的心灵被震撼的声音。
  4. Git并不是一个线性列表。当一个父母有多个孩子时,它有叉子。CouchDB也有。

    • 练习:比较两个不同的记录,A和B。A的修订ID不会出现在B的时间轴中;但是,在A和B的时间轴中都有一个修订IDC。因此,A不是从B进化而来的。B也不是从A进化而来的。相反,A和B具有共同的祖先C。在Git中,这是“叉子”。在CouchDB中,这是一个“冲突”。

    • 在Git中,如果两个孩子都继续独立地制定时间表,那就太酷了。福克斯完全支持。

    • 在CouchDB中,如果两个孩子都继续独立地开发时间表,那也很酷。冲突完全支持这一点。
    • 有趣的事实3: CouchDB“冲突”与Git“冲突”不对应。Couch冲突是不同的修订历史,Git称之为“分支”。因此,CouchDB社区将“ conflict”发音为无声n:“ co-flicked”。
  5. 当一个孩子有多个父母时,Git也可以合并。CouchDB的那种具有太多。

    • 在数据模型中,没有合并。客户端只是将一个时间线标记为已删除,并继续使用唯一的现有时间线工作。
    • 在应用程序中,感觉就像是合并。通常,客户端以特定于应用程序的方式合并来自每个时间轴的数据。然后,它将新数据写入时间轴。在Git中,这就像将更改从分支A复制并粘贴到分支B,然后提交到分支B并删除分支A。数据已合并,但是没有git merge
    • 这些行为是不同的,因为在Git中,时间表本身很重要。但是在CouchDB中,数据很重要,而且时间安排是偶然的-它只是为了支持复制而已。这就是为什么CouchDB的内置修订版不适用于存储修订版数据(如Wiki页面)的原因之一。

最后的笔记

此文章中至少有一个句子(可能是这句话)是完整的BS。


1
给CouchDB开发人员的注意事项。为了使基础更加清晰,该答案特意忽略了一些细节。但是,我很高兴欢迎对材料进行更正或更新。
JasonSmith 2011年

史诗般的答案是史诗般的!@JasonSmith,您介意将此信息添加到CouchDB Wiki吗?
Octavian A. Damiean

谢谢!是的,随时将其添加到Wiki,那太好了。
JasonSmith

10

感谢Jason的出色概述!如果您对“标准” CouchDB复制器协议将如何工作的技术细节感兴趣,那么致力于TouchDB及其Couchbase复制的Jens Alfke(非正式地)描述了CouchDB复制算法本身。

总结一下他概述的步骤:

  1. 找出以前复制的结果
  2. _changes从那时起获取源数据库
  3. 使用revs_diff一批更改来查看目标上需要哪些更改
  4. 将任何缺少的修订元数据和当前文档数据和附件从源复制到目标,同时发布到bulk_docs两者进行优化,以便与通常的更高级别MVCC处理不同地存储文档PUT

我在这里已经掩盖了许多细节,并且建议您也仔细阅读原始说明。




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.