ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dragonfly 配置指南与架构解析:从 Benchmark 到共享无状态设计的内存数据存储

Dragonfly 配置指南与架构解析:从 Benchmark 到共享无状态设计的内存数据存储 Dragonfly 配置指南与架构解析从 Benchmark 到共享无状态设计的内存数据存储【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonflyDragonfly 是一个为现代云工作负载设计的 in-memory data store完整兼容 Redis 与 Memcached 的 API可在不修改代码的前提下作为二者的直接替代品。本文以项目泰语版 READMEREADME.th-TH.md为核心骨架系统梳理其 Benchmark 结果、全部启动参数与配置项、四大设计决策以及共享无状态shared-nothing架构的底层原理并结合仓库源码给出可验证的实现依据帮助你从能跑起来进阶到会调优、懂原理。项目定位面向现代应用工作负载的内存数据存储Dragonfly 的核心定位是一款专为现代应用负载而构建的 in-memory data store。与上一代内存数据存储相比它在相同规模的工作负载下能够提供更高的吞吐量、更高的缓存命中率、更低的尾部延迟并以更少的资源消耗运行据 README.th-TH.md 的官方表述吞吐量最高可达上一代方案的 25 倍同等负载下资源占用可降低最多 80%。由于同时支持 Redis 与 Memcached 协议Dragonfly 可以做到无需修改业务代码即可平滑迁移。不过需要注意的是官方 README 开篇也明确建议在继续阅读之前先为项目点一个 GitHub star。你可以通过 快速上手文档 在几分钟内启动一个实例——默认情况下Dragonfly 同时响应http与redis两种协议的请求用redis-cli连接localhost:6379或用浏览器打开http://localhost:6379均可。Benchmark与 Redis、Memcached 的实测对比测试环境与工具官方基准测试使用 AWS 上的m5.large实例这是社区运行 Redis 的常见机型因为 Redis 是单线程架构负载发生器load test运行在同可用区AZ的另一台c5n实例上压测工具为memtier_benchmark命令如下memtier_benchmark -c 20 --test-time 100 -t 4 -d 256 --distinct-client-seed单线程机型m5.large对比在m5.large上Dragonfly 与 Redis 的性能非常接近SET 操作--ratio 1:0RedisDragonflyQPS: 159KP99.9: 1.16msP99: 0.82msQPS: 173KP99.9: 1.26msP99: 0.9msGET 操作--ratio 0:1RedisDragonflyQPS: 194KP99.9: 0.8msP99: 0.65msQPS: 191KP99.9: 0.95msP99: 0.8ms这一结果说明帮助 Dragonfly 实现垂直扩展的算法层algorithm layer在单线程运行时并没有带来明显的性能损失。更高规格机型m5.xlarge对比当换到稍高规格的m5.xlarge实例后差距开始显现memtier_benchmark -c 20 --test-time 100 -t 6 -d 256 --distinct-client-seedSET 操作--ratio 1:0RedisDragonflyQPS: 190KP99.9: 2.45msP99: 0.97msQPS: 279KP99.9: 1.95msP99: 1.48msGET 操作--ratio 0:1RedisDragonflyQPS: 220KP99.9: 0.98msP99: 0.8msQPS: 305KP99.9: 1.03msP99: 0.87ms关键结论是Dragonfly 的吞吐量会随实例规格持续增长而单线程的 Redis 受限于 CPU 瓶颈在达到该实例的峰值后便不再提升。在支持最高网络带宽的c6gn.16xlarge实例上Dragonfly 相比单进程 Redis 实现了 25 倍的吞吐量提升QPS 超过 380 万。峰值吞吐下的 P99 延迟在吞吐量达到峰值时Dragonfly 的 P99 延迟仍保持在 1ms 左右操作r6gc6gnc7gset0.8ms1ms1msget0.9ms0.9ms0.8mssetex0.9ms1.1ms1.3ms所有 benchmark 均使用memtier_benchmark运行命令模板见下线程数会根据不同 server 与实例类型调整memtier单独运行在另一台c6gn.16xlarge上。SETEX 测试将 expiry 设为 500确保测试结束前 key 不会过期。memtier_benchmark --ratio ... -t threads -c 30 -n 200000 --distinct-client-seed -d 256 \ --expiry-range...在 pipeline 模式--pipeline30下Dragonfly 的 SET 吞吐量可达1000 万 QPSGET 可达1500 万 QPS。Dragonfly vs. Memcached在 AWSc6gn.16xlarge实例上当延迟相近时Dragonfly 在读写两种负载下都提供了比 Memcached 更高的吞吐量在写负载下Dragonfly 还因为避免了 Memcached 写路径 中的锁竞争提供了更低的延迟。SET benchmarkServerQPS千 QPSlatency 99%99.9%Dragonfly38440.9ms2.4msMemcached8061.6ms3.2msGET benchmarkServerQPS千 QPSlatency 99%99.9%Dragonfly37171ms2.4msMemcached21000.34ms0.6ms需要注意的是Memcached 在读测试中延迟更低但吞吐量也明显更低两者各有取舍。内存效率Memory efficiency为了对比内存效率测试流程如下先用debug populate 5000000 key 1024向 Dragonfly 与 Redis 各填充约 5GB 数据再用memtier发送 update 流量最后执行bgsave触发快照观测内存变化结果表明在 idle 状态下Dragonfly 的内存使用效率比 Redis 高约 30%创建快照期间 Dragonfly 几乎没有可观测的内存增长而 Redis 在峰值时内存占用接近 Dragonfly 的 3 倍。Dragonfly 的快照仅需数秒即可完成。关于内存效率的底层原理详见 Dashtable 数据结构详解。Configuration完整参数指南Dragonfly 兼容 Redis 的常用启动参数例如可以直接运行dragonfly --requirepassfoo --bind localhost。Redis 兼容参数参数说明默认值portRedis 协议的监听端口6379bind设为localhost仅允许本机连接设为公网 IP 则允许客户端包括外部客户端连接到该 IP设为0.0.0.0允许任意 IPv4 地址连接空requirepass使用 AUTH 认证时的密码maxmemory数据库使用的最大内存上限支持可读格式如12gb、500mb为0时由程序自动决定上限0dir快照文件的输出目录Docker 版本默认使用/dataCLI 版本默认为可用 Docker 的-v选项将该目录映射到宿主机目录dbfilename保存/加载数据库的文件名dump其中dbfilename与dir的源码定义位于 src/server/server_family.ccrequirepass的读写还支持通过环境变量DFLY_requirepass注入见 src/server/acl/user_registry.cc。maxmemory在 src/server/dfly_main.cc 中被声明为strings::MemoryBytesFlag类型因此可以接收12gb这类人类可读的字节格式。Dragonfly 专属参数参数说明默认值memcached_port启用 Memcached 兼容 API 的监听端口disabledkeys_output_limitkeys命令最多返回的 key 数量。keys是危险命令限制输出可以避免拉取过多 key 造成内存暴涨8192dbnumselect命令支持的最大 database 数量16cache_mode是否启用缓存模式详见下文新颖的缓存设计falsehz检查 key 过期情况的频率。频率越低idle 状态下 CPU 占用越少但 evict 速率会变慢100snapshot_cron定时自动创建备份快照的 cron 表达式采用标准 cron 语法、分钟级精度primary_port_http_enabled设为true时允许通过主 TCP 端口访问 HTTP consoletrueadmin_port通过指定端口开放 admin console 访问同时支持 HTTP 与 RESPdisabledadmin_bind将 admin console 的 TCP 连接绑定到指定地址同时支持 HTTP 与 RESPanyadmin_nopass设为true时admin console 无需 auth token 即可访问同时支持 HTTP 与 RESPfalsecluster_mode支持的 cluster 模式目前仅支持emulatedcluster_announce_ipcluster 命令向客户端宣告的 IP空announce_port向客户端与 replication master 宣告的端口空这些参数在源码中均有明确落点例如keys_output_limit定义于 src/server/generic_family.cc在keys命令执行时读取并截断输出同文件 L1563memcached_port定义于 src/server/main_service.cc默认值为0即关闭为 0 时不创建 Memcached listenersnapshot_cron定义于 src/server/server_family.cc类型为CronExprFlag配套的旧参数save_schedule已标记为 deprecated同文件 L122admin_port/admin_bind定义于 src/server/dfly_main.cc在启动阶段创建独立的 admin listener同文件 L424-L434cluster_mode定义于 src/server/cluster_support.cc实际支持emulated、yes与空值三种取值其中空值表示关闭 cluster同文件 L53-L66。snapshot_cron的示例表达式如下Cron 表达式含义* * * * *每分钟*/5 * * * *每 5 分钟5 */2 * * *每 2 小时的第 5 分钟0 0 * * *每天午夜00:000 6 * * 1-5周一至周五早晨 06:00综合启动脚本示例./dragonfly-x86_64 --logtostderr --requirepassyoushallnotpass --cache_modetrue -dbnum 1 --bind localhost --port 6379 --maxmemory12gb --keys_output_limit12288 --dbfilename dump.rdb除了命令行参数还有两种传递配置的方式--flagfile filename文件中每行写一个 flagkey-value 形式的 flag 用连接键与值值无需加引号环境变量设置为DFLY_x其中x必须与 flag 名逐字母一致区分大小写例如DFLY_requirepass。其余选项如日志管理、TLS 支持可以通过dragonfly --help查看。设计决策Design decisions新颖的缓存设计Novel cache designDragonfly 提供一套全局统一的、自适应的缓存算法结构简单且内存高效。通过--cache_modetrue开启缓存模式后Dragonfly 会在内存使用接近maxmemory上限时逐出evict未来最不可能被访问的 item。该模式在引擎层由DbSlice承载其构造函数接收cache_mode参数src/server/db_slice.cc内部通过cache_mode_位标记控制缓存语义src/server/db_slice.h从而将缓存淘汰与常规存储统一在同一套数据通路中。相对精确的过期时间Expiration deadlines过期时间上限被限制在约8 年毫秒级精度的过期指令如PEXPIRE、PSETEX当 deadline 大于2^28ms时会被静默四舍五入到最近的秒误差低于 0.001%——对于长时间跨度而言通常可以接受。关于过期时间以及更多与 Redis 的差异如字符串大小限制为 256MB、索引取值范围、EXPIRE 的 NX/GT/LT 组合语义、Lua 5.4.4 与整数支持等详见 与 Redis 的差异文档。原生 HTTP console 与 Prometheus 兼容指标默认情况下Dragonfly 在主 TCP 端口6379同时开放 HTTP 访问连接建立时 server 会自动探测协议类型。也就是说客户端既可以用 Redis 协议连接也可以用 HTTP 协议连接甚至可以直接在浏览器中打开体验。HTTP console 目前展示的信息有限但未来会加入更多便于调试与运维管理的内容。打开:6379/metrics即可查看 Prometheus 兼容的指标。该路由的注册可见于 src/facade/ok_main.cc 与 src/server/server_family.cc同时 src/server/main_service.cc 也处理了/metrics与/healthz路径。这些指标可以直接接入 Grafana dashboard官方提供了现成的 dragonfly.json 仪表盘配置 供参考。安全提醒HTTP console 仅应在可信网络中访问。如果你将 Dragonfly 的 TCP 端口暴露给外部强烈建议通过--http_admin_consolefalse或--nohttp_admin_console关闭 console。Background架构背景与设计选择Dragonfly 始于 2022 年的一次实验如果基于 2022 年当时的认知重新设计一个 in-memory datastore它应该长什么样设计者作为 memory store 的长期用户和曾任职于云厂商的工程师明确了两个必须保留的核心特性每个操作的 atomicity 保证与亚毫秒级延迟同时要支撑极高的吞吐量。共享无状态架构Shared-nothing architecture第一个核心挑战是如何在当今公有云服务器上榨干 CPU、内存与 I/O 资源。为此Dragonfly 选择了shared-nothing architecture将 memory store 的 keyspace 按线程切分每个线程管理属于自己的 dictionary 数据每个分区被称为shard。负责线程与 I/O 管理的开源库为 helio。基于 VLL 论文的事务框架为了保证 multi-key 操作的 atomicityDragonfly 引入了学术研究的最新进展——论文VLL: a lock manager redesign for main memory database systems中的思想构建了自己的事务框架。共享无状态架构与 VLL 的结合使得 Dragonfly 可以在不使用 mutex 或 spinlock 的前提下组合出原子的 multi-key 操作这是 PoC 阶段的重要里程碑相比同类商业与开源方案也展现出了显著性能优势。基于 Dash 论文的核心哈希表第二个挑战是为这个全新 store 设计更高效的数据结构。Dragonfly 的核心 hashtable 借鉴了论文Dash: Scalable Hashing on Persistent Memory的设计。虽然该论文面向 persistent memory但它的哈希表设计恰好完美契合 Dragonfly 的需求帮助其保留了 Redis dictionary 的两个关键特性数据规模增长时的incremental hashing渐进式扩容能力用stateless scan遍历正在变化的 dictionary 的能力。同时 Dash 对 CPU 与内存的利用更加高效。基于 Dash 设计Dragonfly 进一步衍生出以下能力针对 TTL record 的高效过期record expiry处理全新的缓存淘汰算法在零内存开销的前提下hit rate 高于 LRU、LFU 等传统缓存策略全新的fork-less无 fork快照算法。这些特性在 Dashtable 数据结构文档 中有详细展开每个可 select 的 database 持有一个主 dashtable 存放全部 entry另有一个 dashtable 实例存放带 TTL 的过期信息。Dashtable 采用directory segment两级结构每个 segment 是定长的迷你哈希表当前实现为 56 个常规 bucket 4 个 stash bucket每个 bucket 14 个 slot共可容纳 840 条记录相比 Redis 经典链式哈希表平均每条记录仅需 6-16 字节的元数据开销Redis 为 16-32 字节且扩容时只需按 segment 粒度增量分配消除了扩容带来的延迟尖峰。正是这种结构让 forkless save 与低开销被动过期passive expiry得以实现。在功能完备度方面Dragonfly 目前实现了约185 个 Redis 命令接近 Redis 5.0 API 覆盖面与13 个 Memcached 命令。项目使命我们的使命是打造一个设计精良、速度极快、面向云工作负载高性价比的 in-memory datastore充分利用最新硬件进步解决现有方案的痛点同时保留它们成熟的 API 与产品价值。总结通过本文你可以掌握 Dragonfly 的完整配置面从port、bind、requirepass、maxmemory等 Redis 兼容参数到cache_mode、snapshot_cron、admin_port、cluster_mode等专属参数以及--flagfile与环境变量两种备选配置通道。在原理层面shared-nothing 架构 VLL 事务框架 Dash 哈希表构成了它的技术底座而 HTTP console、Prometheus 指标与 fork-less 快照则让它在运维上同样现代化。如果需要进一步深入建议继续阅读仓库内的 Dashtable 详解、与 Redis 的差异、Memcached 基准测试 以及 快速上手 等文档。【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表