从 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 门的恢复演练就是这么做的)。
推荐流程
- 备份:干净关机(或
BGSAVE+ 拷贝),然后拷贝数据目录。 - 停 4.1.1。用 5.0 二进制在同一目录同一配置上启动。
- 验证:
INFO persistence(aof 开启、rewrite 正常推进)、DBSIZE对预期、你自己应用的 smoke。 - 如需回滚:干净停掉 5.0,用 4.1.1 在同一目录上启动。