注意:此博客文章已于 2024 年 11 月 5 日编辑,以反映 Redis 产品的最新变化。
如果您的业务正在使用 GemFire 等内存数据网格系统,那么很可能早该升级到 Redis 等更先进的技术了。以下是我们认为的原因。
内存数据网格 (IMDG) 是一种分布式计算技术,它将大量数据存储和管理在互连计算机的主内存中。IMDG 在 2000 年代中期流行起来,曾是高性能、低延迟数据访问的首选解决方案。然而,随着技术格局的发展,IMDG 的普及率有所下降,被云原生、微服务和无服务器数据架构的成熟所掩盖。在这个转型时代,人们的关注点已转向更具适应性和成本效益的替代方案,其中 Redis 已成为高性能、低延迟数据访问方面最受欢迎且经过验证的选择。
Redis 作为 IMDG 的强大替代品脱颖而出,这得益于其简单性、多功能性和无与伦比的性能。Redis 固有的灵活性有助于集成到云原生和微服务环境等架构中。通过从 IMDG 迁移到 Redis,您不仅是在适应,更是在确保未来实时数据战略的敏捷、高效和成本效益。
一旦您选择 Redis 作为 IMDG 的替代品,您需要考虑如何进行过渡。在本文的其余部分,我们将探讨从 GemFire 这一流行的 IMDG 迁移到 Redis 的基本要素,通过帮助您了解术语差异和迁移的最佳实践。这将有助于您避免常见问题,并实现平稳有效的过渡。
迁移与 GemFire 交互的复杂系统可能令人望而生畏。我们的专业知识和专用工具可帮助高效有效地促进这些迁移。
考虑这样一种场景:您可能有多个服务写入 GemFire,还有数十个其他服务从这些相同的 GemFire 实例读取数据。在这些情况下,我们建议使用持续复制流程,以实时将数据从 GemFire 迁移到 Redis。一旦建立了此复制流程,您就可以随着时间的推移,逐个将工作负载迁移到 Redis。您可以考虑蓝绿部署,以便在上线前确认行为正确。
Redis Connect 是我们构建的数据复制和变更数据捕获 (CDC) 框架,旨在简化这些迁移。通过 Redis Connect,您可以运行一次性迁移和持续复制。这确保了您的 Redis 数据库始终反映 GemFire 部署的最新写入。
从更技术的层面来看,Redis Connect 运行在两个或更多的 JVM 上(根据需要部署在您选择的操作系统和基础设施上,以满足您的吞吐量和高可用性要求)。这些 JVM 将所有写入从 GemFire 复制到 Redis。Redis Connect 还包括用于监控和警报此实时数据流的工具,因此您可以观察您的迁移过程。Redis Connect 内置的高可用性也意味着您可以安全地长时间运行此迁移过程,以便您的应用程序从 GemFire 完全迁移。
如果您想深入了解详情,可以查看我们的 Redis Connect GemFire 示例的配置,或查看我们之前的可按需回放的网络研讨会,其中提供了简单的场景供参考。
几家大型金融机构的 Redis 客户选择使用 Redis Connect 从 GemFire 迁移到 Redis。在所有案例中,他们选择 Redis 是因为其性能、易用性和优化的总拥有成本。
例如,一家领先的美国银行,在升级期间一直应对 GemFire 复杂的运营和频繁的中断,通过迁移到 Redis 实现了基础设施现代化。此举简化了管理,减少了对专业知识的需求,并最大限度地降低了运营风险。这项迁移几乎立即获得了正向的投资回报,许可和基础设施成本降低了大约 33%。然而,这并非全部。由于消除了停机时间并降低了监管机构罚款的风险而带来的间接节省使投资回报率更高。最后,该银行确保了未来将本地工作负载顺利迁移到 Azure Cache for Redis Enterprise 的过程。
在另一个案例中,一家知名的资产管理公司面临可扩展性问题、稳定性担忧以及不断上升的 GemFire 成本,选择了 Redis。这一战略性地转向了跨生产和开发环境的自助式共享缓存解决方案,从而实现了更简化、更高效的架构。它在所有前端缓存应用程序中替换了 GemFire,且应用程序代码更改极少,从而显著降低了总拥有成本。此外,此次迁移是其数据管理实践迈向现代化和效率的战略步骤,因为它着眼于未来的云迁移。
当您考虑从 GemFire 迁移到 Redis 时,有几个关键因素需要考虑。在考虑离线或在线实时切换时,您也应该了解其优缺点。
您需要做的第一个决定是如何部署 Redis。正如您可能知道的,Redis 提供开源软件和商业版本,即 Redis Software 和 Redis Cloud。从 GemFire 迁移到 Redis Community Edition 更为复杂,部分原因在于配置和维护开源 Redis 集群所需的专业知识,包括管理和保护开源 Redis 部署带来的挑战。
Redis Software 基于 Redis Community Edition 构建,但提供了改进的架构、更好的安全和管理能力以及更丰富的开发者功能集,包括内置的核心查询、索引、向量搜索等功能。我们的商业 Redis 产品还在实时迁移等复杂数据操作期间提供更高的操作可靠性。方便的是,Redis Software 可部署在本地、云自管理部署,也可作为完全托管的云优先数据库即服务,即 Redis Cloud。
Redis 是主要云服务提供商(包括 Amazon Web Services、Microsoft Azure 和 Google Cloud Platform)事实上的键/值存储。这些主要云提供商都提供由 Redis 提供支持的 Redis Cloud 或 Azure Cache for Redis Enterprise 服务,并提供有经济处罚作支撑的服务级别协议。
随着技术的变革,语言也会随之改变。术语和概念的差异可能令人望而生畏,既有的专业知识起初似乎难以重建。为了促进 GemFire 实践者在开始迁移到 Redis 时的过渡,让我们探讨 GemFire 的一些概念如何映射到 Redis。
我们将涵盖两个维度
运行时 | GemFire 主要用 Java 编写,需要 JVM。这带来了长时间的调优周期以及由于垃圾回收导致的难以预测的副作用,尽管现代 JVM 已有所改进。 每个 JVM 还会消耗大量并行核心来处理内存管理和低 GC 暂停,这意味着分配给应用程序的核心更少。 连接到 GemFire 的客户端应用程序中的任何更改都需要进一步的调优周期。 |
Redis 主要用 C 编写,与 GemFire 不同,Redis 分片进程不需要部署 JVM 的额外复杂性。 这使得扩展更容易,并提供确定性的纵向和横向扩展设计。 | |
集群拓扑、发现和仲裁 | 使用 GemFire,您需要在额外的 JVM 上设置“定位器”(Locator) 节点,以构建独立于客户端节点和数据节点的仲裁系统。 需要处理多种节点和进程类型。 |
使用 Redis,通过使用对称的无共享架构将集群控制平面与数据平面分离——所有节点都相同——这也更适合容器和基于云的部署。 仲裁、成员资格以及客户端的数据库端点寻址均由集群管理。 | |
持久性 | GemFire 具有一些持久性能力,按 Region 配置。 |
Redis 提供用于备份和恢复的紧凑快照 (RDB),以及数据库级别的可配置只追加文件 (AOF) 磁盘格式。AOF 格式可配置为每秒 fsync,也可配置为每次写入 fsync,从而提供了对如何根据每个数据库和用例设计具有持久性的系统的控制。 | |
容量规划 | GemFire 的容量规划通常需要富有创造性的魔法,包括 JVM、GC 的余量、应用的余量、元数据和序列化的余量、索引等。除了 CPU 容量规划和垃圾回收余量外,每次部署都是特定的,由于复杂性和稳定周期,导致成本上升。 |
Redis 基于分片模型构建,每个分片一个核心,以提高速度并降低延迟,并且一个分片处理高达 25GB 和/或 25K ops/s,以获得最佳系统稳定性。这简化了纵向和横向扩展模型,因为您可以在每个节点打包多个分片,以优化多核硬件或虚拟机。 更高级的设置,例如在 SSD 上使用 Redis 自动分层 (Auto Tiering),可以调整模型以降低 TCO。自管理和云部署选项采用相同的容量规划模型。 对于某些工作负载,一个 Redis 分片可以处理高达 1M ops/s。我们提供用于基准测试的工具,以帮助调整集群。 | |
多租户和容量调整 | GemFire 允许单个成员托管多个 Region,但它们仅是逻辑隔离的。 |
Redis Software 和 Redis Cloud 是多租户的,具有身份验证、基于角色的访问控制 (RBAC) 和每个数据库的 TLS 双向身份验证,从而实现了更高的数据库和分片密度。这使得小型 Redis 缓存和大型持久化 Redis 数据库可以部署和运行在共享基础设施和控制平面上,降低了基础设施和运营成本,同时遵循“每个服务一个数据库”的设计原则。 | |
自动分层 (Auto Tiering) | GemFire 具有可选的堆外配置,可将部分数据存储在 RAM 中,但位于分配给 JVM 的内存之外。由于运行时不可预测的 JVM 垃圾回收过程,这使得调优和可观察性更加复杂。这并未降低大型工作负载的系统 TCO。 GemFire 还提供“溢出到磁盘”功能,但不附带对此类配置的磁盘和延迟影响的任何假设。 |
Redis 具有原生自动分层 (auto tiering) 和可配置的 RAM:SSD 比例(也称为 Flash),可在并非所有数据都必须驻留在 DRAM 中时提高 TCO。我们已使用 SSD / NVMe 进行基准测试以提高性能,这在 Redis Cloud 中普遍可用,这些是最高性能的 AWS i4i SSD 实例。自动分层架构也专为高并发设计,并将键、索引和最常使用的值保留在 RAM 中以获得最佳性能。 | |
主-主地理复制 (Active-active geo-replication) | GemFire 通过 WAN 网关架构(需要额外的节点)支持地理集群复制。系统以基本的“最后写入获胜”策略运行,并提供 API 来实现您自己的冲突解决。 |
Redis Software 和 Redis Cloud 具有主-主集群复制机制,可在跨数据中心和/或可用区的单向、双向以及两个以上集群之间工作。主-主复制在自管理、云和基于 Kubernetes 的部署中均可用。 此外,主-主架构使用无冲突复制数据类型 (CRDT),因此您无需实现自己的冲突解决逻辑。 | |
用于操作的应用程序编程接口和命令行接口 | GemFire 提供名为“gfsh”的 CLI 工具来帮助进行脚本编写,以及一些基于 REST 端点的 API,但缺乏适当的生态系统集成,无法用于操作、缓存即服务或集群即服务。 |
Redis 提供用于集群和数据库控制的 CLI 和 REST API,自管理和云端均可。我们还提供与 Terraform、Ansible 和 Pulumi 等基础设施即代码平台的集成。 | |
用于操作的用户界面 | GemFire 提供以读取为主的 Web UI(“Pulse”)以及统计信息、指标收集以及用于即时故障排除的可视化工具(“Visual Statistic Display”)。它还提供 Prometheus 端点。 |
Redis Software 和 Redis Cloud 提供 Web UI,提供管理员级别的多种操作来指定更改,使 UI 与 API 可执行的操作相匹配(例如,创建数据库、调整大小等)。它还包含内置工具,可生成包含指标和集群状态的转储,在与 Redis 支持部门交互时简化了根源分析时间。 还提供包含数百个指标的 Prometheus 端点,以及内置 Grafana 仪表板供参考,此外还集成了 Dynatrace、DataDog 等 APM 工具。 | |
基于 Kubernetes 的部署 | GemFire 和 Redis 都提供原生的 Kubernetes operator 和 Custom Resource Definitions (CRD),用于在 K8s 上部署。 Redis 还将开源 Kubernetes 和 SUSE Rancher 列为支持的平台,除了 OpenShift、Tanzu 以及云托管 K8s 服务 AKS、EKS 和 GKE 外。 |
具备完全托管部署的云服务 | Redis 在 Azure、AWS 和 Google Cloud 上提供托管的云优先部署。该服务提供固定服务 (Redis Essentials) 或灵活的企业级云部署 (Redis Pro),包括专用集群、私有高速网络连接、与云市场的集成计费以及在您选择的云区域按需配置。Redis Cloud 提供企业支持和 SLA,并包括自动分层和主-主能力。 |
GemFire 提供成熟、低延迟的内存数据网格。GemFire 具有成熟的管理工具,通过适当规划可处理高可扩展性。GemFire 非常适合本地和 VMware Tanzu 环境。
Redis 提供成熟、低延迟的内存数据平台,具有强大易于扩展的管理和开发工具。公司持续投入以最有效的方式简化 Redis 的部署和管理。除了适用于任何 Kubernetes 或本地环境外,Redis 还在 AWS、Microsoft Azure 和 Google Cloud 上提供托管服务。
从 GemFire 迁移到 Redis 提供了您的应用程序所需的低延迟和高吞吐量性能,同时也为未来提供了更灵活高效的技术。
客户端应用程序 | GemFire 支持的语言和库范围狭窄,并且使用涉及来回序列化的不透明协议,增加了低效的 CPU 和内存消耗。 |
Redis 提供广泛的客户端生态系统,并支持主要的客户端库。 | |
Java、C++、.Net、带 JSON 的 Node.js | 使用 GemFire,数据建模主要围绕“对象”。仅记录了 Java、C++、.NET 和 Node.js。 |
使用 Redis,数据建模包括“对象”(称为哈希),还提供高级数据结构,例如“有序集合”和原生 JSON。 支持多种其他语言,例如 Java、C++、.Net 和 Node.js,以及 Python、PHP 和 Go。 | |
Spring Boot | 使用 GemFire, 存在一些针对 Apache Geode 的特定包装器。 |
使用 Redis,Jedis 和 Lettuce 响应式库均可与 Spring Boot 集成。 | |
Spring Data | 使用 GemFire, Spring Data 和 Spring Data Repository 均可用。 |
使用 Redis, Spring Data 和 Spring Data Repository 均可用。 此外,Redis OM for Spring 为哈希、JSON 和全文搜索提供基于注解的配置。 | |
键/值数据存储位置 | GemFire 使用“Region”的概念,包括分区、分布式和/或复制的 Region 以及 WAN 复制 Region。 |
Redis 使用“database”的概念,它可以是持久的、高可用的 (HA) 或多站点主-主的。这提供了更简单的范例来独立扩展数据库,同时使用 Redis 的多租户架构实现更高的效率。 Redis 中的带有副本和集群架构的主分片等同于 GemFire 中的“分布式和复制”。 | |
键格式和键空间 | 使用 GemFire, “Region”的概念强制使用包含序列化和低级 API 以及键同址配置的键格式,使得整个系统配置复杂、演进脆弱、对开发者来说僵化。 |
Redis 提供键空间 (keyspace) 用于数据结构分段,使用标准化的语法前缀,例如:“user:123” 和 “transaction:abc”。 它提供简单的同址和可配置的哈希策略,例如“user:{123}”和“transaction:{123}:abc”,保证同址位于同一分片。 这确保为开发者提供适当的无模式体验,同时仍提供正确的治理,例如在所有“user:*”上构建索引时。 | |
索引、查询和搜索 | GemFire 具有“对象查询语言”和索引,并添加定制和修改的 Lucene 用于全文(继承额外复杂性)以提供搜索功能。Lucene 并不以快速或高性能著称。最初,该解决方案是作为插件而非原生功能开发的。 |
Redis 提供原生的分布式索引和查询,包括聚合。索引包括数值、标签、文本和全文搜索,使用 Redis Query Engine 和 JSON。 此功能原生叠加在同一进程(Redis 分片)上,具有先进的内部优化,支持多个标签(例如 ticker:@{appl|tsla})、范围(例如 price:[180, 200])等。 此外,索引实时维护,以获得更准确的查询结果。 | |
用于 AI 应用的向量 | GemFire 可能依赖 Lucene 进行向量和搜索,但在我们撰写此博客文章时,在 Apache Geode 或 GemFire 文档中找不到任何关于向量、向量索引和向量搜索的详细信息或代码示例。您现有的 GemFire 实现很可能没有使用 GemFire 处理向量。 |
Redis 原生支持存储向量并使用向量索引搜索向量相似性。它还与 LangChain 等流行的 AI 和 LLM 框架集成。使用 Redis 处理向量并将其用作向量数据库,使 AI 和 ML 应用更易于编写和操作,无论是特征存储、MLops 堆栈的一部分在线特征服务,还是为类似 ChatGPT 的基于 LLM 的应用提供动力。这为基于 AI 的聊天机器人、推荐引擎和欺诈检测引擎提供实时性、可扩展性和简单性。 | |
事件流和服务器端数据处理 | GemFire 具有事件、持续查询和函数执行功能,这需要编码并在服务器上部署 Java。 |
Redis 核心原生支持通知、发布/订阅 (pub/sub) 和流 (streams),可将 Redis 用作消息事件驱动平台。Redis 还提供 Triggers 和 Functions 用于服务器端处理,用户定义函数根据需要、流中的消息、数据更改或时间执行。 代码是 JavaScript,存储并在服务器上执行以加快执行速度,提高了灵活性,可将数据处理添加到您的 Redis 分布式数据和横向扩展部署中。基于微服务的架构也可以向 Redis Streams 写入数据和从中消费数据。阅读更多关于 Redis Streams 的内容。 | |
事务 | 注意:GemFire 和 Redis 都不是设计用来充当单服务器事务性 ACID 数据库的,因为作为分布式系统,CAP 定理适用。 |
GemFire 支持事务,可配置 ACID 和两阶段提交 (XA transactions),但需要事先设计,以避免分布式系统固有的边界情况,例如冲突写入、分布式锁或故障条件。由于这些复杂性,此配置很少使用或仅用于工作负载的特定子集,而 GemFire 通常不是自然的匹配。 | |
Redis 提供清晰的事务、持久性和分布式通信语义:例如,MULTI 启用了一个管道,将命令分组为一次到服务器的往返。WATCH 命令确保乐观锁和脏写,尤其与管道结合使用时。WAIT、WAITAOF 以及配置为每次写入的 AOF (fsync) 可以确保磁盘上的完全持久性以及强一致性,可将 AOF 配置在主分片或副本分片上。应用程序控制错误和重试,并将这些特定调用限制在需要此类一致性的代码路径上。这鼓励在应用程序级别思考事务,服务器提供语义但由应用程序逻辑强制执行。 |
GemFire 专为本地、Java 和 VMware Tanzu 环境设计。它具有多样化且强大的功能集和工具来支持该功能。
Redis 用于各种各样的环境,解决各种各样的方案。Redis 具有强大的管理和开发工具,以及广泛多样的实践者和贡献者社区。Redis 还以其简单性(符合 Redis 开源宣言)与实时数据平台的全面功能相结合而闻名。
从 GemFire 迁移到 Redis,您可以使用您熟悉的许多相同技能和工具,同时获得更简单的架构、增强的灵活性和更多样的生态系统。
从 GemFire 迁移到 Redis 可以现代化您的基础设施,将您的组织从遗留约束中解放出来,并释放实时数据处理和管理的潜力。在我们的工具和专业知识的支持下,客户已将复杂工作流迁移到 Redis,带来以下好处:
这些因素共同将 Redis 定位为不仅仅是一次技术升级,而是一次战略增强,从而带来运营简单性和成本节省。