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

资讯详情

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

Dragonfly 深入解析:兼容 Redis/Memcached 的高吞吐内存数据存储与核心设计

Dragonfly 深入解析:兼容 Redis/Memcached 的高吞吐内存数据存储与核心设计 Dragonfly 深入解析兼容 Redis/Memcached 的高吞吐内存数据存储与核心设计【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonflyDragonfly 是面向现代云应用工作负载的内存数据存储in-memory datastoreAPI 层面与 Redis 和 Memcached 完全兼容应用无需修改代码即可迁移接入。本文基于仓库 README.ko-KR.md韩文版项目说明并结合 src/server 下真实源码系统讲解 Dragonfly 的基准测试表现、命令行配置参数与默认值、缓存/过期/快照等关键设计决策以及 shared-nothing 架构与 Dash 哈希表等技术背景帮助读者既能在生产环境直接上手配置部署也能从源码层面理解其高性能的来源。图片说明下图为本仓库 docs/dashtable.md 中记录的 BGSAVE 内存占用对比实验曲线用于佐证下文“内存效率”一节中快照阶段内存表现的描述右侧为 Dash 哈希表结构示意图对应“设计决策”一节中的核心数据结构。一、项目定位面向现代工作负载的内存数据存储Dragonfly 是一个为现代应用工作负载设计的内存数据存储核心卖点有三条API 完全兼容 Redis 与 Memcached使用现有客户端和现有命令即可接入不需要修改应用代码高吞吐与低尾延迟相比传统内存数据存储项目方基准测试显示吞吐量提升显著且拥有更低的尾部延迟tail latency简单高效的内存利用通过全新的数据结构与缓存算法在同等工作负载下占用更少的内存资源。在命令支持方面项目说明README.ko-KR.md指出 Dragonfly 目前已支持约185 个 Redis 命令大致相当于 Redis 5.0 API 的覆盖面以及全部 Memcached 命令含cas。具体支持的命令清单可在项目的命令参考文档中查询仓库内 fuzz/seeds 目录下的 resp / memcache 种子文件也侧面反映了命令覆盖范围之广涵盖 string、hash、list、set、zset、stream、json、bloom filter、pub/sub、事务、脚本等类别。二、基准测试吞吐量与内存效率注意以下数据均为项目方在 README 中公开的基准测试声明测试环境为 AWS 特定实例类型结果受硬件、网络与测试参数影响仅作横向参考。2.1 峰值吞吐量在 AWS 网络能力最强的 c6gn.16xlarge 实例上项目方基准测试显示 Dragonfly 相对 Redis 单进程吞吐量提升25 倍突破380 万 QPS3.8M QPS。在流水线pipeline模式--pipeline30下SET 操作可达1000 万 QPS10M QPSGET 操作可达1500 万 QPS15M QPS。Dragonfly 在峰值吞吐量下的 99 分位延迟指标来自 README.ko-KR.md操作r6gc6gnc7gset0.8ms1ms1msget0.9ms0.9ms0.8mssetex0.9ms1.1ms1.3ms所有基准测试均使用memtier_benchmark执行线程数按服务器与实例类型分别调优memtier运行在独立的 c6gn.16xlarge 机器上。SETEX 基准的过期时间被设置为 500以确保测试结束后数据仍然有效。测试命令形如memtier_benchmark --ratio ... -t threads -c 30 -n 200000 --distinct-client-seed -d 256 \ --expiry-range...2.2 Dragonfly vs. Memcached项目方在 AWS c6gn.16xlarge 实例上对比了 Dragonfly 与 Memcached。在相近延迟的前提下Dragonfly 在读写两类负载中吞吐量均优于 Memcached写负载下 Dragonfly 延迟更优这与 Memcached 写路径 上的锁竞争有关。SET 基准对比ServerQPS千 QPSlatency 99%99.9%Dragonfly38440.9ms2.4msMemcached8061.6ms3.2msGET 基准对比ServerQPS千 QPSlatency 99%99.9%Dragonfly37171ms2.4msMemcached21000.34ms0.6ms结论Memcached 在读基准中延迟更低但吞吐量也更低Dragonfly 在写路径上优势尤其明显。2.3 内存效率与 fork-less 快照项目方内存效率实验流程如下使用debug populate 5000000 key 1024命令向 Dragonfly 与 Redis 各填充约 5GB 数据使用memtier发送更新流量使用bgsave命令触发快照并持续观测内存。结果见上文第一张图空闲状态下 Dragonfly 比 Redis 内存效率高约 30%快照阶段 Dragonfly 内存占用没有明显增长而 Redis 峰值内存接近 Dragonfly 的 3 倍Dragonfly 在几秒内即完成快照。关于内存效率更深入的分析可阅读 docs/dashtable.md——其中给出了 Dashtable 与 Redis 字典逐条记录的元数据开销对比README 指出的关键结论Dashtable 每记录仅约 20 bit 元数据开销而 Redis dictEntry 需要 64 bit以及单线程/多线程填充、BGSAVE、过期回收等实验数据。三、配置指南命令行参数与默认值Dragonfly 支持适用的 Redis 参数例如dragonfly --requirepassfoo --bind localhost。以下参数说明以 README.ko-KR.md 为准并对照 src/server 源码中的ABSL_FLAG定义核对了默认值。3.1 Redis 兼容参数参数说明默认值portRedis 连接端口6379源码见 src/facade/ok_main.cc 与 src/server/main_service.cc其中0表示禁用该端口-1表示绑定随机可用端口bind绑定地址localhost仅允许本机连接公网 IP 则允许外部连接到该 IP0.0.0.0允许所有 IPv4 连接源码见 src/server/dfly_main.ccrequirepassAUTH 认证密码源码见 src/server/server_family.cc为空时也可通过环境变量DFLY_PASSWORD设置maxmemory数据库最大内存限制可读的字节单位如512MB、2G、1.25GiB0表示程序根据运行环境自动确定最大内存源码见 src/server/main_service.cc同时要求每 proactor 线程至少 256MiB启用 tiering 时该值仅约束 RAM 部分dir快照文件目录Docker 默认使用/dataCLI 默认可通过 Docker-v选项映射到宿主机目录源码见 src/server/server_family.ccdbfilename保存/加载的数据库文件名dump源码见 src/server/server_family.cc支持{timestamp}、{Y}、{m}、{d}宏3.2 Dragonfly 特有参数参数说明默认值memcached_port启用 Memcached 兼容 API 的端口disabled源码见 src/server/main_service.cckeys_output_limitkeys命令返回的最大键数量8192源码见 src/server/generic_family.cc。keys是危险命令截断结果可避免拉取过多键时内存暴涨dbnumselect命令支持的最大数据库数量源码默认16src/server/generic_family.cccache_mode缓存模式开关见下文“新的缓存设计”false源码见 src/server/engine_shard_set.cchz键过期评估的基础频率100源码见 src/server/engine_shard.cc。频率越低空闲时 CPU 占用越低但键驱逐更慢源码注释提示生产环境不建议调低primary_port_http_enabled为true时允许通过主 TCP 端口访问 HTTP 控制台true源码见 src/facade/dragonfly_connection.ccadmin_port在指定端口启用管理员控制台同时支持 HTTP 与 RESP 协议disabled源码见 src/facade/dragonfly_connection.ccadmin_bind将管理员控制台 TCP 连接绑定到指定地址支持 HTTP 与 RESP 协议any源码见 src/facade/dragonfly_connection.ccadmin_nopass对指定端口开放无需认证令牌的管理员控制台访问支持 HTTP 与 RESP 协议false源码见 src/server/main_service.cccluster_mode集群模式当前仅支持emulated源码见 src/server/cluster_support.cccluster_announce_ip集群命令向客户端通告的 IP 地址源码见 src/server/cluster/cluster_family.ccannounce_port集群命令及复制主节点向客户端通告的端口0源码见 src/server/main_service.ccsnapshot_cron按 cron 表达式分钟粒度自动备份快照源码见 src/server/server_family.cc旧参数save_schedule已废弃常用 cron 表达式示例来自英文版 README源码 src/server/server_family.cc 中的CronExprFlag支持标准 crontab 语法Cron 表达式含义* * * * *每分钟*/5 * * * *每 5 分钟5 */2 * * *每 2 小时的第 5 分钟0 0 * * *每天 00:00午夜0 6 * * 1-5每周一至周五 06:003.3 常用选项启动脚本示例./dragonfly-x86_64 --logtostderr --requirepassyoushallnotpass --cache_modetrue -dbnum 1 --bind localhost --port 6379 --maxmemory12gb --keys_output_limit12288 --dbfilename dump.rdb参数还可以通过以下两种方式提供--flagfile filename文件中每行一个参数键值参数用等号而非空格参数值无需引号。该机制由 absl 的 flagfile 解析实现相关处理逻辑见 src/server/server_family.cc其中排除了flagfile等仅启动期生效的配置环境变量设置DFLY_x其中x为参数的精确名称区分大小写。更多选项如日志管理、TLS 支持、tiered storage、慢日志slowlog_log_slower_than、maxclients等可通过运行dragonfly --help查看例如replicaof设置复制主节点、tiered_prefix启用 SSD 分层存储等标志都定义在 src/server/server_family.cc 与 src/server/engine_shard.cc 中。四、设计决策缓存、过期与原生 HTTP 控制台4.1 新的缓存设计Novel Cache DesignDragonfly 提供一种单一、统一、自适应的缓存算法简单且内存高效。通过--cache_modetrue启用缓存模式后Dragonfly 只在接近maxmemory上限时才驱逐evict未来最不可能被再次命中的条目。源码层面缓存模式在 src/server/engine_shard_set.cc 定义并在 src/server/db_slice.h 的DbSlice构造函数中传入DbSlice::IsCacheMode()src/server/db_slice.h控制读取行为——缓存模式下仅在非加载load阶段生效。项目方在 docs/dashtable.md 中进一步指出该驱逐算法以零内存开销实现了优于 LRU/LFU 等传统策略的命中率。4.2 相对精确的过期时间Expiration Deadlines过期时间范围被限制在约8 年以内毫秒精度的过期命令如PEXPIRE、PSETEX当过期时间大于 2^28ms 时会四舍五入到最近的秒误差小于 0.001%对大规模时间范围可以接受若不符合你的使用场景可以向项目方反馈或提交 issue 说明用例。Dragonfly 与 Redis 在过期实现上的更多差异如EXPIRE系列命令同时接受NX与GT/LT组合、Lua 使用 2022 年发布的 5.4.4 并支持 lua 整数等见 docs/differences.md。4.3 原生 HTTP 控制台与 Prometheus 兼容指标默认情况下Dragonfly 允许通过主 TCP 端口6379进行 HTTP 访问——你可以通过Redis 协议或HTTP 协议两种方式连接服务器会在连接初始化阶段自动识别协议。直接用浏览器访问即可体验。当前 HTTP 页面信息不多但未来会加入有用的调试与管理信息。访问:6379/metrics可查看Prometheus 兼容指标导出的指标与 Grafana 仪表盘兼容对应配置文件见 tools/local/monitoring/grafana/provisioning/dashboards/dragonfly.json该目录下还包含配套的 Prometheus 采集配置见 tools/local/monitoring。重要安全提示HTTP 控制台设计为仅在安全网络内访问。如果对外暴露 Dragonfly 的 TCP 端口建议使用--http_admin_consolefalse或--nohttp_admin_console禁用该控制台。五、开发背景与架构选择Dragonfly 始于 2022 年的一场实验如果用 2022 年的视角重新设计一个内存数据存储它会是什么样基于团队作为内存存储用户与云公司工程师的经验Dragonfly 需要保留两个关键特性所有操作的原子性保证以及极高吞吐下的亚毫秒级低延迟。5.1 第一个挑战充分利用云服务器资源——shared-nothing 架构如何用当今公有云环境可用的服务器榨干 CPU、内存与 I/O 资源答案是shared-nothing无共享架构将内存存储的键空间keyspace在线程之间划分每个线程独立管理自己的一块字典数据这些分片被称为shard。支撑该架构的线程与 I/O 管理库即本仓库中的 helio 子项目对应上游 romange/helio 开源库。5.2 原子性保证VLL 锁管理器重设计为给多键操作提供原子性保证Dragonfly 的事务框架借鉴了学术界 VLL 论文“VLL: a lock manager redesign for main memory database systems”。shared-nothing 架构 VLL的组合使 Dragonfly 无需使用互斥锁mutex或自旋锁spinlock即可组合出原子多键操作——这是 PoC 阶段的重要里程碑。5.3 第二个挑战更高效的数据结构——Dash 哈希表为构建更高效的数据结构Dragonfly 的核心哈希表基于论文 “Dash: Scalable Hashing on Persistent Memory”arXiv:2003.07302。该论文虽面向持久内存领域但其设计恰好满足了 Dragonfly 的需求保留了 Redis 字典的两个特性数据存储扩容时的**增量哈希incremental hashing**能力通过**无状态扫描stateless scan**在字典变化时遍历的能力。除此之外Dash 在 CPU 与内存使用上更高效。基于 Dash 的设计Dragonfly 进一步实现了三项创新详见 docs/dashtable.md 对分段结构、目录开销与分裂过程的分析高效的 TTL 记录过期处理利用 Dash 分段segment满后分裂这一天然时机仅扫描单个分段内的过期条目扫描成本与分裂本身同阶O(1)配合后台渐进扫描实现低 CPU 开销的被动过期零内存开销的新缓存驱逐算法命中率高于 LRU、LFU 等传统缓存策略全新的 fork-less无 fork快照算法BGSAVE 与 SAVE 采用同一套全异步算法维持点-时间point-in-time快照保证无需 fork 子进程即可完成快照。实验数据来自 docs/dashtable.mdDragonfly vs Redis 6 在 AMD Ryzen 5 3400G 上场景DragonflyRedis 6单线程填充 2000 万键耗时10.8s16.0s单线程填充内存占用1GB1.73GB8 线程填充 2000 万键耗时2.43s16.0s8 线程填充内存占用896MB1.73GBRedis 的used_memory_overhead高达 1.0GB——对小数据场景Redis 的元数据开销甚至超过数据本身这正是 Dashtable 降低字典管理浪费的价值所在。六、路线图与状态按项目说明Dragonfly 当前支持约 185 个 Redis 命令与全部 Memcached 命令含cas几乎与 Redis 5 API 对等。下一个里程碑是稳定核心功能并实现复制 API——为支持 Dragonfly 独有的复制功能项目正在设计一种能提供数倍速度的分布式日志格式复制功能落地后将继续补齐 Redis 3-6 API 中缺失的命令。若缺少所需命令可在项目 issues 中提出。此外Dragonfly 提供了丰富的周边资源便于上手快速开始指南见 docs/quick-start/README.mdDocker 编排示例见 contrib/docker/docker-compose.yml详细的 Dashtable 内存结构解析见 docs/dashtable.md与 Redis 的行为差异清单见 docs/differences.md。结语从命令行参数到核心数据结构Dragonfly 的设计处处体现“以现代硬件为目标”的思路shared-nothing 架构让多核资源被充分压榨VLL 事务框架免去了锁的代价Dash 哈希表把字典元数据开销压到接近理论极限而 fork-less 快照与零开销缓存驱逐算法则是这些底层优势向应用层能力的自然延伸。配合 Redis/Memcached 兼容 API 与开箱即用的 HTTP/Prometheus 监控能力Dragonfly 为希望在保留既有客户端生态的同时获得更高吞吐与更低资源消耗的团队提供了一个值得评估的现代内存数据存储选项。【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表