因为Redis副本节点内核级禁止任何修改数据状态的操作,bgsave虽不改数据但被归类为禁用命令,必须由主节点生成RDB后由副本拉取备份。

为什么不能直接在只读副本上运行 bgsave
Redis 的只读副本(replica)默认禁止执行 bgsave,触发会直接报错:ERR Replica instance can't execute commands that modify the dataset。这不是权限配置问题,而是 Redis 内核级限制:副本节点不允许任何可能修改数据状态的操作(包括生成 RDB 文件),哪怕该操作本身不改数据。所以即使你用 redis-cli -h replica-ip bgsave,也会失败。
正确做法:用主节点生成 RDB,再从副本拉取文件
备份动作必须由主节点发起,但备份文件可以存到副本所在机器——关键是避免让副本“主动写”,而是让它“被动接收”。实操分三步:
- 在主节点定时执行
bgsave(例如通过crontab每小时一次) - 主节点的 RDB 文件路径由
dir和dbfilename配置决定(如/var/lib/redis/dump.rdb) - 在副本节点上,用
rsync或scp定时拉取该文件,并重命名带时间戳(如dump_202609060300.rdb)
示例脚本片段(放在副本机上):
#!/bin/bash
MASTER_IP="192.168.1.10"
RDB_SRC="/var/lib/redis/dump.rdb"
RDB_DST="/backup/redis/"
DATE=$(date +\%Y\%m\%d\%H\%M)
rsync -avz --delete $MASTER_IP:$RDB_SRC $RDB_DST/dump_${DATE}.rdb
注意:rsync 需提前配置好免密 SSH,且主节点的 sshd 允许读取 dir 目录下的文件(必要时调整目录权限或用专用备份用户)。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
如果主节点不允许远程读取 RDB 文件怎么办?
常见于安全策略严格环境(如主节点禁用 SSH、RDB 目录权限为 redis:redis 600)。这时需换路径:
- 改用主节点上的
save命令(仅限低峰期、小数据量),配合inotifywait监听dump.rdb修改事件,一生成就立刻scp出去 - 或让主节点把 RDB 复制到共享存储(如 NFS)、对象存储(如 S3)或本地临时目录(
/tmp/,权限设为755),再由副本拉取 - 绝对不要在副本上启用
replica-read-only no来绕过限制——这会让副本变成可写,破坏复制一致性,且下次同步会丢数据
备份验证和清理不能省略
只拉文件不校验等于没备份。每次拉取后务必做两件事:
- 用
redis-check-rdb检查文件完整性:redis-check-rdb /backup/redis/dump_202609060300.rdb > /dev/null || echo "corrupted" - 按保留策略清理旧文件,例如只留最近 7 天:
find /backup/redis/ -name "dump_*.rdb" -mtime +7 -delete
最容易被忽略的是:副本节点的磁盘空间监控。RDB 文件体积接近内存占用,若副本磁盘比主节点小,或未定期清理,备份任务会在某天静默失败——日志里只有 “No space left on device”,而 crontab 不报错。

















