如何安全关闭Redis避免数据丢失?CentOS下实现方案咨询
解决方案:Redis持久化与CentOS关机前强制持久化脚本
一、Redis自身持久化配置优化
Redis默认支持两种持久化机制,合理配置可大幅降低数据丢失风险:
RDB快照持久化
- 默认配置下,Redis会在满足以下条件时自动生成RDB快照:
save 900 1:900秒内至少1个键被修改save 300 10:300秒内至少10个键被修改save 60 10000:60秒内至少10000个键被修改
- 你可在
/etc/redis/redis.conf中调整规则,比如添加save 60 1(60秒内有1个键修改就触发快照),适配长脚本的高频更新场景。 - 注意:正常执行
shutdown命令关机时,Redis默认会自动执行一次RDB快照,但强制断电、内核panic等异常场景无法覆盖。
- 默认配置下,Redis会在满足以下条件时自动生成RDB快照:
AOF追加文件持久化
- 开启AOF后,Redis会将每个写命令追加到AOF文件,重启时可通过重放命令恢复数据,可靠性优于RDB。
- 修改
redis.conf配置:- 将
appendonly no改为appendonly yes - 配置
appendfsync参数:appendfsync always:每个写命令立即刷盘,最可靠但性能略有损耗appendfsync everysec:每秒刷盘一次,平衡性能与可靠性(推荐)appendfsync no:由操作系统决定刷盘时机,性能最高但风险大
- 将
二、CentOS关机前强制执行Redis持久化脚本
若要确保除直接断电外的所有关机/重启场景都触发持久化,可通过systemd服务实现:
步骤1:创建持久化脚本
创建/usr/local/bin/redis-shutdown-persist.sh,内容如下:
#!/bin/bash # 执行Redis同步持久化命令 redis-cli SAVE # 等待持久化操作完成(确保数据写入磁盘) sleep 2
给脚本添加执行权限:
chmod +x /usr/local/bin/redis-shutdown-persist.sh
步骤2:创建systemd服务文件
创建/etc/systemd/system/redis-persist-on-shutdown.service,内容如下:
[Unit] Description=Redis Persist on Shutdown DefaultDependencies=no Before=shutdown.target reboot.target halt.target [Service] Type=oneshot ExecStart=/usr/local/bin/redis-shutdown-persist.sh [Install] WantedBy=shutdown.target reboot.target halt.target
步骤3:启用并加载服务
systemctl daemon-reload systemctl enable redis-persist-on-shutdown.service
该服务会在系统关机、重启、halt时优先执行Redis的SAVE命令,确保最后一步数据被持久化。
三、额外建议
- 长脚本运行过程中,可在关键步骤完成后主动调用
redis-cli BGSAVE(后台异步持久化,不阻塞脚本执行),进一步降低数据丢失风险。 - 定期检查Redis持久化文件(RDB的
dump.rdb、AOF的appendonly.aof)的生成情况,确保Redis进程拥有读写权限。 - 针对突然断电的极端场景,可搭配UPS电源,结合AOF的
everysec配置,将数据丢失窗口控制在1秒内。
内容的提问来源于stack exchange,提问作者Steve Moretz
相关产品推荐
相关产品推荐

