头图

Garnet:微软开源的高性能替代方案,秉承兼容 RESP 协议的同时,以卓越性能和无缝迁移能力重新定义分布式缓存存储! - 精选真开源,释放新价值。

image

概览

最近,Redis修改了开源协议,从BSD变成了 SSPLv1和 RSALv2 的双重许可,而RSALv2 和 SSPLv1,都并未被 OSI 正式认可。OSI 认为,这两种协议包含了一些限制性条款,这些条款与开源定义(OSD)不完全兼容。因此可以认为 Redis 在修改许可证后,已经不再是开源软件(OSS)。Redis 的官网已经修改为“Redis is source-available software”。现在,云服务商已经不能再免费使用redis的源代码了,这可能会影响到云redis的定价,当前阿里云和腾讯云都是有云redis服务的。

微软研究院近期宣布推出一款名为Garnet的创新开源分布式缓存存储系统,致力于解决现代应用程序在处理大规模数据时对于高吞吐量、低延迟及卓越可扩展性的严苛要求。它是一个远程缓存存储,提供了一系列独特的优势。这款基于C# .NET 8.0构建的新型系统,充分利用了现代硬件能力,为应用程序开发人员提供了加速数据访问与处理的强大工具。

Garnet采用了Redis的RESP协议作为起点,这使得开发者可以使用大多数编程语言中现成的Redis客户端,例如 .NET 中的StackExchange.Redis,来使用Garnet。

相比于其他开源缓存存储,Garnet在性能、延迟、可扩展性和持久性方面有显著的提升。Garnet 通过许多客户端连接和小批量提供更好的吞吐量和可扩展性,从而节省大型应用程序和服务的成本。

Garnet 使用启用了加速 TCP 的商品云 (Azure) VM 展示了极低的客户端延迟(在 99.9% 时通常低于 300 微秒),这对于现实场景至关重要。

截至发稿概况如下:

语言占比
C#97.9%
C++1.5%
PowerShell0.5%
JavaScript0.1%
  • 收藏数量:7.3K

特性

Garnet的核心设计理念在于实现极致性能和弹性扩展。以下是Garnet系统的主要技术特性:

高性能与低延迟

Garnet通过高度优化的内存管理机制和高效的并发处理架构,在单个节点内部署多线程处理,显著提升了数据的读写速度。支持在主内存中进行高速缓存,确保了极低的访问延迟,尤其适用于需要快速响应的应用场景。

分布式与可扩展性

Garnet采用了分片集群架构,使得系统能够轻松横向扩展,每个节点都能独立处理一部分数据,从而支持海量数据的存储和检索。内置的自动分片与负载均衡机制,让系统可以根据业务需求动态调整资源分配,确保整体性能保持稳定。

容错与持久化

提供了数据复制功能,以保证在单点故障发生时,数据能够迅速切换至备份节点,确保服务连续性。集成了检查点机制和故障转移功能,允许系统定期保存关键状态并在必要时恢复服务。支持将数据持久化存储在诸如SSD或Azure等分层存储介质上,既保证了数据的安全性又维持了较高的I/O效率。

事务支持与API丰富

Garnet实现了事务处理能力,保证了在分布式环境下的数据一致性,这对于涉及多个操作的复杂业务逻辑至关重要。提供了丰富的API接口,使开发者可以便捷地集成Garnet到现有应用和服务中,同时也便于定制高级功能和扩展系统。

性能

吞吐量 GET

在图1所示的实验中,工程人员使用了大批量的GET操作(每批4096个请求)和小负载(8字节的键和值)来最小化网络开销。随着客户端会话数的增加,工程人员观察到Garnet的可扩展性比Redis或KeyDB更好。Dragonfly展示了类似的扩展性,尽管只能达到16个线程。还要注意,DragonFly是一个纯内存系统。总的来说,即使数据库大小(即预加载的不同键的数量)更大(达到2.56亿个键)超过了处理器缓存的大小,Garnet的吞吐量相对于其他系统始终更高。

 title= 1024个键,和(b) 2.56亿个键的情况下,随着客户端会话数的变化,吞吐量(对数尺度)。")

图1:在数据库大小为(a) 1024个键,和(b) 2.56亿个键的情况下,随着客户端会话数的变化,吞吐量(对数尺度)。

 title= 1024个键,和(b) 2.56亿个键的情况下,随着批量大小的变化,吞吐量(对数尺度)。")

延迟 GET/SET

接下来,工程人员通过发出80%的GET和20%的SET请求的混合体,来测量各种系统的客户端延迟,并将其与Garnet进行比较。因为工程人员关心的是延迟,所以工程人员保持数据库大小较小,同时变化工作负载的其他参数,如客户端线程数、批量大小和负载大小。

图3展示了随着客户端会话数的增加,Garnet的延迟(以微秒计)在各个百分位数上都一直较低且更稳定,与其他系统相比。请注意,这个实验不使用批处理。

 title= 中位数,(b) 第99百分位数,和(c) 第99.9百分位数")

Garnet的延迟经过了精细调整,以适应客户端的批处理和高效处理查询系统的多个会话。在工程人员的下一组实验中,工程人员将批量大小从1增加到64,并在下面的图中以128个活跃客户端连接绘制不同百分位数的延迟。如图4所示,当批量大小增加时,Garnet保持稳定性并实现了比其他系统更低的整体延迟。

 title= 中位数,(b) 第99百分位数,和(c) 第99.9百分位数")

更多性能测试

参考网站https://microsoft.github.io/garnet/docs/benchmarking/results-resp-bench

部署

参考网站https://microsoft.github.io/garnet/docs

克隆项目

git clone https://github.com/microsoft/garnet

安装dotnet 8的SDK后,使用以下命令进行编译

dotnet build -c release

进入garnet文件夹下的main文件夹,点击GarnetServer文件夹,一直进入发布版本(net8.0),然后找到GarnetServer.exe双击运行即可。

image

终端出现以上界面即代表启动成功。你可以使用redis的连接客户端连接上Garnet。


遐想

Garnet作为微软开源的一款高性能分布式缓存存储系统,凭借其卓越的性能、可扩展性以及全面的功能特性,为数据密集型应用场景带来了新的解决方案。Garnet并非是要取代Redis,而是提供了一个与Redis兼容的、具有一些独特优势的选择。任何技术产品都有其适用范围和限制,用户在选择采用时需结合自身项目的具体需求和环境来权衡其优缺点。并且Redis毕竟是经历过十数年工业验证,无数双眼睛盯着这个开源项目,不可能一上来就被某神秘力量以数量级的性能优势超越,到底怎么样,需要交给时间、交给市场检验!

热烈欢迎各位在评论区分享交流心得与见解!!!


声明:本文为辣码甄源原创,转载请标注"辣码甄源原创首发__"__并附带原文链接。


辣码甄源
13 声望21 粉丝

开源软件综合服务商,为开源人员提供可持续发展通道、为学习人员提供便捷学习渠道、为企业方提供开源定制化落地方案,发现、助力、合作、共赢开源好项目