系统极客一直在努力
专注操作系统及软件使用技能

Valkey 9.0 发布:引入原子化 Slot 迁移、大量性能与功能优化

Valkey

Valkey 9.0 正式发布!作为 Valkey 的第二个主版本,它带来了众多激动人心的创新、社区期盼已久的功能,以及针对现代工作负载的经典特性升级。接下来,我们就一起来看看,新版本都有哪些重磅革新。

原子化 Slot 迁移

原子化 Slot 迁移,从根本上重塑了 Valkey 集群内节点间数据迁移的方式。

「逐键迁移」的局限

在 Valkey 9.0 之前,数据迁移采用的是「逐键迁移」(key-by-key)的方式。这种方式在大多数场景下都表现良好;但在一些极端情况下,可能导致性能下降,甚至引发运维噩梦;最严重的情况下,还可能造成迁移阻塞或数据丢失。

传统的逐键迁移遵循的是「先移动,后删除」的流程,由此带来了几个关键问题:

  • 当客户端访问一个正处于「部分迁移」状态的 Key 时,可能无法确定该 Key 是位于源节点还是目标节点,从而引发额外的网络跳转和处理开销。
  • 更严重的是:在多键操作中,如果部分 Key 位于源节点、另一部分已迁移到目标节点,Valkey 将无法正确执行该命令;这会迫使客户端不断重试,直到所有相关 Key 都落在同一节点上,造成一种「微型服务中断」——数据明明存在,但在迁移完成前却无法使用。

此外,当 Valkey 尝试迁移一个「巨型 Key」(例如大型 Sorted Set、Set 或 List)时,整个 Key 的体积可能超出目标节点的输入缓冲区限制,导致迁移被阻塞,必须人工干预;解决方法要么是调大缓冲区,要么只能强制分配 Slot 或直接删除 Key——而后者往往意味着数据丢失。

新的原子化 Slot 迁移

在 Valkey 中,所有 Key 被分配到 16384 个 Slot 中,每个节点负责一个或多个 Slot。Valkey 9.0 的革新之处在于:

  • 迁移不再以单个 Key 为单位,而是以整个 Slot 为单位。通过 AOF 格式,将数据原子化地从源节点传输到目标节点;利用 AOF,大型集合会被拆分为单个元素进行传输,而不是作为一个整体发送。这一机制巧妙规避了因巨型 Key 导致的迁移延迟峰值。
  • 新的迁移机制将「先移动,后删除」的逻辑应用在 Slot 层面:源节点会完整保留所有 Key 和数据,一直到整个 Slot 在目标节点上成功重建。这就彻底消除了 Valkey 9.0 之前版本中令人头疼的重定向和重试问题。

哈希字段过期

Hash 数据类型可以将多个字段优雅地组织在同一个 Key 下。但正因如此,在 Valkey 9.0 之前,其过期策略是「全有或全无」——无法为单个字段设置独立的过期时间。

对于要实现「部分数据自动失效」的用户来说,这一限制迫使用户必须采用变通方案,比如拆分成多个 Key。这不仅增加了数据结构的复杂度,也带来了额外的内存开销。

Valkey 9.0 正式填补了这一空白,引入了一整套新命令:

现在,你可以像操作普通 Key 一样,对 Hash 结构中的每个字段进行精确的生命周期管理。

集群模式下的编号数据库

编号数据库(numbered databases)允许你通过独立的键空间隔离数据,避免 Key 命名冲突。这是自 Valkey 诞生之初就存在的经典功能。

  • 然而,在 Valkey 9.0 之前,该功能在集群模式下受到严格限制——仅允许使用0号数据库。这意味着,一旦你启用了编号数据库,就等于放弃了横向扩展到多节点的能力。
  • 基于广泛的用户反馈和开发团队的重新评估,Valkey 9.0 打破了这一限制,全面支持集群模式下的编号数据库。这一变化不仅释放了编号数据库在多租户等场景中的巨大潜力,也为集群架构带来了更多灵活性。

海量性能与功能优化

Valkey 9.0 还带来了大量细致入微的改进和优化:

  • 大型集群达成每秒 10 亿次请求:通过提升大型集群的弹性,Valkey 现已能扩展至 2000 个节点,并实现每秒超 10 亿次请求的处理能力。
  • 管道内存预取:在处理 pipeline 请求时引入内存预取技术,带来高达 40% 的吞吐量提升。
  • 重启已弃用的命令:Valkey 项目重新评估了 25 个曾被弃用的命令,并基于对 API 向后兼容性的考量,恢复了对这些命令的推荐使用。
  • 零拷贝响应:对于大型请求,避免了内部内存拷贝,获得了高达 20% 的吞吐量提升。
  • 多路径 TCP:新增对多路径 TCP 的支持,可将延迟降低 25%。
  • SIMD 用于 BITCOUNT 和 HyperLogLog:利用 SIMD 指令集进行优化,使相关命令的吞吐量提升高达 200%。
  • 地理空间索引支持多边形查询:允许用户通过指定的多边形范围查询地理位置信息。
  • 条件删除:新增DELIFEQ命令,只在 Key 的值与指定值相等时才执行删除操作。
  • CLIENT LIST 过滤:为CLIENT LIST命令提供了丰富的过滤选项,可根据标志、名称、空闲时间、库名/版本、数据库、IP 和能力等条件进行筛选。
赞(0)
分享到

评论 抢沙发