点 未来之快即将在您所在城市的一个活动中呈现。

加入我们参加 Redis 已发布

为什么将 Dynomite 数据库迁移到 Redis Enterprise 主动-主动型数据库?

Redis OSS 自 2009 年创建以来,一直拥有非常活跃的开源社区。围绕它开发了许多工具和实用程序,Dynomite 就是其中之一,它是一个非分布式数据存储的点对点地理分布层。

Dynomite 由 Netflix 上的一组工程师开发,并作为开源软件发布。尽管它为特定需求提供了良好的解决方案,但在过去几年中并没有得到有效的维护。此外,Redis OSS 的某些功能、命令和数据类型(例如 Pub/Sub 或 Streams)因 Dynomite 的 Redis OSS 实例发行模型而不可用或受到限制。

因此,我们一直在帮助组织将其 Dynomite 数据库迁移到 Redis Enterprise 集群。

Dynomite 和 Redis Enterprise 架构比较

让我们从快速描述 Dynomite 和 Redis Enterprise 的架构开始我们的比较。

Dynomite

典型的 Dynomite 集群可描述如下

  • 跨越多个数据中心

  • 单个数据中心是一组机架

  • 机架是一组节点:每个机架都包含整个数据集,该数据集被划分到该机架中的多个节点

dynomite cluster diagram

Dynomite 是一款点对点分发层,因此客户端可以将写流量发送到 Dynomite 集群中的任何节点。如果节点负责数据,则数据会被写入其本地 Redis OSS 服务器进程,然后异步复制到集群中所有数据中心的其他机架。如果节点不拥有数据,它将充当协调器并将写操作发送到同一机架中拥有数据的节点。它还将写操作复制到其他机架和 DC 中的相应节点。

Redis Enterprise

Redis Enterprise 集群也通过不同的 Redis 实例或分片来分发数据,但有以下两个主要区别

  • 一个节点上可以有多个分片 - 但出于高可用目的,主分片和副本分片不能驻留在同一节点上。

  • 每个主分片只有一个副本分片。客户端针对主分片执行数据操作。如果主分片出现故障,它们各自的副本分片存在,以实现高可用性。

Redis Enterprise 集群的另一个重要组成部分是所谓的“管理路径”,其中包括集群管理器、代理和 REST API/UI。集群管理器负责协调集群,将数据库分片置于高可用节点,并检测故障。代理将应用程序的 Redis Enterprise 集群拓扑隐藏起来,方法是为集群内的每个数据库提供一个从不改变的端点。它也有助于通过复用和分片命令,扩展客户端连接。

以下是典型 Redis Enterprise 集群的示意图

redis enterprise cluster image

借助 Redis Enterprise 的 Active-Active 功能,你可以创建一个跨越多个集群的全球数据库。这些集群通常位于世界各地的不同数据中心。写入 Active-Active 数据库的应用程序连接到本地实例端点。应用程序对本地实例的所有写入都将复制到具有强烈最终一致性的所有其他实例。

主动-主动复制为地理分布式解决方案提供了许多优势,其中之一是针对简单和复杂的 Redis Enterprise 数据类型的无缝冲突解决,我们将在下面讨论。

现在我们对 Dynomite 和 Redis Enterprise 的拓扑结构有了了解,让我们看看它们对组织中的开发人员和 DevOps 意味着什么。

Dynomite 或 Redis Enterprise:对开发人员来说有什么区别?

除了 Dynomite 没有被积极维护之外,从开发者的角度来看,组织想要从 Dynomite 迁移 到 Redis Enterprise 的主要原因有三个:

  • 使用 Dynomite 时,Redis 的功能受到限制,而且更加复杂

  • Dynomite 无法有效处理地理分布写冲突

  • 您可以从 Redis 获得支持

让我们更详细地了解前两个原因。

受限且复杂的 Redis OSS

正如您可能已经知道的那样,Redis OSS 不是一个简单的键值存储,也就是说,它不仅允许您将字符串键与字符串值相关联。Redis OSS 是一个支持不同类型值(例如列表、集合、哈希或流)的数据结构服务器。我们称之为 Redis OSS 的“核心数据类型”。

