弯曲帽定理 with crdts conflict free repli

在最初的帽子定理12年后,埃里克 布鲁尔写了一篇关于帽子规则如何变化的伟大文章。 总之,使用CRDTs(无冲突复制数据类型),可以在丙、甲和P之间建立一种新的平衡—通常被称为强最终一致性。

我将在这里提供一个更实用的指南,解释为什么CRDTs非常适合应用程序,以及CRDT在Redis中的实现如何为跨多个数据中心运行的应用程序提供简化的开发。

CRDTs实现了一个重要目标:

Provide a mechanism that can
提供一种可以 writes to
能够智能处理的主动-主动地理分布部署而不是现有的基于客户端或应用程序的数据库。 主动-主动地理分布式部署,可以智能地处理对的冲突写入

简化开发 主动-主动地理分布式部署,可以智能地处理对的冲突写入 实现更好的帽子平衡

冲突的

构建复杂的分布式系统,使其在各种各样的故障下都能正常运行是很困难的。 CRDTs使其更安全、更容易处理 冲突的 跨地理分布的主动-主动系统写入。

这是雄心勃勃的。 然而,有一个很大的实际问题!

CRDTs要求系统理解开发人员的意图。

否则,如何判断一个十进制值是一个应该累加所有增量/减量的计数器,还是一个只有最新更新值的绝对值? 例如,起始值为5,假设我们从数据中心1和2 (DC1和DC2)接收更新 -计数器的最终值为(DC1中的5+3)&(DC2中的5+2)= 10 或者-抽象值的最终值将是DC1中的5+3)和(DC2中的5+2)= 7或8 这取决于以后会发生什么!

开发商打算买哪一个?

  • 我们应该使用计数器逻辑还是绝对数字逻辑来解决写入冲突?

    • 如今,数据库使用表(行/列(或文档(XML或JSON)作为建模数据的公分母构建块。

    • 这些现有的数据建模方法不能

  • 区分 “产品”表/JSON文档与

    • “客户”表/JSON文档或每个属性在冲突写下应该如何表现—计数器/绝对。

    • 这里有一个更具体的例子:

客户记录/文件跟踪客户的手机通话和计费周期计量的分钟数。 接听电话时,您的值会增加。 您的阵列会记录您所有呼叫的呼叫者详细信息。 每次录制都可以在美国东部或美国西部的数据中心进行。

当计数器和数组发生冲突写入时,冲突处理逻辑需要是智能的。 需要了解本地增量并准确计算最终使用的分钟数,而不需要重复计算每个数据中心(东部和西部(更新的增量。 但是,需要维护数组的两个添加项,以便在累积调用者详细信息时不会丢失调用者详细信息。然而,在NoSQL和关系数据库中,在表/XML/JSON中,像计数器或数组这样的基本类型在处理冲突写入时是不区分的。 在大多数非结构化查询语言中,LWW(最后作者获胜(语义相当普遍。 在主动-主动地理分布式部署中,LWW会导致在和类型列中丢失更新。 CRDTs设计了一种不会丢失更新的机制。

另一方面,CRDT提供了一个简单而安全的方法来解决这些基于开发者意图的冲突。

Redis提供结构作为核心数据建模工具。 Redis提供计数器、集合、位图、列表、表格等。

,每个数据结构都有自己的命令。 在Redis中,检测开发人员的意图更简单。 数据同步 计数器类型的数据可以使用INCRBY进行递增,并使用大块漂浮植物向集合中添加新成员进行跟踪。

弯曲帽定理 with crdts conflict free repli

反过来Redis,CRDTs可以通过查看所使用的数据类型和命令来解决冲突的写入,并以理解开发人员意图的方式应用逻辑来解决冲突。 无冲突复制数据类型(CRDTs)指的是无需昂贵的协调(如两阶段提交(即可独立更新的复制数据结构,以及比(LWW最后一个作者获胜(更智能的内置冲突解决方案。 使用CRDTs的好处在于,开发人员根本不需要处理分布式并发写入的复杂性。 CRDTs承担所需的冲突解决和跟踪。

有几个场合可以制作CRDTs

必要的 地理分布的应用程序。 数据中心可能会经历以下两种情况 短暂的 或者是长期故障,或者只是进行维护。 在所有情况下,都会发生地理故障转移,将本地用户重定向到剩余的可用地理位置。 在地理故障转移下,有许多问题可能会出错,从而导致更新丢失。 这里有一个例子。想象一下,我们有一个购物车维护在Redis设置。

当用户添加像” a “和“b”这样的产品时,购物车会更新。 然而,当购物者在线时,DC西海岸的一次失败要求我们继续

弯曲帽定理 with crdts conflict free repli

弯曲帽定理 with crdts conflict free repli购物 该用户前往哥伦比亚特区东海岸的购物车更新。 一旦西海岸哥伦比亚特区恢复(在t4),使用CRDTs,购物车将正确地反映用户在购物车中的所有项目,即使地理故障转移 发生。 在这种情况下,如果您碰巧使用的数据库是LWW数据库(最后一个写入者获胜),则购物车只能包含” a “或“b”,因为只有您对k1的一个更新,购物车键才会存在。

这是一个丢失的更新! CRDTs使它更安全。 您不会丢失购物车的任何更新。

  • 有许多应用程序需要捕获、计量和分析分布式事件。 这些应用可以是检测欺诈的应用、收集互动的社交应用、聊天应用以及允许对话的其他通信应用等等。 在这些情况下,跨多个区域同时更新一个Redis哈希表或集合。

  • 无法正确合并这些并发更新的数据库将丢失数据。 让我们继续前面的例子。 想象一个例子,我们正在计算一个帐户下的分钟使用量,我们需要报告剩余时间。

  • 打电话的人接到世界各地许多不同用户的电话,而且有许多本地数据库在打电话时读取和写入数据,从而缩短了打电话人和接电话人的通话时间。

  • 用户1还有100分钟的剩余通话时间。

弯曲帽定理 with crdts conflict free repli

在t1时刻,一个美国手机信号塔记录了一个十分钟的通话。 剩余的分钟数在用户1::使用-分钟上递减10 . 在t2,手机信号塔记录了一个来自欧洲的15分钟通话。 这一次,欧洲数据中心收到了来电,因为来电者的手机信号塔就在那里。

但是,由于t1的呼叫尚未复制到欧洲数据中心,本地记录仍显示呼叫者有100分钟,并报告剩余分钟“85”,用户1:已用-分钟上的获得.

在t3,美国和欧洲数据中心的集群同步。