无冲突复制数据类型

在分布式计算中，无冲突复制数据类型（）是一种可以在网络中的多台计算机上复制的数据结构，副本可以独立和并发地更新，而不需要在副本之间进行协调，并且在数学上总是可以解决可能出现的不一致问题。

CRDT的概念是由Marc Shapiro、Nuno Preguiça、Carlos Baquero和Marek Zawirski于2011年正式定义。 开发的最初动机是和移动计算。CRDTs也被用于在线聊天系统、在线赌博和SoundCloud音频分发平台中。NoSQL分布式数据库Redis、Riak和Cosmos DB有CRDT数据类型。

背景 

对同一数据的多个副本同时进行更新，而托管这些副本的计算机之间没有协调，可能会导致副本之间的不一致，在一般情况下，这些不一致可能无法解决。当更新之间存在冲突时，恢复一致性和数据完整性可能需要完全或部分放弃一些或全部的更新。

因此，分布式计算的大部分内容都集中在如何防止复制数据的并发更新问题上。但另一种可能的方法是，即允许所有并发的更新通过，可能会产生不一致的情况，而结果会在以后合并或“解决”。在这种方法中，副本之间的一致性最终会通过不同副本的“合并”来重新建立。虽然乐观复制在一般情况下可能不起作用，但事实证明，有一类重要的、实际有用的数据结构，即CRDT，它确实能够起到作用——在数学上，总是有可能在数据结构的不同副本上合并或解决并发更新而不产生冲突。这使得CRDT成为乐观复制的理想选择。

举个例子，单向的布尔事件标志是一个最简单的CRDT：它有一个比特，其值为真或假。“真”意味着某些特定事件至少发生过一次。“假”的意味着该事件没有发生。一旦设置为真，该标志就不能再设置为假。（一个事件一旦发生，就已不可改变。）解决方法是 "真赢"：当合并一个标志为真（该副本已经观测到该事件）的副本和另一个标志为假（该副本没有观测到该事件）的副本时，解决的结果是真——该事件已经被观测到。

CRDT的种类

CRDT有两种方法，都可以提供最终一致性：基于操作的CRDT和基于状态的CRDT。

这两种方法在理论上是等同的，因为一个可以模仿另一个。 然而，实际上还是有区别的。基于状态的CRDT通常更容易设计和实现；它们对通信底层的唯一要求是某种。它们的缺点是，每个CRDT的整个状态最终都必须传输给其他每个副本，这可能开销很大。相比之下，基于操作的CRDT只传输更新操作，通常很小。然而，基于操作的CRDT需要通信中间件的保证；在传输给其他副本时，操作不会被丢弃或重复，而且它们是按传输的。

基于操作的CRDT
基于操作的CRDT也被称为交换性复制数据类型（commutative replicated data types，或CmRDT）。CmRDT副本只通过传输更新操作来传播状态。例如，单一整数的CmRDT可以广播操作（+10）或（-20）。副本接收更新并在本地应用这些更新。这些操作是可交换的。然而，它们不一定冪等。因此，通信基础设施必须确保一个副本上的所有操作都被传递给其他副本，没有重复，但以任何顺序传输都是可以的。

纯基于操作的CRDT是基于操作的CRDT的一个变种，它减少了元数据的大小。

基于状态的CRDT
基于状态的CRDT被称为收敛复制数据类型（convergent replicated data types，或CvRDT）。与CmRDT相反，CvRDT将其完整的本地状态发送给其他副本，在这些副本中，状态必须通过可交换的、可结合的并且是幂等的函数合并。合并函数为任何一对副本的状态提供连接，因此所有状态的集合形成一个半格。更新函数必须按照与半格相同的规则，单调地增加内部状态。函数必须内部状态，根据与半网格相同的偏序规则。

Delta状态CRDT（或简称Delta CRDT）是基于状态的优化CRDT，其中只有最近应用到一个状态的更改才会被传播，而不是传播到整个状态。

对比
虽然CmRDT对副本间传输操作的协议提出了更多的要求，但当事务数量与内部状态的大小相比较小时，它们使用的带宽比CvRDT要少。不过，由于CvRDT的合并函数是可结合的，与某个副本的状态合并会产生该副本之前的所有更新。在向其他副本传播CvRDT状态时效果很好，同时减少了网络使用并处理了拓扑变化。

基于状态的CRDT的存储复杂性的一些下界是已知的。

行业运用
Nimbus Note是一个协作记事的应用程序，使用Yjs CRDT进行协作编辑。

Redis是一个分布式、高可用和可扩展的内存数据库，它使用CRDT来实现基于开源Redis的全球分布式数据库，并与之完全兼容。

SoundCloud开源了Roshi ，这是一个在Redis之上实现的用于SoundCloud流的LWW-元素集CRDT。

Riak是一个基于CRDT的分布式NoSQL键值数据存储。 英雄联盟将Riak CRDT实现用于其游戏内的聊天系统，该系统可处理750万并发用户和每秒11000条信息。 Bet365，在OR-Set的Riak实现中存储了数百MB的数据。

TomTom采用CRDT在用户的设备之间同步导航数据。

Phoenix，一个用Elixir编写的网络框架，在1.2版本中使用CRDT来支持实时的多节点信息共享。

Facebook在他们的Apollo低延迟“规模一致性”数据库中实现了CRDT。

Teletype for Atom采用了CRDT，使开发人员能够与团队成员分享他们的工作空间，并实时进行代码协作。

Haja Networks的OrbitDB在其核心数据结构IPFS-Log中使用基于操作的CRDT。

苹果在Notes应用中实现了CRDT，用于在多个设备之间同步离线编辑。

参考文献

外部链接
 A collection of resources and papers on CRDTs 
 "Strong Eventual Consistency and Conflict-free Replicated Data Types" (A talk on CRDTs) by Marc Shapiro
 Readings in conflict-free replicated data types  by Christopher Meiklejohn
 CAP theorem and CRDTs: CAP 12 years later. How the rules have changed   by Eric Brewer

分散式演算法
容错计算机系统