kevy
本页内容

从 4.x 升级到 5.0

一句话版本:停掉 4.1.1,用 5.0 二进制在同一数据目录上启动。 无需改配置;5.0 的发布门在每次 tag 前都会真实重放这套流程 (双向切换 + 备份拷贝冷恢复)。

原样延续的部分

  • 数据文件。 5.0 直接打开 4.1.1 的数据目录:AOF(v1 与 v2 记录 格式)、快照、shards.meta、segment 目录。v1 时代的 AOF 继续以 v1 追加,直到第一次 rewrite 把它升级成带校验的 v2 封装——与 4.1 行为一致。
  • 降级窗口。 4.1.1 二进制可以重新打开被 5.0 写过的数据目录 (升级门就测这个往返)。切换任一方向前请干净关机。
  • 配置文件与旗标。 所有 4.x 键照常接受。零配置启动 (--port + --dir)行为完全一致。
  • 线协议与客户端契约。 本版本没有移除或改型任何 RESP 表面。

行为变化

AOF 写离开 reactor 线程(io_uring,默认开)

Linux 上 io_uring 可用时,appendfsync everysec(或 no)的 AOF 追加改为排队到分片自己的 ring 上,不再在 reactor 线程同步写。这是 本版本尾延迟头条背后的改动;耐久语义不变(everysec 的崩溃窗口 仍 ≤ 1 秒,crash 门双模式验证)。

  • KEVY_AOF_OFFLOAD=0 恢复 4.x 同步路径。
  • appendfsync always 按语义保持同步路径。
  • epoll reactor(无 io_uring 的内核)保持 4.x 路径。

持续写压下的 rewrite 改为顺延而非停顿

4.x 在增长规则触发时就跑 AOF rewrite,磁盘要多少停顿就付多少—— 重摄入下即多秒级的服务器停顿。5.0 会测量 rewrite 能否收敛 (追加速率 vs rewrite 自身进度),证明收敛不了时顺延:日志继续 增长,服务器继续应答,rewrite 在下一个增长因子后重试(显式 BGREWRITEAOF 永不受限)。持续饱和下预期 AOF 临时变大——这是 交换项,而且是诚实的那个:磁盘可退,停顿不可退。

AOF 旁边的新家务文件

rewrite 期间与之后可能短暂看到 <aof>.rewrite(构建中的镜像)与 <aof>.trashN(让 swap 把旧日志的 GB 级释放挪到线程外的硬链接)。 两者都自动清理;崩溃留下的孤儿由下一次 rewrite 回收。不要备份 它们;备份 = 数据目录减去 *.rewrite / *.trash*——或者更简单, 整目录拷贝,5.0 启动时自会处理(disk 门的恢复演练就是这么做的)。

推荐流程

  1. 备份:干净关机(或 BGSAVE + 拷贝),然后拷贝数据目录。
  2. 停 4.1.1。用 5.0 二进制在同一目录同一配置上启动。
  3. 验证:INFO persistence(aof 开启、rewrite 正常推进)、 DBSIZE 对预期、你自己应用的 smoke。
  4. 如需回滚:干净停掉 5.0,用 4.1.1 在同一目录上启动。