【问题标题】:What is CRDT in Distributed Systems?什么是分布式系统中的 CRDT?
【发布时间】:2015-12-10 01:41:02
【问题描述】:

我是分布式系统的新手,我正在尝试深入了解 CRDT 的概念。 我意识到它有三个符号:

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

谁能举一个我们在分布式系统中使用 CRDT 的例子? 提前非常感谢。

【问题讨论】:

  • 如果回答了您的问题,则标记为已接受。

标签: distributed-computing distributed-system crdt


【解决方案1】:

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

不同副本上的 CRDT 可以相互分歧,但最终它们可以安全地合并,从而提供最终一致的值。换句话说,CRDTs有一个幂等、交换和关联的合并方法。

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

使用它们的一些示例

Riak 是 CRDT 最流行的开源库,被 Bet365 和英雄联盟使用。以下是一些支持 Riak 的有用链接。

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

2- 英雄联盟在其游戏内聊天系统中使用 Riak CRDT 实现(每秒处理 750 万并发用户和 11,000 条消息)

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

【讨论】:

    【解决方案2】:

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

    CRDT 可以随时取值的集合属于半格(特别是连接半格)的类别,它是具有最小上界函数 (LUB) 的 POSET(部分有序集) )。

    简单来说,一个 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 有 2 种方法可以在副本之间保持同步,它们可以定期传输状态(收敛复制数据类型),或者可以在获取更新时传输更新(增量)(交换复制数据类型) .前者占用更多带宽。

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

    写入被发送到所有集群,如果某些节点由于速度慢或分区等问题而无法响应,它们预计稍后会通过read-repair 赶上,这可确保值收敛。收敛可以通过我上面提到的 2 个协议来实现,将状态或更新传播到其他副本。我相信罗希是前者。作为read-repair 的一部分,副本交换状态,并且由于数据遵循半格属性,它们会收敛。

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

    Another excellent read on the subject.

    【讨论】:

      【解决方案3】:

      这三个缩写词的扩展基本上都意味着相同的东西。

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

      所以 CRDT 的意思是一样的,无论你使用三个扩展中的哪一个 - 虽然我个人更喜欢“Convergent”。

      【讨论】:

      • 非常感谢@cliffordheath。您详细解释了所有三个术语。但是你能举个例子吗?
      • 谷歌的第一个 CRDT 搜索详细解释了它,并附有示例。我只是解释了为什么这些名字的意思是一样的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2011-06-28
      • 2014-02-18
      • 2013-06-09
      • 2023-03-22
      • 2018-03-10
      • 2014-05-21
      相关资源
      最近更新 更多