尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Garnet 远程缓存存储(Remote Cache-Store)全面指南:架构、API 覆盖与部署实践

Garnet 远程缓存存储(Remote Cache-Store)全面指南:架构、API 覆盖与部署实践 Garnet 远程缓存存储Remote Cache-Store全面指南架构、API 覆盖与部署实践【免费下载链接】garnetGarnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnetGarnet 是微软研究院Microsoft Research推出的一款远程缓存存储系统以极高性能、低延迟、可扩展与可持久化为核心设计目标。本指南以 Garnet 官方欢迎文档为主线结合当前仓库的源码、构建配置与测试代码系统讲解其架构原理、RESP 协议兼容的 API 覆盖、支持平台、两种部署方式Azure 托管服务与自托管以及性能评估方法帮助你快速判断 Garnet 是否适合你的应用场景并掌握从源码构建、配置到连接客户端的完整实操路径。Garnet 是什么核心定位与设计目标Garnet 是一个远程缓存存储系统remote cache-store其设计强调三个关键词极快extremely fast、可扩展extensible与低延迟low latency。在单节点内Garnet 具有良好的线程可扩展性thread-scalable同时它也支持分片sharded集群执行模式并附带复制replication、检查点checkpointing、故障转移failover与事务transactions能力。Garnet 既可以完全运行在主内存之上也可以利用分层存储tiered storage如 SSD 与 Azure Storage将超过内存容量的数据集溢写到本地与云存储设备。此外Garnet 提供了丰富的 API 表面与强大的扩展模型是官方文档中反复强调的两大核心能力。官方文档列出的关键优势Garnet 欢迎文档website/docs/welcome/intro.md列出了以下关键优势均可在仓库中找到对应的工程化支撑吞吐量优势在小批次small batches与大量客户端会话场景下相对同类开源缓存存储可获得数量级orders-of-magnitude更高的服务端吞吐ops/sec。极低单操作延迟官方文档描述在启用加速网络Accelerated Networking的普通云Azure机器上Windows 与 Linux 环境均常能达到 99.9 分位p99.9低于 300 微秒的单操作延迟。客户端扩展性随着客户端数量增加无论是否启用客户端侧批量操作Garnet 都表现出更好的可扩展性。单实例资源利用通过单个共享内存服务实例即可使用服务器的全部 CPU/内存资源无需节点内集群no intra-node cluster。超内存数据集支持大于内存的数据集可溢写到本地与云存储设备。数据库级特性快速检查点与恢复、发布/订阅publish/subscribe等。多节点能力支持多节点分片哈希分区即 Redis 的 “cluster” 模式、状态迁移state migration与复制。测试保障拥有全面测试套件Garnet 与其存储层 Tsavorite 合计数千个单元测试。C# 代码库易于演进与扩展。说明上述延迟与吞吐描述均为官方文档与 README 中的陈述见 README.md实际数值依赖硬件、网络配置与负载特征建议结合自身环境通过基准测试验证。技术架构剖析网络层、双存储引擎与窄腰存储 API要理解 Garnet 的 快 从哪里来需要从仓库的工程实现入手。当前仓库的代码结构清晰地体现了其分层设计源码入口主要位于 libs/server 与 libs/storage/Tsavorite。共享内存网络层Garnet 的网络层基于共享内存设计shared memory design其网络处理逻辑位于 libs/common/Networking。根据 README 的设计说明Garnet 在常见路径common case中将 TLS 处理与存储交互直接放在网络 IO 完成线程上执行避免线程切换开销。这种设计让 CPU 缓存一致性cache coherence把数据带给处理逻辑而非传统基于数据洗牌shuffle的网络设计那样需要把数据移动到服务器上相应的分片。网络层本身是快速且可插拔pluggable的这为未来扩展例如利用内核旁路协议栈 kernel-bypass stacks留下了空间。TLS 通信基于 .NET 的SslStream库实现。Tsavorite 双存储引擎main store 与 object storeGarnet 的存储层名为Tsavorite仓库位于 libs/storage/Tsavorite其核心思想源自微软 FAST/FASTER 系列研究项目。Garnet 内部由两个 Tsavorite 键值存储构成二者的生命周期由统一的操作日志unified operation log绑定主存储main store针对原始字符串raw string操作优化通过精细的内存管理尽量避免垃圾回收GC压力对象存储object store可选的第二存储针对复杂对象与自定义数据类型优化包括 Sorted Set、Set、Hash、List、Geo 等常用类型。对象存储中的数据类型实现复用了 .NET 库生态在内存中以堆对象形式存放更新效率高在磁盘上以序列化形式持久化。从源码结构看对象类型的实现集中在 libs/server/ObjectsHash、List、Set、SortedSet、SortedSetGeo、ItemBroker 等子目录而存储会话逻辑在 libs/server/Storage/Session。窄腰存储 API 与异步回调Garnet 设计的一个显著特征是窄腰narrow-waistTsavorite 存储 API在其上实现了庞大、丰富且可扩展的 RESP API 表面。该 API 由读取read、更新upsert、删除delete与原子读-改-写read-modify-write操作构成并以异步回调方式让 Garnet 在每次操作的各个阶段注入逻辑。这种模型把 Garnet 的解析与查询处理关注点和存储细节并发、存储分层、检查点清晰分离多键事务则使用两阶段锁two-phase locking实现。集群模式除单节点执行外Garnet 提供完整功能的集群模式支持创建与管理分片复制的部署并支持高效、动态的键迁移方案以重新平衡分片。用户可以使用标准 Redis 集群命令创建和管理 Garnet 集群节点间通过 gossip 协议共享与演进集群状态。官方文档指出Garnet 的集群模式设计当前是被动式passive的它不实现领导者选举而是响应用户提供的控制平面control plane下发的集群命令。集群相关实现可见于 libs/cluster 目录。API 覆盖以 RESP 协议兼容 Redis 客户端Garnet 采用 Redis 的RESP协议作为主要线协议wire protocol因此可以直接使用绝大多数编程语言中未经修改的 Redis 客户端例如 C# 中的 StackExchange.Redis。这意味着迁移成本极低现有的 Redis 客户端生态可以无缝对接 Garnet。命令分类全景Garnet 支持一个庞大且持续增长的 API 表面完整清单见 website/docs/commands/api-compatibility.md官方文档将命令划分为以下类别ACLBITMAPCLIENTCLUSTERCOMMANDCONNECTIONFUNCTIONSGENERICGEOHASHHYPERLOGLOGKEYSLATENCYLISTMEMORYMODULEOBJECTPUB/SUBSCRIPTINGSERVERSETSLOWLOGSORTED SETSTREAMSTRINGTRANSACTIONS此外还有 JSON Module部分实现、RANGE INDEXPreview与 VECTOR SETPreview三类扩展命令组。官方文档中的兼容性表格以 ➕已支持与 ➖未支持标记每个命令的状态并注明弃用Deprecated与内部命令等说明——例如 GEO 的GEORADIUS系列标注为已弃用推荐使用GEOSEARCHSTREAM 类别XADD、XREAD 等当前标注为未支持FUNCTIONS类别FCALL 等亦未支持。六大类核心命令举例欢迎文档着重列举了以下几类能力的代表性命令原始字符串操作GET、SET、MGET、MSET、GETSET、SETEX、DEL、EXISTS、RENAME、EXPIRE以及 SET 的各类变体如 set-if-exists / set-if-not-exists即SET ... NX/XX数值操作INCR、INCRBY、DECR、DECRBY远程数据结构List、Hash、Set、Sorted Set 与 Geo分析型 APIHyperloglog 与 Bitmap检查点/恢复操作SAVE、LASTSAVE、BGSAVE管理操作PING、QUIT、CONFIG、RESET、TIMEACL 支持ACL 相关命令见 libs/server/ACL 的解析与权限实现发布/订阅、事务与 Lua 脚本Pub/Sublibs/server/PubSub、事务libs/server/Transaction与 Lua 脚本libs/server/Lua向量数据库支持Preview基于 DiskANN 算法相关命令与实现位于 libs/server/Resp/Vector范围索引支持Preview基于 Bf-Tree其原生实现位于 libs/native/bftree-garnetRust 编写的 BfTreeService。命令解析与分发的主入口位于 libs/server/Resp如 BasicCommands.cs、ArrayCommands.cs、AdminCommands.cs 等官方提示该列表会随社区贡献持续演进。强大的自定义操作框架除了内置命令Garnet 支持自定义操作符框架custom operator framework可以在服务端注册自定义的 C# 数据结构与读-改-写RMW操作并通过相同的线协议访问它们。这样你可以利用客户端库执行新命令的能力例如 StackExchange.Redis 的Execute/ExecuteAsync调用来调用这些自定义命令。该框架的工程化体现在 libs/server/CustomCustomCommandManager、CustomRawStringCommand、CustomObjectBase、CustomTransaction 等并配套可参考的示例main/GarnetServer/Extensions目录下的 MyDictGet.cs、MyDictSet.cs、MyDictObject.cs 演示了自定义对象类型DeleteIfMatch.cs、MGetIfPM.cs、MSetPx.cs、SetIfPM.cs 演示了自定义命令ReadWriteTxn.cs、SampleDeleteTxn.cs、SampleUpdateTxn.cs 演示了服务端存储过程事务。模块化扩展的通用框架可见 libs/server/Module 与 modules 目录如 GarnetJSON、RoaringBitmap、NoOpModule。支持的平台与存储后端Garnet 服务器基于高性能 .NET 技术从零构建设计之初就为性能而生。官方文档声明其已在Linux 与 Windows上做了同等充分的测试覆盖普通 Azure 硬件与边缘设备。Garnet 也可以被视作一台极快的远程 .NET 数据结构服务器通过利用丰富的 C# 库生态可以在核心 API 之外持续扩展。其存储层 Tsavorite 支持多种后端存储设备包括快速的本地 SSD 与 Azure Storage并且分别针对 Windows 与 Linux 做了设备优化同时 Garnet 支持 TLS 以保障安全连接。当前仓库的工程约束也可以从构建配置中读出Directory.Build.props 声明多目标框架net8.0;net10.0并启用了TreatWarningsAsErrors版本号定义在 Version.props当前为2.1.5。GarnetServer 主程序项目为 main/GarnetServer/GarnetServer.csproj同时作为garnet-serverdotnet 工具PackAsTool发布。部署选项托管服务与自托管官方欢迎文档提供了两种部署路径面向生产工作负载的Azure Cosmos DB Garnet Cache托管服务preview以及面向开发、研究或自定义部署的自托管开源 Garnet。Azure Cosmos DB Garnet CachepreviewAzure Cosmos DB Garnet Cache 是一个完全托管的缓存服务建立在 Garnet 之上提供企业级安全、自动扩展、全球分布与全面的监控消除了基础设施运维负担同时保留 Garnet 的性能优势目前处于扩展的 Private Preview 阶段。官方文档列出的关键收益包括完全托管的基础设施与运维高可用与无缝扩展企业级安全与合规与 Azure 监控和诊断集成。其架构细节可参考 website/docs/azure/overview.md该托管服务在节点内采用共享一切shared-everything架构所有线程直接访问单一共享内存空间官方描述其提供低于 1ms 的中位延迟P50与 99 分位 3msP99的延迟表现、跨节点线性扩展的吞吐、可选的 AOF RDB 持久化并提供 General Purpose4–768 GB 内存、2–192 vCPU、Memory Optimized16–1024 GB 内存、Compute Optimized8–256 GB 内存三个性能档位均为每节点规格。自托管 Garnet从源码构建到运行自托管方式给予你对基础设施的完全控制权官方文档指出 Garnet 已被微软内部多个第一方与平台团队使用多年。完整步骤见 website/docs/getting-started/build.md要点如下。1. 克隆仓库git clone gitgithub.com:microsoft/garnet.git2. 构建项目Garnet 多目标支持net8.0与net10.0需要安装 .NET 10 SDK.NET 10 SDK 可构建两个目标若需构建或运行net8.0目标还需安装 .NET 8 运行时与 targeting pack。Linux 与 Windows 均可Directory.Build.props 中的TargetFrameworks与此对应。在仓库根目录执行cd garnet dotnet build -c Release也可以打开Garnet.slnx使用 Visual Studio 2022 17.x 或 Visual Studio 2026 构建。3. 运行测试套件在仓库根目录执行Release 模式、.NET 10 目标、详细日志输出到控制台dotnet test -c Release -f net10.0 -l console;verbositydetailed提示使用 Azure 云存储的测试默认跳过除非设置环境变量RunAzureTests为yes并运行 Azurite。测试项目分布在 test/standaloneGarnet.test 等与 test/cluster集群、迁移、复制等多组测试项目测试配置模板见 test/standalone/garnet.runsettings 与 test/cluster/garnet-cluster.runsettings。4. 部署并运行服务器cd main/GarnetServer dotnet run -c Release -f net10.0默认监听 TCP 端口6379远程访问需调整防火墙设置默认绑定IPAddress.Any与IPAddress.IPv6Any端点请按需调整查看全部可配置选项与默认值dotnet run -c Release -f net10.0 -- --help例如以 512MB 索引大小启动替换默认值dotnet run -c Release -f net10.0 -- -i 512m5. 使用 RESP 客户端连接由于使用 RESP 协议任何语言中的 Redis 客户端都可直接连接 Garnet。C# 应用既可使用 StackExchange.Redis也可使用 Garnet 自带的 C# 客户端GarnetClient实现位于 libs/client/GarnetClient.cs。Windows 下可用 RedisInsight图形界面与 CLI或 Memurai 的 memurai-cli也可在 WSL 中通过 redis-cli 连接先让 GarnetServer 监听0.0.0.0必要时加--bind 0.0.0.0将GarnetServer.exe加入防火墙例外在 WSL 中获取主机 IPip route show | grep -i default | awk { print $3}再执行redis-cli -h address。若无效可尝试 Windows 11 22H2 及以上的镜像网络模式mirrored networking mode。无论使用哪种客户端注意使用正确的端口如6379。关键配置项源码级佐证Garnet 的全部可配置项集中在 libs/host/Configuration/Options.cs每个选项通过OptionAttribute声明并带有验证器与帮助文本默认值定义在 libs/host/defaults.conf。常用配置项包括配置项说明默认/取值示例--port服务器监听端口默认6379取值范围 0–65535--bind绑定的 IP 地址空白或逗号分隔默认 any-m, --memory主日志总内存inline 与 heap字节数需通过MemorySizeValidation不必是 2 的幂-p, --page每个主日志页大小向下取 2 的幂最小 512字节数--pagecount主日志页数向下取 2 的幂整数-s, --segment磁盘上每个主日志段大小向下取 2 的幂字节数--object-log-segment磁盘上对象日志段大小向下取 2 的幂字节数-i示例索引大小示例中以 512m 演示如512m--cluster-announce-port/--cluster-announce-ip/--cluster-announce-hostname集群节点向其他节点广播的 gossip 端点集群模式使用欢迎文档明确指出通过这些参数可以配置索引大小、内存大小、页大小、数据文件路径与检查点路径、绑定 IP、端口等。完整的服务器选项映射与校验逻辑还涉及 libs/server/Servers/GarnetServerOptions.cs、libs/server/ServerConfig.cs 与 libs/host/Configuration/OptionsValidators.cs。性能评估官方基准工具与 BDN CI欢迎文档链接到性能基准概览website/docs/benchmarking/overview.md官方采用两套工具保障与追踪性能Resp.benchmark官方自研的基准测试客户端工具位于 benchmark/Resp.benchmark用于严格控制各类参数、规避客户端侧开销使评测聚焦于服务端能力BDNBenchmarkDotNet基准位于 benchmark/BDN.benchmark已集成进 Garnet 的 CI每次 push 到 main 都会在 Windows 与 Linux 上运行并记录指标CI 首先对比某次运行的 “Allocated” 字节数与期望值超出 10% 即判失败通过后再将 “Mean” 值与上一次运行比较并记录供趋势图表使用。本地运行 BDN 测试可执行 test/BDNPerfTests/run_bdnperftest.ps1可选参数为具体测试名如Operations.BasicOperations、Cluster.ClusterMigrate、Lua.LuaScripts结果输出在test/BDNPerfTests/results/*.results。总结与进一步阅读Garnet 从网络层、存储引擎到 API 表面进行了全栈重构以 RESP 协议实现与 Redis 客户端的无缝兼容以共享内存多线程架构换取高吞吐与低延迟以 Tsavorite 分层存储换取超内存容量与持久化能力并以 C# 自定义操作框架与模块机制提供强扩展性。若你的应用或服务需要兼具丰富实用特性、高性能与现代设计基于微软研究院前沿技术的缓存存储Garnet 是一个值得认真评估的选择。深入了解性能对比benchmarking 概览查看完整命令支持状态API 兼容性清单体验托管服务Azure Cosmos DB Garnet Cache 概览开始自托管构建与部署指南Redis 是 Redis Ltd. 的注册商标。其相关权利归 Redis Ltd. 所有。微软对 “Redis” 的任何使用仅出于指代目的不代表 Redis 与微软之间存在任何赞助、认可或关联关系。【免费下载链接】garnetGarnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表