深入CRDTs

active - active Geo-Distribution允许你把你的Redis数据库集群实例靠近你的用户,无论他们在哪里。放置在任何可能的情况下,复制离用户更近显然是正确的做法,但对于应用程序来说write-heavy这还不够——如果没有Active-Active设置,写操作仍然会很慢。那么,如何针对Active-Active集群进行开发呢?

介绍CRDTs

无冲突复制数据类型(crdt)是一系列复制数据类型,它们具有一组公共属性,这些属性使在它们上执行的操作始终收敛到所有副本之间一致的最终状态。为了确保冲突不会发生并在应用程序中引起问题,对crdt的操作必须遵循一组特定的代数属性。

在Redis Enterprise中,当你创万博体育彩建一个支持CRDT的数据库时,正常的命令会与等价的CRDT实现交换。让我们看一个Redis数据结构的例子,它有一个CRDT等效,以及Active-Active分布式复制添加的细微差别。

在复述,

Redis集合类似于你最喜欢的编程语言提供的标准库,提供专门的操作来添加和删除元素,检查一个元素是否是集合的一部分,并执行集合的交集,并集和差集。下面是调用实际Redis命令时的样子:

//创建一个集合:
水果,苹果,梨,香蕉
3.

//测试是否包含apple:
> SISMEMBER水果苹果
1

//去掉一个水果:
>水果香蕉
1

//测试它是否仍然存在:
SISMEMBER水果香蕉
0

在启用crdt的Redis Enterprise数据库中运行相同的命令将显示相同的行为,万博体育彩但在幕后发生的事情是完全不同的。

关键是,在CRDT数据库中,所有复制节点都可以将更改应用到“水果“关键,彼此独立。”这使您能够编写真正的地理分布式应用程序。缺点是,现在写入值时也会出现“复制延迟”。然而,这种方法为地理分布的应用程序提供了巨大的优势。

CRDT集

在一个支持万博体育彩Redis Enterprise crdt的数据库中,set操作在一些额外的规则下工作,当合并来自不同节点的操作时,两个最重要的规则被应用:

  1. 添加胜过删除。
  2. 删除仅作用于执行命令的副本已经看到的元素。

第二条规则有时被称为“观察到的删除”规则,这意味着您只能删除在命令发出时能够观察到的项目。

关于复制延迟和一致性模型的注意事项

虽然最终所有副本节点将收敛到相同的最终状态,但在短期内,发送到ReplicaEU的命令可能还没有传播到ReplicaUS。这种情况(尽管通常很简单)就是为什么CRDT数据结构必须硬编码冲突解决策略的原因。同一个CRDT数据库中的所有副本将不断同步它们的状态,以提供尽可能一致的数据集视图,但请记住,在网络分区的情况下,CRDT对于确保高可用性也很有用。

这意味着要在您的系统中实现更好的弹性,您将需要考虑到系统尚未完全同步的长时间时刻的可能性。这使得CRDTs成为一种最终一致性的形式。这通常被描述为强大的最终一致性因为它比基于仲裁配额的更常见的复制类型效率更高。(有关更多信息,请参见Redis Active-Active Geo-Distribution页面.)

更多的CRDT数据结构

要获得Redis Enterprise支持的CRDT数据结构的完整列表,万博体育彩看一看官方文档

开发CRDTs

开发双活应用程序的实际要求是什么?

让我们看看可能引发问题的主要开发方面。

客户端库

一个问题是,你是否需要一种特殊类型的Redis客户端来与CRDT数据库交互。答案是没有任何正常的Redis客户端可以连接到CRDT数据库并直接执行命令。如前所述,命令不会改变,改变的是底层机制。客户端唯一不提供开箱即用的功能是连接到不同地理分布副本的能力,以防最接近服务实例的副本不可用。我们正在解决这个问题,但与此同时,在网络分裂的情况下,您必须在应用程序级别决定何时连接到不同区域的副本是合适的。

应用程序体系结构

Active-Active的优点是能够在全局分布的服务实例之间共享某些状态,同时在操作该状态时经历本地延迟。要充分利用这一功能,您的服务需要尽可能地依赖crdt的语义,并因此避免保留在发生故障时可能丢失(或无法合并)的内部状态。

也就是说,crdt不能解决所有问题,因为它们硬编码特定的合并规则,可能不适合您的特定问题。计数器就是一个典型的例子:CRDT计数器很好,但它们不能用于建模银行帐户余额,因为合并可能会使计数器变为负值——在应用程序级别没有办法防止这种情况发生。换句话说,crdt是一种有效但微妙的最终一致性形式,它不能恰当地应用于固有的事务性问题。

测试

测试Active-Active应用程序似乎比测试普通的单主应用程序要困难得多。虽然crdt确实是数据模型的一个复杂组件,但它们的行为在最终结果方面是完全确定的。您必须考虑的主要情况是在对集群进行分区时。如上所述,可以继续向已与集群其余部分断开连接的副本发送更新,因为在重新建立连接时,更新最终将成功合并。您只需要确保在与整个Active-Active数据库集群断开连接时,您的服务仍然可以正常运行。

换句话说,您需要的唯一不明显的额外测试应该是关于应用程序在发生网络分区时的行为。

对全局用户的本地延迟

CRDTs允许您创建地理分布的应用程序,它可以为您的整个用户群提供本地延迟,同时使您的整个应用程序对故障更具弹性。虽然不是所有的问题都可以通过crdt解决,但仍有很大的改进空间,大多数公司可以从中受益。举个例子,看一下凯尔·戴维斯最近的一篇博客他展示了如何使用排序集实现排行榜,并暗示了CRDT版本的好处。

要了解更多关于使用Redis Enterprise编写Active-Active应用程序的内容,请查看我们的万博体育彩引擎盖下:CRDTs白皮书和官方文档

Baidu