通过实施实现主动主动地理分布式拓扑CRDTs(无冲突复制数据类型)在Redis Enterprise中使用跨多个集群的全局数据万博体育彩库。这被称为“无冲突复制数据库”或“CRDB”。
CRDB在其他地理分布式解决方案中提供了三种基本好处:
CRDB是跨多个RediS企业集群创建的数据库,该集群通常驻留在世界各地的不同数据中心。万博体育彩每个参与群集中的数据库称为“CRDB实例”。只要CRDB数据集适合CRDB实例内存,就可以使用不同数量的分片来配置每个CRDB实例,并在不同的数量或类型的群集节点上运行。
此外,一个CRDB实例可能运行在启用了高可用性和数据持久性的多可用分区集群配置上,而第二个CRDB实例可能运行在没有高可用性和数据持久性的单可用分区集群配置上。这种高水平的灵活性允许您针对特定的用例优化基础设施成本和数据库性能。
使用CRDB的应用程序连接到本地CRDB实例端点。在网状拓扑中的所有CRDB实例之间使用双向复制,即应用程序对本地实例的所有写操作都被复制到所有其他实例,如下所示:
CRDB架构基于大多数Redis命令和数据类型的替代实现(称为CRDTs,如上所述)。在Re万博体育彩dis Enterprise中,我们的CRDB实现是基于一个专有的Redis模块,它是用Redis模块数据类型API构建的。
读命令使用本地CRDB实例在本地处理。CRDT层固有的无共识机制不需要其他有源-有源实现共同的“读修复”。
写命令的处理分为两个步骤,遵循基于操作的CRDT原则:
行动,CRDTs需要效果更新将被交付给所有CRDB实例,并保证在源FIFO一致性中只交付一次。为了实现这些保证,CRDB通常依赖于Redis复制机制,只做了一些修改。
CRDB复制是由同步器实现的,同步器联系远程主机和请求同行复制(如下所示),专门为此目的引入了一种新的复制机制。对等复制的工作方式类似于标准的Redis复制:
一旦对等端建立了复制链路,就只传播由CRDT模块生成的CRDT效应。根据拓扑结构的不同,可以应用额外的筛选,以便只包含特定的更新。当使用网格拓扑时,对等复制只会对本地CRDB实例产生影响。
CRDB实例可以将不同的复制流推送到不同的对等体,因此对等体复制机制可以管理许多不同的复制积压。
当识别到远程公共IP时,将自动对对等复制应用GZIP压缩,以更好地利用WAN链路。此外,如果在连接建立期间确认了SSL握手,则会自动设置加密。
这里演示了对等复制操作:
在一个或多个CRDB实例失败的情况下,全局CRDB下的其他实例继续读写。即使大多数CRDB实例(例如5个中的3个)都关闭了,其余的CRDB实例仍然是不间断的,可以继续进行读写操作。在这些类型的区域性故障中,无法连接到本地CRDB实例的用户通常被转移到指向某个可用CRDB实例的其他数据中心。这为应用程序的读写提供了不间断的可用性,甚至当用户的本地CRDB实例关闭时也是如此。
在极少数情况下,CRDB实例可能会经历完整的数据丢失,需要从头复制。这种情况需要特殊处理,因为正在恢复的CRDB实例可能已经向它的一些对等节点发送了更新。由于没有进一步的更新,我们不能假设所有的对等点最终会收敛(一些效果消息可能已经被一些对等点接收到,而不是其他的)。在这个场景中,Redis Enter万博体育彩prise实现了一个涉及所有相关CRDB实例的协调机制。一旦协调,恢复实例可以简单地从任何其他副本进行完全同步。
CRDB部署中应用了多种一致性特征:
CRDB冲突解决是基于三个CRDT原则:
每个CRDB实例都单独维护一个向量时钟每个数据集对象/子对象。这个矢量时钟在实例级的任何更新操作时被更新,或者当来自另一个CRDB实例的相同对象的另一个更新操作到达时被更新。
在从另一个实例接收更新操作(和向量时钟)时,在每个CRDB实例上单独执行以下过程:
阶段1:分类更新操作
一个接收到的更新操作可以表示(1)一个新更新,(2)一个旧更新,或(3)一个并发更新。
分类算法的工作原理如下:
当实例A接收到Intansion B关于对象X的更新时:
其中x_vc [a]是实例a和x_vc [b]的对象x的向量时钟是实例b的对象x的矢量时钟。
阶段2:局部更新对象
CRDB冲突解决算法主要基于两个过程:
过程1:对无冲突数据类型/操作的冲突解决方案
在许多并发更新状态案例中,可以根据适用数据类型的属性完全无序地处理更新。这里有一些例子:
在所有这些情况下,根据数据类型策略更新此实例中的对象值。
流程2:使用最后写入胜利(LWW)机制冲突解决
在非冲突无数据类型并发更新的情况下,如Redis String(映射到CRDT的寄存器),应该应用冲突解决算法。我们选择使用LWW方法来解决这种情况,利用操作时间戳作为平局的决胜因素。
请注意,我们的解决方案以强的最终一致方式工作,即使区域之间存在时间戳倾斜。例如,假设实例A的时间戳总是领先于其他实例的时间戳(例如,在平局的情况下,实例A总是赢)。这确保了行为最终是一致的。例子:对于由多个地理上分布式实体访问的用户帐户更改了密码。在这种情况下,更改将导致日志记录其他用户,这可能是许可证实施方案的正确行为。
数据类型:字符串
用例:非并发集合
解决冲突:没有冲突
注意:没有冲突,key1,最后设置为value3”在t5。
数据类型:字符串
用例:并发套装
解决冲突:最后一次写胜(LWW)
注意:t2 > t1由于LWWkey1被设定为“value2。”
数据类型:字符串
用例:附加与德尔
解决冲突:加上胜利
注意:附加“更新”操作是否像“添加”操作一样处理,从而赢得▽操作。
数据类型:字符串
用例:并发过期
解决冲突:更大的TTL获胜
不吃t6,实例B.坚持(坚持key1),意味着它的TTL被设置为大约(即-1)大于One hundred.那样设置实例A..
数据类型:计数器
用例:并发递增/递减操作
解决冲突:无冲突
注意:在CRDT层,计数器值是所有操作的SUM。
数据类型:计数器
用例:并发删除和增量操作(在计数器值中观察到的删除操作)
解决冲突:加上胜利
注意:艰难“更新”操作是否像“添加”操作一样处理,从而赢得▽操作。另外,计数器的删除操作在t3通过实例A.逻辑上意味着重置计数器。
数据类型:集
用例:并发SADD操作到一个集合
解决冲突:没有冲突
注意:此示例是无冲突的,因为大块漂浮植物是一种结合运算。
数据类型:集
用例:在一个集合上并发SADD和SREM操作
解决冲突:加上胜利
注意:在Set元素中添加wins。
数据类型:集
用例:在一个集合上并发复杂操作(观察到的移除)
解决冲突:在Set元素中添加wins
不吃t5实例A.只能移除元素一个和B从key1。
数据类型:酒吧/亚
用例:发布的消息传播到所有CRDB实例
解决冲突:没有冲突
注意:在一个发布回复,仅计算本地订阅者。
数据类型:字符串
用例:垃圾收集
解决冲突:没有冲突
注意:CRDT广泛使用墓碑。在所有情况观察后,墓碑成为垃圾。