What is CRDT in Distributed Systems?

时间:2015-12-10 01:41:03

标签: distributed-computing distributed-system crdt

I am a newbie in Distributed systems and I am trying to get an insight on the concept of CRDT. I realize that it has three notations :

Conflict-free Replicated Data Type
Convergent Replicated Data Type
Commutative Replicated Data Type

Can anyone give an example where we use CRDT in distributed systems? Thanks a lot in advance.

3 个答案:

答案 0 :(得分:18)

CRDT的灵感来自Marc Shapiro的作品。在分布式计算中,无冲突复制数据类型(缩写为CRDT)是一种专门设计的数据结构,用于实现强烈的最终一致性(SEC)和单调性(没有回滚)。确保SEC有两种替代途径:基于操作的CRDT和基于状态的CRDT。

不同副本上的CRDT可以彼此分开,但最后它们可以安全地合并,提供最终一致的值。换句话说,CRDT具有幂等,可交换和关联的合并方法。

这两种选择是等效的,因为可以模仿另一种,但基于操作的CRDT需要来自通信中间件的额外保证。 CRDT用于在网络中的多台计算机之间复制数据,无需远程同步即可执行更新。这将导致使用传统最终一致性技术的系统中的合并冲突,但CRDT的设计使得冲突在数学上是不可能的。在CAP定理的约束下,它们为可用/分区容忍(AP)设置提供了最强的一致性保证。

使用它们的一些示例

Riak是CRDT最受欢迎的开源图书馆,被Bet365和League of Legends使用。以下是一些支持Riak的有用链接。

1- Bet365(使用Erlang和Riak) http://www.erlang-factory.com/static/upload/media/1434558446558020erlanguserconference2015bet365michaelowen.pdf

2- League of Legends将Riak CRDT实施用于其游戏内聊天系统(每秒处理750万并发用户和11,000条消息)

由支持LWW时间戳集的SoundCloud实现的3-Roshi: -Blog post:https://developers.soundcloud.com/blog/roshi-a-crdt-system-for-timestamped-events

答案 1 :(得分:6)

CRDT使用Math在分布式群集中强制实现一致性,而不必担心共识和相关的延迟/不可用性。

CRDT在任何时候都可以采用的值集属于半格(尤其是连接半格)的类别,这是具有最小上限函数的POSET(部分有序集)(LUB )。

简单来说,POSET是一个项目的集合,其中并非所有项目都具有可比性。例如。在一组对中:{(2,4), (4, 5), (2, 1), (6, 3)}(2,4)是< (4,5),但无法与(6,3)进行比较(因为一个元素较大而另一个元素较小)。现在,半格是POSET,其中给出2对,即使你无法比较两者,你也可以找到一个大于两者的元素(LUB)。

另一个条件是对此数据类型的更新需要增加,CRDT具有单调递增的状态,其中客户端从不观察状态回滚。

这个excellent article使用我上面使用的数组作为示例。对于维护这些值的CRDT,如果2个副本试图在(4,5)(6,3)之间达成共识,则可以选择LUB = (6,5)作为共识,并为其分配两个副本。既然值 正在增加,这是一个很好的定价值。

CRDT有两种方式可以在副本之间保持同步,它们可以定期传输状态(会聚复制数据类型),或者它们可以在获取更新(增量)时传输更新(增量)(可交换复制数据类型) 。前者占用更多带宽。

SoundCloud的Roshi是一个很好的例子(虽然它似乎不再在开发中),它们存储与时间戳相关的数据,其中时间戳显然在增加。以时间戳小于或等于存储的时间戳进入的任何更新都将被丢弃,这确保了幂等性(重复写入正常)和可交换性(无序写入正常。交换性为a=b means b=a,在这种情况下意味着更新1其次是update2与update2相同,后跟update1)

写入被发送到所有集群,并且如果某些节点由于诸如缓慢或分区之类的问题而未能响应,则它们预期稍后通过read-repair赶上,这确保了值收敛。如上所述,可以通过2个协议实现收敛,传播状态或更新到其他副本。我相信Roshi是前者。作为read-repair,复制品交换状态的一部分,并且因为数据遵循半格子属性,它们会聚。

PS。使用CRDT的系统最终是一致的,即它们在CAP theorem中采用AP(高可用性和分区容忍)。

Another excellent read on the subject.

答案 2 :(得分:2)

这三个首字母缩略词的扩展都意味着基本相同。

如果在不同序列中应用的相同操作产生(收敛)相同的结果,则CRDT是收敛的。也就是说,操作可以换向 - 这是一个可交换的RDT。操作可以以不同的顺序应用并且仍然得到相同结果的原因是操作没有冲突。

所以CRDT意味着同样的事情,无论你使用哪三个扩展 - 尽管我个人更喜欢“Convergent”。