Garnet

Garnet 是微软研究院开发的一种新型远程缓存存储,它提供了几个独特的优势:

  • Garnet 采用了流行的 RESP 协议作为起点,这使得 Garnet 能够从大多数编程语言中可用的未修改的 Redis 客户端使用,例如 C# 中的 StackExchange.Redis
  • Garnet 在许多客户端连接和小批量操作方面提供了更好的吞吐量和可扩展性,相对于可比的开源缓存存储,为大型应用程序和服务节省了成本。
  • Garnet 展示了极低的客户端延迟(通常在 99.9% 百分位时小于 300 微秒),使用启用了加速网络的商用云(Azure)虚拟机,这对现实世界场景至关重要。
  • 基于最新的 .NET 技术,Garnet 是跨平台的、可扩展的,并且是现代的。它被设计为易于开发和演变,同时不牺牲常见情况下的性能。我们利用了 .NET 丰富的库生态系统来扩展 API,同时为优化提供了开放的机会。由于我们对 .NET 的谨慎使用,Garnet 在 Linux 和 Windows 上都实现了最先进的性能。

这个仓库包含了构建和运行 Garnet 的代码。更多信息和文档,请访问我们的网站 https://microsoft.github.io/garnet

功能摘要

Garnet 实现了广泛的 API,包括原始字符串(例如,获取、设置和键过期)、分析(例如,HyperLogLog 和 Bitmap)和对象(例如,排序集和列表)操作。它可以通过客户端 RESP 事务和我们自己的服务器端存储过程(C#)处理多键事务,并允许用户在原始字符串和新对象类型上定义自定义操作,所有这些都在 C# 的便利和安全性中,降低了开发自定义扩展的门槛。

Garnet 使用快速且可插拔的网络层,支持未来的扩展,例如利用绕过内核的栈。它支持使用 .NET 的强大 SslStream 库进行安全传输层安全(TLS)通信,以及基本的访问控制。Garnet 的存储层,称为 Tsavorite,是从我们之前的开源项目 FASTER 分叉出来的,并包括强大的数据库特性,如线程可扩展性、分层存储支持(内存、SSD 和云存储)、快速非阻塞检查点、恢复、操作日志以确保持久性、多键事务支持以及更好的内存管理和重用。最后,Garnet 支持集群模式操作,支持分片、复制和动态键迁移。

简介 - 图1

性能预览

我们在 网站 上展示了一些关键结果,将 Garnet 与领先的开源缓存存储进行比较。

设计亮点

Garnet 的设计重新思考了整个缓存存储栈——从接收网络包,到解析和处理数据库操作,到执行存储交互。我们建立在多年的 先前研究 之上。下面是 Garnet 的整体架构。

简介 - 图2

Garnet 的网络层继承了我们之前对 ShadowFax 研究的共享内存设计。TLS 处理和存储交互在 IO 完成线程上执行,避免了常见情况下的线程切换开销。这种方法允许 CPU 缓存一致性将数据带到网络,而不是传统的基于洗牌的设计,后者需要在服务器上移动数据。

Garnet 的存储设计由两个 Tsavorite 键值存储组成,它们的命运由一个统一的操作日志绑定。第一个存储,称为“主存储”,针对原始字符串操作进行了优化,并仔细管理内存以避免垃圾收集。第二个是可选的“对象存储”,针对复杂对象和自定义数据类型进行了优化,包括流行的类型,如排序集、集合、哈希、列表和地理。对象存储中的数据类型利用 .NET 库生态系统进行当前实现。它们存储在内存的堆上(这使得更新非常高效),并以序列化形式存储在磁盘上。未来,我们计划研究使用统一索引和日志以简化维护。

Garnet 设计的一个显著特点是其狭窄的 Tsavorite 存储 API,它用于在顶部实现大型、丰富和可扩展的 RESP API 表面。这个 API 包括读取、插入、删除和原子读取-修改-写入操作,实现了异步回调,以便 Garnet 在每个操作的各个点插入逻辑。我们的存储 API 模型允许我们清晰地分离 Garnet 的解析和查询处理问题,以及存储细节,如并发性、存储分层和检查点。Garnet 使用两阶段锁定进行多键事务。

集群模式

除了单节点执行,Garnet 支持集群模式,允许用户创建和管理分片和复制部署。Garnet 还支持一种高效且动态的键迁移方案来重新平衡分片。用户可以使用标准 Redis 集群命令来创建和管理 Garnet 集群,节点执行 gossip 以共享和演变集群状态。集群仍在进行中。

下一步

请访问我们的 文档 站点,或直接跳转到 入门发布 部分。

许可证

本项目根据 MIT License 获得许可,请参阅 LICENSE 文件。

隐私

隐私信息可以在 https://privacy.microsoft.com/en-us/ 找到。

贡献

本项目欢迎贡献和建议。大多数贡献需要您同意一个贡献者许可协议(CLA),声明您有权并且实际上确实授予我们使用您的贡献的权利。有关详细信息,请访问 https://cla.opensource.microsoft.com。

当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA 并适当地装饰 PR(例如,状态检查,评论)。只需按照机器人提供的说明操作。您只需要在我们的所有使用我们 CLA 的仓库中这样做一次。

本项目已采用 Microsoft 开源行为准则。有关更多信息,请参见 行为准则常见问题解答 或联系 opencode@microsoft.com 以获取任何额外的问题或评论。

商标

本项目可能包含项目、产品或服务的商标或徽标。授权使用微软商标或徽标须遵守并遵循 Microsoft 商标和品牌指南。在修改版本的本项目中使用微软商标或徽标不得引起混淆或暗示微软赞助。任何第三方商标或徽标的使用须遵守那些第三方的政策。

Redis 是 Redis Ltd 的注册商标。其中任何权利都保留给 Redis Ltd。微软的使用仅为参考目的,并不表明 Redis 与微软之间有任何赞助、认可或关联。