Redis如何处理只读文件系统引发的崩溃_在持久化失败时利用stop-writes-on-bgsave-error停写保护

云浩吖_8616

云浩吖_8616

2026-03-29

409人浏览

原创

redis 持久化失败时崩溃本质是只读文件系统叠加配置限制所致,并非 bgsave 失败直接触发;默认 stop-writes-on-bgsave-error yes 会拒绝写入但不退出,仅当 aof 重写也失败且磁盘彻底只读时才主动退出。

redis如何处理只读文件系统引发的崩溃_在持久化失败时利用stop-writes-on-bgsave-error停写保护

Redis 持久化失败时为什么直接崩溃而不是降级?

因为 bgsave 失败本身不触发崩溃,真正让 Redis 退出的是后续写入——当 stop-writes-on-bgsave-error yes(默认)且上一次 bgsave 出错后,任何写命令都会被拒绝并返回错误,但进程仍在运行;只有当你同时启用了 appendonly yes 且 aof-rewrite 也失败、再叠加磁盘彻底只读(比如挂载为 ro),才可能观察到 Redis 主动退出。常见现象是日志里反复出现 Can't save in background: fork: Cannot allocate memory 或 Failed to open the temp AOF file: Permission denied,接着写请求全返回 ERR Error: write commands not allowed when used with read-only filesystem。

如何确认是不是只读文件系统导致的持久化失败

别猜,直接查三件事:

  • 运行 mount | grep $(dirname $(redis-cli config get dir | awk '{print $2}')),看输出里有没有 ro
  • 检查 dir 配置路径的权限:ls -ld <code>/var/lib/redis,确认 Redis 进程 uid(通常是 redis)有写权限
  • 手动模拟写入:sudo -u redis touch /var/lib/redis/test-write,如果报 Read-only file system,就是它了

stop-writes-on-bgsave-error 设为 no 真的安全吗?

不安全,只是把问题藏得更深。设为 no 后,即使 bgsave 连续失败十次,Redis 仍允许写入,RDB 文件却一直没更新。一旦重启,数据就倒退回上次成功的快照——你可能丢了最近几小时的变更。更麻烦的是,AOF 如果也因同个只读路径失败,appendfsync always 会卡住写入线程,导致响应延迟飙升。所以这不是“开关一关就没事”,而是“从立刻报警变成静默丢数据”。

只读文件系统下还能做哪些有限保护

核心思路:不让 Redis 试图写任何东西。

  • 把 save 配置全清空,例如注释掉所有 save 900 1 类行,避免定时触发 bgsave
  • 关闭 AOF:appendonly no,否则 bgrewriteaof 一样会失败并可能阻塞
  • 确保 dir 指向一个可写的临时路径(哪怕只是 /tmp/redis),哪怕只是用于 pidfile 和 socket
  • 监控必须跟上:用 redis-cli info Persistence | grep rdb_last_bgsave_status 检查是否一直是 err

最棘手的其实是容器或 systemd 场景下,/var/lib/redis 被 bind mount 成只读——这时候改配置不如修挂载参数,因为 Redis 自己根本没法绕过内核的只读限制。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

2860

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

249

24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

969

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

2920

5

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4158

6

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4509

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4055

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7512

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.8万人学习