redis-AOF持久化机制
AOF,Appedn Only File,指Redis将每一次的写操作都以日志的形式记录到一个AOF文件中的持久化技术。
当需要恢复内存数据时,只这些写操作重新执行一次就可以将之前的内存数据恢复。
AOF配置
开启AOF配置
方式1:
直接进入redis.conf文件中修改appendonly配置为yes
方式2:redis客户端中配置
进入reids.conf文件中查看是否已经修改
已经修改。
配置解析
appendfilename配置
配置含义:
appendfilename 是AOF多文件体系的“基础名称”,所有AOF文件均以该名称为前缀,通过后缀区分类型和序列,默认值为"appendonly.aof"。
Redis 7重构了AOF持久化机制,将单一AOF文件拆分为三组文件,以提升持久化效率和数据恢复速度。注释中明确了这三组文件的类型及作用。
appenddirname配置
配置含义:
appenddirname是AOF多文件体系的存储目录配置,默认值是“appendonlydir”。
appendfsync配置(重要)
配置含义:
appendfsync配置的核心作用是控制操作系统页缓存中的写操作保存到磁盘上的AOF文件中的频率,也就是fsync的频率,直接影响数据持久性(Data Durability)和性能(Performance)的权衡。它可以设置三种模式。
everysec是Redis推荐的默认值,最多丢失1秒的写入数据,满足大多数业务的“可接受损失”阈值,每秒一次的fsync()对主进程的影响极小(后台线程处理),不会显著降低Redis的吞吐量。
简单流程说明:
AOF缓冲区和操作系统页缓存的区别
AOF缓冲区是 Redis 内部维护的一个内存缓冲区,用于暂存客户端写操作命令。每当执行一个写命令(如 SET key value),该命令就会被追加到这个缓冲区中。
操作系统页缓存是 Linux 操作系统内核为提高 I/O 性能而提供的机制,用于缓存文件内容(包括 AOF 文件)。当 Redis 将数据写入 AOF 文件时,实际是写入了操作系统的页缓存,而不是直接写入磁盘。
no-appendfsync-on-rewrite配置
配置含义:
在子线程操作(如BGREWRITEAOF、BGSAVE)期间,是否暂时禁用主进程的fsync()调用,以避免磁盘IO冲突导致的主进程阻塞,默认是no,也就是不禁用。设为yes时: 当BGREWRITEAOF或BGSAVE正在执行时,主进程暂停调用fsync()(无论appendfsync设置为everysec还是always)。此时,AOF缓冲区的数据将由操作系统的缓存策略决定何时刷到磁盘(等同于appendfsync no的效果)。高并发场景下推荐设置为yes,缓解阻塞;需要保证数据安全的场景下,推荐设置为no,安全优先。
aof-rewrite-incremental-fsync配置
配置含义:是否启用AOF重写过程中的增量fsync操作,默认是yes,也就是启用。
当执行bgrewriteaof操作时,每当操作系统页缓存中生成4MB文件时,子进程会调用一次fsync操作,避免由于单次fsync操作数据量过大而引起长时间的阻塞。推荐开启该配置。
aof-timestamp-enabled配置
配置含义:
aof-timestamp-enabled作用是为AOF文件中的命令添加时间戳,支持“点-in-time恢复(Point-in-Time Recovery, PITR)”,但需权衡格式兼容性。默认值为no,也就是不开启。
aof-load-truncated配置
配置含义:
控制 Redis 在启动时如何处理被截断(truncated)的 AOF 文件。当设置为 yes 时,如果 Redis 发现 AOF 文件在末尾被截断(即文件不完整),它会尝试加载尽可能多的数据。然后启动服务器,并记录一条日志通知用户发生了截断事件;当设置为 no 时,Redis 会拒绝启动并报错,要求用户使用 redis-check-aof 工具修复 AOF 文件后再重启。
AOF文件被截断的原因
操作系统崩溃(如电源故障、内核 panic)。
文件系统挂载时未启用 data=ordered 选项(例如 ext4 文件系统)。
磁盘空间不足导致写入中断。
注意:这种情况通常发生在操作系统层面的问题,而不是 Redis 自身崩溃。如果 Redis 自身崩溃但操作系统正常运行,则不会发生此问题。
补充说明:
如果 AOF 文件中间损坏(不是只在末尾截断),无论 aof-load-truncated 如何设置,Redis 都会拒绝加载并报错。
建议定期备份 AOF 文件,并使用 redis-check-aof 工具检查文件完整性。
redis-check-aof工具的使用
rewrite机制
随着使用时间的推移,AOF文件会越来越大,为了防止AOF文件由于太大而占用大量磁盘空间,降低性能,Redis引入了rewrite机制来对AOF文件进行压缩。
1.Rewrite
Rewrite其实是对AOF文件进行重新整理。当Rewrite开启后,主进程会fork(创建)出一个子进程去执行bgrewriteaof命令,由该子进程完成rewrite过程。它首先会对现有AOF文件进行rewrite计算,将计算结果写入到一个临时文件(这个临时文件在操作系统页缓存中),写入完毕后,再rename该临时文件为原AOF文件名,覆盖原有文件。在子进程生成临时文件的同时,主进程继续处理客户端请求,将新的写操作追加到原AOF文件(保证数据不丢失)和AOF缓冲区(记录子进程启动后的增量操作)。子进程完成临时文件的生成后,主进程将AOF缓冲区的增量操作追加到临时文件(确保新文件包含子进程启动后的所有修改),然后替换原AOF文件,然后删除旧的AOF文件。
2.rewrite计算
rewrite计算也称为rewrite策略,rewrite计算遵循以下策略:
- 读操作命令不写入文件
- 无效命令不写入文件
- 过期数据不写入文件
- 多条命令合并写入文件
3.开启rewrite机制
- 方式1:通过手动命令开启
- 方式2:通过配置设置自动开启
配置含义:
auto-aof-rewrite-percentage,指定AOF文件增长比例阈值,默认值是100,也就是说当当前AOF文件大小 > 基准大小 × (1 + 100%)时,触发重写,基准大小指上一次执行rewrite过后AOF文件的大小,如果之前没有执行过rewrite,以redis启动后AOF文件大小为准;若设为0,则禁用自动重写(需手动调用BGREWRITEAOF)。
auto-aof-rewrite-min-size,指定AOF文件的最小重写阈值(单位:字节/MB/GB)。默认值是64mb(即AOF文件大小至少达到64MB时,才会考虑重写),它的作用是避免文件过小但增长比例达标的情况(如1MB→2MB,增长100%但文件仍很小,无需重写),减少不必要的IO和CPU开销。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922068.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!