Redis OSS 也可通过称为“模块”的动态库进行扩展。借助模块,您可以使用与在内核内部执行类似的功能快速实现新的 Redis 命令。最流行的模块包括提供查询、辅助索引和全文搜索的RediSearch,以及将 Redis OSS 转变为功能强大的文档存储的RedisJSON

如同在引言中所讨论的,某些 Redis OSS 命令和数据类型由 Dynomite 渲染为不可用或受限。以下是一个非详尽比较

redis oss and dynomite

您可以在此处找到 Dynomite 支持和不支持命令的完整列表。

另一方面,Redis Enterprise 与 Redis OSS 并行维护,允许使用模块进行多模型操作,并以完全可编程和分布式的方式执行核心 Redis OSS 数据结构。

不存在冲突解决

Dynomite 是一个 AP 系统,为一致性提供了三种选择。无论您选择哪种选项,务必知道 Dynomite 通过应用Last Write Wins 策略解决异步写冲突。这可能会由于不相关的时间戳导致更新丢失,尤其是在地理分布式写入的上下文中。

另一方面,Redis Enterprise 的 Active-Active 架构基于 Redis OSS 命令和被称为无冲突复制数据类型 (CRDT) 的数据类型的另一种实现。CRDT 使用向量时钟进行事件排序。它们确保当任何两个副本接受相同的一组更新时,它们会通过采用数学上可靠的规则来以确定性的方式达到相同状态,以保证状态收敛。另外,你也可以启用因果一致性。

因此,使用 Redis Enterprise

  • 并发写入的结果是可预测的,并且基于一组规则

  • 应用程序不必担心并发写入和写入冲突的解决

  • 数据集最终会收敛到一个单一的、一致的状态

如果你准备好了,你可以通过关注此 链接 来查找已实现的规则以及冲突解决的示例。

Dynomite 或 Redis Enterprise:这对 DevOps 来说有什么区别?

现在,让我们从 DevOps 的角度比较 Dynomite 和 Redis Enterprise,通过讨论以下主题

  • 高可用性

  • 可伸缩性

  • 可部署性

高可用性

当一个节点在 Dynomite 机架内出现故障时,写操作和读操作对机架的操作就不可能了。这意味着在本地写入的应用程序需要自己处理到另一个机架的故障转移。请注意,如果你的应用程序是在 Java 中开发的,Netflix 的 Dyno 客户端能够在本地 Dynomite 节点出现故障时处理到远程机架的故障转移。

此外,当节点恢复后,在故障期间写在远程机架上的任何数据都会在出现故障的节点中丢失。如果你在 AWS 自动扩容组内部署,你可以使用 Netflix 的 Dynomite 管理器,它在 AWS 自动扩容组中执行节点替换和节点预热。

Redis Enterprise 的高可用性怎么样?

当一个节点出现故障时,会为所有位于该节点上的主分片执行持续几秒钟的故障转移,并且它们的副本将晋升为主副本。这种自动故障转移机制保证了会在最小的中断下提供数据。

基于这一点,

  • Redis Enterprise 代理会确保你的数据库的单一端点在故障转移时不会更改,因此不需要重新配置你的应用程序。

  • 有一个“replica_ha”选项,它能确保当一个副本晋升为主副本时,会在任何其他可用节点上自动创建一个新的同步副本分片。

这些机制能让 Redis Enterprise 保证 99.99% 的正常运行时间和 99.999% 的正常运行时间,用于 Active-Active 部署

可伸缩性

使用 Dynomite 可以扩展 Redis OSS 的规模,同时还可以保持较小的延迟时间,从而获得良好的性能。你可以查看 基准,如果你正在使用 Dynomite,你可能已经知道了这些。

关于可扩展性,Dynomite 和 Redis Enterprise 之间的主要区别是

  • 可管理性

  • 开箱即用的连接管理

  • 资源优化

可管理性

