`

Redis被bgsave和bgrewriteaof阻塞的解决方法

 
阅读更多

Redis 是一个性能非常高效的内存 Key-Value 存储服务, 同时它还具有两个非常重要的特性: 1. 持久化; 2. Value 数据结构. 这两个特性让它在不少场景轻松击败了 Memcached 和 Casandra 等.

Redis 的持久化在两种方式: Snapshotting(快照) 和 Append-only file(aof). 在一个采用了 aof 模式的 Redis 服务器上, 当执行 bgrewriteaof 对 aof 进行归并优化时, 出现了 Redis 被阻塞的问题, 此时, Redis 无法提供任何读取和写入操作.

按字面理解, bgrewriteaof 是在后台进行操作, 不应该影响 Redis 的正常服务. 原理也确实是这样的, Redis 首先 fork 一个子进程, 并在该子进程里进行归并和写持久化存储设备(如硬盘)的. 按照正常逻辑, 在一台多核的机器上, 即使子进程占满 CPU 和硬盘, 也不应该导致 Redis 服务阻塞啊!

其实, 问题就出在硬盘上.

Redis 服务设置了 appendfsync everysec, 主进程每秒钟便会调用 fsync(), 要求内核将数据”确实”写到存储硬件里. 但由于子进程同时也在写硬盘, 从而导致主进程 fsync()/write() 操作被阻塞, 最终导致 Redis 主进程阻塞了.

解决方法便是设置 no-appendfsync-on-rewrite yes, 在子进程处理和写硬盘时, 主进程不调用 fsync() 操作. 注意, 即使进程不调用 fsync(), 系统内核也会根据自己的算法在适当的时机将数据写到硬盘(Linux 默认最长不超过 30 秒).

分享到:
评论

相关推荐

    Redis源码解析

    Redis通过`BGSAVE`和`BGREWRITEAOF`后台进程实现持久化操作,避免阻塞主线程。 5. **复制** Redis的主从复制功能允许创建多个副本,提高可用性和读取性能。复制过程中,主服务器会向从服务器发送增量的命令流,...

    phpredis中文手册.pdf

    服务器相关命令包括 `BGREWRITEAOF` 重写 AOF 文件,`BGSAVE` 定时保存数据到磁盘,`LASTSAVE` 查询最近一次保存时间,`INFO` 获取服务器信息,`CONFIG` 配置服务器参数。 ### 其他操作 `SORT` 可以对列表、集合或...

    从源码解读redis持久化

    为了解决这个问题,Redis提供了两种主要的持久化机制:RDB(Redis Database Backup,快照持久化)和AOF(Append Only File,日志持久化)。 ### RDB持久化 RDB是通过创建数据的快照来实现持久化。Redis提供了`SAVE...

    redis 整库复制备份说明 包含所有直接按照教程备份下来

    为了自动化备份过程,可以编写脚本结合Redis的`BGSAVE`命令和`rsync`,设置定时任务(如Linux的`cron`)来定期执行。同时,考虑设置多点备份和版本管理,以防止单点故障。 5. 数据恢复: 当需要恢复数据时,停止...

    Redis运维重建命令

    - `BGSAVE`命令:为了避免`SAVE`命令的阻塞,Redis提供了后台持久化`BGSAVE`,它会在后台线程中生成RDB文件。 - `RESTORE`命令:用于从RDB文件中恢复数据,例如`RESTORE key ttl payload`,`payload`是RDB数据的二...

    redis简介.docx

    Redis 采用的是非阻塞I/O复用模型,例如select、poll和epoll等机制,使得它能够在等待I/O操作完成的同时处理其他客户端请求,进一步提高了响应速度。例如,epoll的边缘触发模式能够实现零拷贝,显著提升了网络I/O...

    redis收藏redis收藏

    RDB 的生成可通过配置触发(如 `Save` 配置项)或手动命令 `bgsave`(非阻塞,推荐使用)和 `save`(阻塞,不建议在生产环境中使用)。RDB 在生成快照时,Redis 使用子进程处理,确保主线程不受影响。这种方式启动...

    redis持久化

    - `SAVE`:此命令会阻塞Redis服务器直到RDB快照文件创建完成,期间所有客户端请求会被挂起。 - `BGSAVE`:此命令在后台异步执行,不会阻塞客户端请求。 - **自动快照**:根据`save`指令定义的规则自动触发。 ####...

    Redis高级特性解析:持久化、主从复制与哨兵机制全面探讨

    `save` 命令会阻塞服务,而 `bgsave` 命令则是非阻塞的,利用写时复制 (Copy-On-Write, COW) 技术生成快照,避免对主进程的影响。 AOF 持久化记录每次写操作,保证了数据的强一致性,但文件体积可能会较大。AOF ...

    redis常用命令用法实例(超详细)

    Redis支持五种基本数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。 - 字符串(String):`SET key value` 设置键值,`GET key` 获取值,`INCR key` 对整数值进行自增1。 - ...

    Redis持久化RDB和AOF区别详解

    2. `bgsave`命令:这是异步操作,Redis通过`fork()`创建子进程来生成RDB文件,主进程继续处理客户端请求,避免阻塞服务。但是`fork()`操作可能导致短暂的内存双倍占用。 3. 自动保存:Redis配置文件中可以通过`save`...

    内存型数据库Redis持久化小结

    - `BGSAVE`:为了解决`SAVE`命令的阻塞问题,Redis引入了后台保存(BGSAVE)。该命令会创建一个子进程,由子进程完成快照操作,主线程则继续处理命令请求。然而,子进程的创建和内存拷贝会消耗一定资源,特别是在...

    Redis –持久化

    `SAVE`会阻塞Redis主进程,而`BGSAVE`会创建子进程执行快照,减少对服务的影响。 RDB的优点包括: - 对性能影响较小,因为数据持久化在子进程中完成。 - 可以生成多个时间点的快照,便于灾难恢复。 - 恢复速度快于...

    分布式缓存.pdf

    ### 分布式缓存——基于Redis集群解决单机Redis存在的问题 #### 一、Redis持久化 Redis提供了两种持久化方案来确保数据的安全性:**RDB持久化**和**AOF持久化**。 ##### 1.1 RDB持久化 RDB全称**Redis Database ...

    Redis的持久化方案详解

    本文将详细介绍Redis的两种主要持久化机制:RDB(Redis Database Backup)和AOF(Append Only File)。 **RDB持久化** RDB持久化通过创建数据库在特定时间点的完整快照来实现。这种快照是经过压缩的二进制文件,...

    Redis两种持久化方案RDB和AOF详解

    2. 使用`save`命令(阻塞式,会暂停Redis服务直到快照完成)或`bgsave`命令(异步执行,不会阻塞服务)。 3. `flushall`命令会清空所有数据,但在实际应用中并不常用。 4. `shutdown`命令在正常关闭Redis时会保存RDB...

Global site tag (gtag.js) - Google Analytics