Redis 先成功加载了 base RDB,再读取增量 AOF 时在 offset 61386533 处发现坏格式,所以直接停止加载。Redis 官方文档说明,AOF 尾部损坏时可以用 redis-check-aof 修复;较新的版本也支持通过 aof-load-corrupt-tail-max-size 自动修复一定大小的损坏尾部。 

先判断这个节点是什么角色

修法取决于它是:
1. 从节点 / 副本节点
2. 主节点,但还有健康副本
3. 主节点,而且这份数据是唯一副本

最稳妥的处理原则

情况 A:这是从节点

最简单。
不要优先修 AOF,直接让它全量重同步更省事。

做法:
1. 停掉这个坏节点容器
2. 备份持久化目录
3. 清空这个节点的 AOF / RDB 持久化文件
4. 重新启动
5. 它会从主节点重新同步数据

这是集群里最推荐的修法,因为从节点本来就可以重建。

情况 B:这是主节点,但有健康副本

先把流量和主角色切走,再修这个坏节点。
不要直接在唯一主分片上冒险删数据。

一般顺序是:
1. 确认这个主分片有健康副本
2. 先故障转移,让副本升主
3. 再把坏节点当作新副本重建

情况 C:这是唯一数据副本

那就不能直接删持久化文件。
应该先 备份,再尝试 修复 AOF,最后才考虑忽略坏尾或重建。

推荐操作方案

方案 1:如果它是从节点,直接重建

这是最省事的。

  1. 先备份

假设数据目录挂载在 /data:

cp -a /data/appendonlydir /data/appendonlydir.bak.(date+cp−a/data/dump.rdb/data/dump.rdb.bak.(date +%F-%H%M%S) cp -a /data/dump.rdb /data/dump.rdb.bak.(date+cpa/data/dump.rdb/data/dump.rdb.bak.(date +%F-%H%M%S) 2>/dev/null || true

  1. 停节点

如果是 docker compose:

docker compose stop redis

或者对应容器:

docker stop <redis_container>

  1. 清空持久化文件

只对这个坏节点做:

rm -rf /data/appendonlydir/*
rm -f /data/dump.rdb

  1. 重新启动

docker compose up -d redis

  1. 验证复制状态

redis-cli -p 6379 INFO replication
redis-cli -p 6379 CLUSTER NODES

看它是否重新作为 replica 从主节点同步。

方案 2:如果必须保留这台节点上的数据,修复 AOF

Redis 官方建议先备份,再用 redis-check-aof --fix 修。 

  1. 先备份整个 AOF 目录

cp -a /data/appendonlydir /data/appendonlydir.bak.$(date +%F-%H%M%S)

  1. 找到 manifest 文件

Redis 多部件 AOF 一般会有 manifest 文件,里面会记录 base/incr 文件关系。Redis 的持久化机制会把 AOF 文件和 manifest 放在专门目录中。 

一般类似:

ls -lah /data/appendonlydir

你大概率会看到:
• appendonly.aof.manifest
• appendonly.aof.12.base.rdb
• appendonly.aof.12.incr.aof

  1. 执行修复

进入容器或主机里执行:

redis-check-aof --fix /data/appendonlydir/appendonly.aof.manifest

如果这个版本的工具不接受 manifest,也可以针对坏掉的 incr 文件修:

redis-check-aof --fix /data/appendonlydir/appendonly.aof.12.incr.aof

修完后重启 Redis。

  1. 重启并检查

docker restart <redis_container>

然后:

redis-cli -p 6379 PING
redis-cli -p 6379 INFO persistence
redis-cli -p 6379 CLUSTER NODES

方案 3:允许忽略坏掉的尾部

你的日志已经给了明确建议:

aof-load-corrupt-tail-max-size 4889244

这个参数是 Redis 新版本增加的,用来在启动时自动修复一定大小的损坏尾部。 

适合场景:
• 你能接受丢失最后一小段写入
• 想尽快把节点拉起来

配置方式

在 redis.conf 加:

aof-load-corrupt-tail-max-size 4889244

然后重启。

风险

会丢失损坏尾部那一小段还没完整落盘的数据。

所以:
• 测试环境可以直接用
• 生产环境先备份再用

集群环境下,我建议你按这个优先级处理

最优先:如果它是 replica

直接删本地持久化,重建同步。

这是最干净、最快的方案。

次优先:如果它是 master 但有副本

先切主,再把这个坏节点重建为副本。

最后:如果它是唯一数据源

先修 AOF,再尝试容忍坏尾。

别忽略这个警告

你前面的日志还有:

vm.overcommit_memory = 1

建议在宿主机设置:

sysctl vm.overcommit_memory=1

永久生效可写入 /etc/sysctl.conf:

vm.overcommit_memory = 1

然后:

sysctl -p

这不是本次 AOF 损坏的直接原因,但 Redis 官方明确建议开启,否则后台保存或复制可能失败。 

一个实战判断标准

能直接重建的情况

满足任一条就倾向重建:
• 这是从节点
• 这是无状态搜索缓存节点
• 集群里同分片还有健康副本
• 业务允许这台节点重新同步

必须修复的情况

满足任一条就先修:
• 这是主节点且没有健康副本
• 这台节点有独占数据
• 不能承受最近写入丢失

你现在最该先执行的命令

先看它是不是副本:

redis-cli -p 6379 INFO replication
redis-cli -p 6379 CLUSTER NODES

如果已经起不来,就去其他集群节点执行:

redis-cli -c -h <其他健康节点IP> -p 6379 CLUSTER NODES

看这个坏节点对应的是 master 还是 slave/replica,以及它所属分片有没有别的健康副本。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