[转帖].NET的集群Redis实现版本: Garnet – 一种开源、下一代、更快的缓存存储,用于加速应用程序和服务

https://zhuanlan.zhihu.com/p/687828165

 

先来一个隐喻,让大家好理解。

你就想象成一个集群版的Redis,不过是.NET写的且开源。
任何一个redis client都可以连接他。

先来一段启动代码:

NuGet

在  上查找版本。The NuGet 包含 Garnet 作为库,供您在应用程序中自托管。这可以基于我们的 GarnetServer 此处提供应用程序代码。 最小示例如下所示:

using Garnet;

try
{
    using var server = new GarnetServer(args);
    server.Start();
    Thread.Sleep(Timeout.Infinite);
}
catch (Exception ex)
{
    Console.WriteLine($"Unable to initialize server due to exception: {ex.Message}");
}

docker

我们在 GitHub 上提供了非常基本的 Dockerfile,因此您可以自己托管它们。我们将不胜感激 以帮助使我们的 Docker 支持更加全面。官方 Docker 版本是我们未来的关注对象。

正文:

代码仓库:microsoft/garnet:Garnet 是 Microsoft Research 提供的远程缓存存储,可提供强大的性能(吞吐量和延迟)、可伸缩性、存储、恢复、群集分片、密钥迁移和复制功能。Garnet 可以与现有的 Redis 客户端配合使用。 (github.com)

 

Garnet 是 Microsoft Research 推出的一款新的远程缓存存储,它提供了几个独特的优势:

  • Garnet 采用流行的 RESP 有线协议作为起点,这使得可以从 当今的大多数编程语言,例如 C# 中的 StackExchange.Redis
  • 与同类开源缓存存储相比,Garnet 通过许多客户端连接和小批量提供更好的吞吐量和可扩展性,从而节省了大型应用程序和服务的成本。
  • Garnet 使用启用了加速 TCP 的商用云 (Azure) VM 展示了极低的客户端延迟(在第 99.9 个百分位处通常小于 300 微秒),这对实际场景至关重要。
  • Garnet 基于最新的 .NET 技术,具有跨平台、可扩展和现代的特点。它被设计为易于开发和发展,而不会牺牲性能 常见情况。我们利用 .NET 丰富的库生态系统来扩大 API 的广度,并提供优化机会。由于我们对 .NET 的谨慎使用,Garnet 实现了 在 Linux 和 Windows 上都具有最先进的性能。

此存储库包含用于构建和运行 Garnet 的代码。有关更多信息和文档,请查看我们的网站 .

功能摘要

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

Garnet 使用快速且可插拔的网络层,支持未来的扩展,例如利用内核旁路堆栈。它支持安全传输层安全性 (TLS) 通信,使用 强大的 .NET SslStream 库,以及基本的访问控制。石榴石的储存层称为沙弗莱石,是 从我们之前的开源项目 FASTER 分叉而来,包括强大的数据库功能,如线程可扩展性、分层存储支持 (内存、SSD 和云存储)、快速无阻塞检查点、恢复、用于持久性的操作日志记录、多密钥事务支持以及更好的内存管理和重用。 最后,Garnet 支持集群操作模式,支持分片、复制和动态密钥迁移。

 

性能预览

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

设计亮点

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

 

 

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

Garnet 的存储设计由两个沙弗莱石键值存储组成,它们的命运由统一的操作日志绑定。第一个存储区称为“主存储区”,针对原始字符串操作进行了优化,并仔细管理内存,以 避免垃圾回收。第二个(可选)“对象存储”针对复杂对象和自定义数据类型进行了优化,包括常用类型,如 Sorted Set、Set、Hash、List 和 Geo。 对象存储中的数据类型 利用 .NET 库生态系统实现其当前实现。它们存储在内存的堆中(这使得更新非常有效),并以序列化形式存储在磁盘上。未来,我们计划使用 统一索引和日志,便于维护。

Garnet 设计的一个显着特点是其窄腰沙弗莱石存储 API,用于在顶部实现大、丰富且可扩展的 RESP API 表面。此 API 由 read、upsert、delete 和 atomic 组成 读-修改-写操作,通过异步回调实现,Garnet 在每次操作期间的不同点插入逻辑。我们的存储 API 模型允许我们完全分离 Garnet 的解析和查询 处理存储详细信息(如并发、存储分层和检查点)的问题。Garnet 使用两阶段锁定进行多密钥交易。

集群模式

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

 

以下文章来自ms research Introducing Garnet – an open-source, next-generation, faster cache-store for accelerating applications and services - Microsoft Research

隆重推出 Garnet – 一种开源、下一代、更快的缓存存储,用于加速应用程序和服务
已发表 2024 年 3 月 18 日
作者: Badrish Chandramouli , 合伙人研究经理
分享此页

 

 

近十年来,Microsoft的研究人员一直在努力解决对数据存储机制日益增长的需求,以支持交互式Web应用程序和服务的快速发展。我们名为Garnet的新缓存存储系统与传统缓存存储相比具有多项优势,已部署在Microsoft的多个用例中,例如Windows和Web体验平台,Azure Resource Manager和Azure Resource Graph中的用例,现在可以在以下位置作为开源下载https://github.com/microsoft/garnet(在新选项卡中打开).在开源 Garnet 中,我们希望使开发人员社区能够从其性能提升和功能中受益,在我们的工作基础上再接再厉,并通过添加新的 API 调用和功能来扩展 Garnet 生态系统。我们也希望开源能够鼓励后续的学术研究,并在这个重要的研究领域开辟未来的合作机会。
缓存存储问题
云计算和边缘计算的发展带来了越来越多的应用程序和服务,这些应用程序和服务需要以比以往更高的效率、更低的延迟和更低的成本访问、更新和转换数据。这些应用程序和服务通常需要在存储交互方面投入大量运营支出,使其成为当今最昂贵和最具挑战性的平台领域之一。缓存存储软件层部署为单独可扩展的远程进程,可以降低这些成本并提高应用程序性能。这推动了缓存存储行业的发展,包括许多开源系统,如 Redis、Memcached、KeyDB 和 Dragonfly。
与支持简单获取/设置接口的传统远程缓存存储不同,现代缓存提供了丰富的 API 和功能集。它们支持原始字符串、分析数据结构(如 Hyperloglog)和复杂数据类型(如排序集和哈希)。它们允许用户检查点和恢复缓存、创建数据分片、维护复制副本,并支持事务和自定义扩展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章