Garnet发布 Redis不再是唯一选择
Garnet 是 Microsoft Research 的远程缓存存储,提供强大的性能(吞吐量和延迟)、可扩展性、存储、恢复、集群分片、密钥迁移和复制功能。
Garnet 可以与现有的 Redis 客户端配合使用。
Garnet 是 Microsoft Research 推出的一种新型远程缓存存储,具有多种独特优势:
- Garnet 采用流行的 RESP 线路协议作为起点,这使得可以从当今大多数编程语言(例如 C# 中的 StackExchange.Redis)中可用的未经修改的 Redis 客户端使用 Garnet。
- 相对于同类开源缓存存储,Garnet 通过许多客户端连接和小批量提供更好的吞吐量和可扩展性,从而节省大型应用程序和服务的成本。
- Garnet 使用启用了加速 TCP 的商品云 (Azure) VM 展示了极低的客户端延迟(在 99.9% 时通常低于 300 微秒),这对于现实场景至关重要。
- Garnet 基于最新的 .NET 技术,具有跨平台、可扩展和现代化的特点。它被设计为易于开发和发展,而不会牺牲常见情况下的性能。我们利用 .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 支持集群操作模式,支持分片、复制和动态密钥迁移。
我们在网站上展示了一些关键结果,将 Garnet 与领先的开源缓存存储进行比较。
Garnet 的设计重新思考了整个缓存存储堆栈——从网络上接收数据包,到解析和处理数据库操作,再到执行存储交互。我们建立在我们之前多年研究的基础上。下面是Garnet的整体架构。
Garnet 的网络层继承了受我们之前对 ShadowFax 研究启发的共享内存设计。 TLS 处理和存储交互在 IO 完成线程上执行,避免了常见情况下的线程切换开销。这种方法允许 CPU 缓存一致性将数据传输到网络,而不是传统的基于随机播放的设计,后者需要在服务器上移动数据。
Garnet的存储设计由两个Tsavorite键值存储组成,它们的命运由统一的操作日志绑定。第一个存储称为“主存储”,针对原始字符串操作进行了优化,并仔细管理内存以避免垃圾收集。第二个也是可选的“对象存储”针对复杂对象和自定义数据类型进行了优化,包括排序集、集合、哈希、列表和地理等流行类型。对象存储中的数据类型利用 .NET 库生态系统来实现其当前的实现。它们存储在内存中的堆上(这使得更新非常高效)并以序列化形式存储在磁盘上。未来,我们计划研究使用统一的索引和日志来简化维护。
Garnet 设计的一个显着特点是其窄腰 Tsavorite 存储 API,用于在顶部实现大型、丰富且可扩展的 RESP API 表面。该 API 包含读取、更新插入、删除和原子读取-修改-写入操作,通过 Garnet 的异步回调实现,以便在每个操作期间的各个点插入逻辑。存储 API 模型使我们能够将 Garnet 的解析和查询处理问题与并发、存储分层和检查点等存储细节完全分开。 Garnet 对多密钥交易使用两阶段锁定。
除了单节点执行之外,Garnet还支持集群模式,允许用户创建和管理分片和复制部署。 Garnet 还支持高效、动态的密钥迁移方案来重新平衡分片。用户可以使用标准的Redis集群命令来创建和管理Garnet集群,节点执行gossip来共享和演化集群状态。集群工作仍在进行中。
该项目已获得 MIT 许可证的许可,请参阅许可证文件。
隐私信息可在 https://privacy.microsoft.com/en-us/ 找到。
该项目欢迎贡献和建议。大多数贡献都要求您同意贡献者许可协议 (CLA),声明您有权并且实际上授予我们使用您的贡献的权利。有关详细信息,请访问 https://cla.opensource.microsoft.com。
当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA 并适当地修饰 PR(例如状态检查、评论)。只需按照机器人提供的说明进行操作即可。您只需使用我们的 CLA 在所有存储库中执行一次此操作。
该项目采用了微软开源行为准则。有关详细信息,请参阅行为准则常见问题解答或联系 opencode@microsoft.com 提出任何其他问题或意见。
该项目可能包含项目、产品或服务的商标或徽标。 Microsoft 商标或徽标的授权使用须遵守且必须遵循 Microsoft 的商标和品牌指南。在此项目的修改版本中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 赞助。对第三方商标或徽标的任何使用均须遵守这些第三方的政策。
Redis 是 Redis Ltd 的注册商标。其中的任何权利均归 Redis Ltd 保留。Microsoft 的任何使用仅供参考,并不表明 Redis 与 Microsoft 之间有任何赞助、认可或从属关系。
github地址: https://github.com/microsoft/garnet