如果你没有在 AWS 自动扩容组中使用 Dynomite Manager,那么给正在运行的 Dynomite 机架添加主机通常需要

  • 使用 Java Dyno 客户端利用“双重写入”技术,你的应用程序可以写入旧/小集群和新/扩容的集群。几天之后,你只给新集群分发流量,并使之成为活动集群。

  • 从旧/小集群将你的数据库迁移到新/扩容的集群

另一方面,借助 Redis Enterprise,你可以

  • 通过给你的数据库添加分片来向上扩容,而不给你的集群添加节点:这种场景在集群中具有足够的未使用的容量时是有用的。请记住:一个节点并不等于一个 Redis 实例。重新对你的数据库分片可以通过 Redis Enterprise 的 UI 界面或通过利用 Redis Enterprise 的 REST API 点击几下完成。这项工作在不宕机或不中断服务的情况下完成。此外,这项工作对于应用程序是透明的,因为数据库的端点不会发生变化。

  • 通过给集群添加节点来向外扩容。如果需要更多物理资源来给你的数据库添加分片,这种场景是有用的。请注意,使用 Redis Enterprise Cloud(这是一款全托管 DBaaS 产品),组织机构不需要担心这一步。Redis 会为它们预置并管理基础设施和资源。有关更多信息,请参见本文的部署部分。

此处是 Redis 几年之前完成的基准,其中 Redis Enterprise 在 40 个 AWS 实例上实现了超过 2 亿次/秒的操作,并具有低于毫秒的延迟时间。

连接管理

当我们谈及 Redis 的连接管理时,首先想到的是 Redis 客户端(例如 Jedis 或 Lettuce)如何处理连接池和管道。对于这一点,Netflix 也不例外,并为 Dyno 客户端实施了这些功能。

Redis Enterprise 开箱即用就能提供这些功能。代理本身会与集群中的分片建立持久连接,而且这些连接由客户端共享。通过在一系列分片的持久连接的调度请求中应用性能优化,并在 Redis 的一侧执行复用和管道,也会应用性能优化。

此外,代理是多线程的,并且会自动扩展以处理客户端连接中的突发流量。

资源优化

首先,让我们记住,在一个 Redis Enterprise 集群中一台机器不等于一个 Redis 实例,并且每个主分片最多只能有一个副本。

其次,Redis Enterprise 是 多租户 的。这意味着一个 Redis Enterprise 集群可以处理数百个完全隔离的数据库。使用 Dynomite 这样做远非小事。值得注意的是,Redis Enterprise 的多租户功能非常适合其多模式功能。在微服务的上下文中,人们可以想象在一组节点中运行不同的适合用途的数据库,每个数据库都有自己的复制、扩展、持久性和模块配置。

最后,Redis Enterprise 还有一个名为 Redis On Flash (RoF) 的功能。RoF 使您的数据库能够同时使用 RAM 和专用闪存(SSD/NVMe)来处理更大的数据集,具有与 RAM 一样的延迟和性能,但与全 RAM 数据库相比,成本降低 >70%。

部署选项

Dynomite 可以部署在运行 Ubuntu、RHEL 和 CentOS 的容器或机器中。部署始终是自我管理的,因为您需要提供基础架构和资源来管理集群。此外,如前所述,如果您想利用 Dynomite Manager 的功能,您需要在 AWS 自动扩展组中部署 Dynomite。

另一方面,Redis Enterprise 有许多部署选项,可以分为两组

  • 自管理解决方案,您可以自己下载、安装和部署 Redis Enterprise 软件。有很多选项,包括 Linux 安装程序(多个发行版)、Amazon Machine Image (AMI)、Docker 容器、Kubernetes、RedHat OpenShift、Google Kubernetes Engine (GKE)、Azure Kubernetes Service (AKS) 或 Amazon Elastic Kubernetes Service (EKS)。

  • 托管解决方案:Redis Enterprise Cloud 是在所有三个主要的公共云平台(Google Cloud、AWS 和 Azure)上提供的一种完全托管式云服务(DBaaS)。Redis 将为您托管一个专用的环境,其中包含必要的资源,您可以在其中创建具有私有和公共端点的数据库供您的应用程序使用。