Redis----AOF持久化

本文详细介绍了Redis的AOF(Append Only File)持久化机制,包括AOF的开启配置、实现方式、载入和数据还原、重写过程以及优缺点。AOF通过保存服务器执行的写命令记录数据库状态,提供了比RDB更高的数据安全性,但也可能导致文件体积较大。AOF重写用于减少文件大小,使用子进程进行以避免阻塞主线程。在Redis重启时,会优先加载AOF文件来恢复数据。

参考博客:https://www.cnblogs.com/ysocean/p/9114267.html
这个博客总结的不错,在他的基础上稍加改动

一、什么是AOF持久化

        除了RDB持久化之外,Redis还支持AOF持久化功能。与RDB持久化通过保存数据库中的键值对记录数据库状态不同,AOF通过保存服务器所执行的写命令来记录数据库状态。

二、AOF配置开启

Redis.conf文件配置
在这里插入图片描述

  • appendonly:默认值为no,redis 默认使用的是rdb方式持久化,开启 AOF 持久化方式,需将 appendonly 修改为 yes。

  • appendfilename :aof文件名,默认是"appendonly.aof"

  • appendfsync:aof持久化策略的配置;先缓存再写入,以下的写入代表缓存,同步代表写入
            always表示服务器在每个事件循环都要将aof_buf缓存区中的所有内容写入AOF文件中,并且同步AOF文件,以保证数据同步到磁盘,效率最低,但是安全性最高;
            everysec表示服务器在每个事件循环都要将aof_buf缓存区中的所有内容写入AOF文件中,每秒执行一次同步AOF文件。可能会导致丢失这1s数据。通常选择 everysec ,兼顾安全性和效率。
            no表示服务器在每个事件循环都要将aof_buf缓存区中的所有内容写入AOF文件中,但是何时对AOF文件进行同步,由操作系统控制决定,速度最快,但是不太安全;

三、AOF持久化的实现

通过redis.conf文件的配置appendonly,打开AOF的持久化过程。
通过通过redis.conf文件的配置appendfsync,实现持久化的不同方式
appendfsync:aof持久化策略的配置;先缓存再写入,以下的写入代表缓存,同步代表写入

  •         always表示服务器在每个事件循环都要将aof_buf缓存区中的所有内容写入AOF文件中,并且同步AOF文件,以保证数据同步到磁盘,效率最低,但是安全性最高;
  •         everysec表示服务器在每个事件循环都要将aof_buf缓存区中的所有内容写入AOF文件中,每秒执行一次同步AOF文件。可能会导致丢失这1s数据。通常选择 everysec ,兼顾安全性和效率。
  •         no表示服务器在每个事件循环都要将aof_buf缓存区中的所有内容写入AOF文件中,但是何时对AOF文件进行同步,由操作系统控制决定,速度最快,但是不太安全;

四、AOF的载入和数据还原

重启 Redis 之后就会进行 AOF 文件的载入。

异常修复命令:redis-check-aof --fix 进行修复

五、AOF重写

        当文件过大时,占用服务器内存越大以及 AOF 恢复要求时间越长,需要重写AOF文件:
        AOF 文件重写并不是对原文件进行重新整理,而是从数据库读取现在的键值对,用一条命令去记录键值对代替之前记录这个键值对的多条命令,这就是AOF重写的实现原理。
       我们知道 Redis 是单线程工作,如果 重写 AOF 需要比较长的时间,那么在重写 AOF 期间,Redis将长时间无法处理其他的命令,这显然是不能忍受的。Redis为了克服这个问题,解决办法是将 AOF 重写程序放到子程序中进行,这样有两个好处:

①、子进程进行 AOF 重写期间,服务器进程(父进程)可以继续处理其他命令。

②、子进程带有父进程的数据副本,使用子进程而不是线程,可以在避免使用锁的情况下,保证数据的安全性。

使用子进程解决了上面的问题,但是新问题也产生了:因为子进程在进行 AOF 重写期间,服务器进程依然在处理其它命令,这新的命令有可能也对数据库进行了修改操作,使得当前数据库状态和重写后的 AOF 文件状态不一致。

为了解决这个数据状态不一致的问题,Redis 服务器设置了一个 AOF 重写缓冲区,这个缓冲区是在创建子进程后开始使用,当Redis服务器执行一个写命令之后,就会将这个写命令也发送到 AOF 重写缓冲区。当子进程完成 AOF 重写之后,就会给父进程发送一个信号,父进程接收此信号后,就会调用函数将 AOF 重写缓冲区的内容都写到新的 AOF 文件中。

这样将 AOF 重写对服务器造成的影响降到了最低。

五、AOF优缺点

优点:

①、AOF 持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,Redis 最多也就丢失 1 秒的数据而已。

②、AOF 文件使用 Redis 命令追加的形式来构造,因此,即使 Redis 只能向 AOF 文件写入命令的片断,使用 redis-check-aof 工具也很容易修正 AOF 文件。

③、AOF 文件的格式可读性较强,这也为使用者提供了更灵活的处理方式。例如,如果我们不小心错用了 FLUSHALL 命令,在重写还没进行时,我们可以手工将最后的 FLUSHALL 命令去掉,然后再使用 AOF 来恢复数据。

缺点:

①、对于具有相同数据的的 Redis,AOF 文件通常会比 RDF 文件体积更大。

②、虽然 AOF 提供了多种同步的频率,默认情况下,每秒同步一次的频率也具有较高的性能。但在 Redis 的负载较高时,RDB 比 AOF 具好更好的性能保证。

③、RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,因此从理论上说,RDB 比 AOF 方式更健壮。官方文档也指出,AOF 的确也存在一些 BUG,这些 BUG 在 RDB 没有存在。

那么对于 AOF 和 RDB 两种持久化方式,我们应该如何选择呢?

如果可以忍受一小段时间内数据的丢失,毫无疑问使用 RDB 是最好的,定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,而且使用 RDB 还可以避免 AOF 一些隐藏的 bug;否则就使用 AOF 重写。但是一般情况下建议不要单独使用某一种持久化机制,而是应该两种一起用,在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。Redis后期官方可能都有将两种持久化方式整合为一种持久化模型。

PS:经过验证,在Redis 5.0.5版本中,如果同时开启RDB和AOF进行持久化,在重启Redis时,只会加载AOF文件!!!

Redis 提供了一系列工具和脚本以帮助用户更好地进行安装、测试、维护和性能评估。以下是对提到的工具和脚本的详细说明及其使用方式: ### `mkreleasehdr.sh` 脚本 `mkreleasehdr.sh` 是 Redis 源码构建过程中使用的一个脚本,主要负责生成版本头文件。它会根据 Git 仓库的信息生成 `version.h` 文件,该文件包含了当前 Redis 的版本号、Git 提交哈希值等元数据信息。这个脚本通常在 Redis 编译过程中自动运行,开发者无需手动调用它。如果手动需要运行,可以执行以下命令: ```bash ./mkreleasehdr.sh ``` 此脚本确保了 Redis 版本信息的动态生成,方便在不同环境中进行版本追踪和调试。 ### `redis-benchmark`:基准性能测试工具 `redis-benchmark` 是 Redis 自带的性能测试工具,用于评估 Redis 服务器的吞吐量、延迟等关键性能指标。它支持多种测试模式和选项,例如并发连接数、请求类型等。例如,测试本地 Redis 服务器的性能可以使用以下命令: ```bash redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 10000 ``` 其中 `-h` 指定服务器地址,`-p` 指定端口,`-c` 表示并发客户端数量,`-n` 表示请求数量。该工具特别适用于在部署前评估 Redis 的性能瓶颈或在调试时验证配置更改的影响[^3]。 ### `redis-check-aof`:AOF 持久化文件修复工具 `redis-check-aof` 用于检查和修复 RedisAOF(Append-Only File)持久化文件。如果 Redis 因为异常关闭而导致 AOF 文件损坏,可以使用该工具进行恢复。例如: ```bash redis-check-aof appendonly.aof ``` 如果发现文件损坏,可以使用 `--fix` 选项进行修复: ```bash redis-check-aof --fix appendonly.aof ``` 该工具能够确保 AOF 文件的完整性,避免数据丢失或服务中断。 ### `redis-cli`:命令行客户端工具 `redis-cli` 是 Redis 的命令行客户端工具,用于与 Redis 服务器交互。它支持多种命令,例如设置键值对、查询数据、管理服务器配置等。例如,连接本地 Redis 服务器并设置一个键值对: ```bash redis-cli 127.0.0.1:6379> SET mykey "Hello Redis" OK 127.0.0.1:6379> GET mykey "Hello Redis" ``` 此外,`redis-cli` 还支持集群管理、哨兵模式配置等高级功能,是日常运维和调试的核心工具。 ### `redis-server`:启动 Redis 服务器 `redis-server` 是启动 Redis 服务器的主程序。默认情况下,它会读取配置文件(通常是 `redis.conf`)来启动实例。例如: ```bash redis-server /path/to/redis.conf ``` 配置文件中可以定义端口、持久化策略、日志路径等参数。如果需要启动多个 Redis 实例,可以通过不同的配置文件指定不同的端口和数据目录。 ### 工具常见问题及解决方案 1. **`redis-benchmark` 测试结果不准确** 可能由于网络延迟或服务器负载过高导致。建议在本地环境中进行测试,并确保服务器资源充足。 2. **`redis-check-aof` 无法修复文件** 如果 AOF 文件损坏严重,可能需要依赖备份文件进行恢复。建议定期备份 AOF 文件以防止数据丢失。 3. **`redis-cli` 无法连接服务器** 检查 Redis 服务器是否正在运行,以及防火墙是否允许相应端口通信。可以使用 `redis-cli ping` 命令测试连接状态。 4. **`redis-server` 启动失败** 检查配置文件中的参数是否正确,尤其是端口是否被占用、日志路径是否存在。可以通过查看日志文件定位问题。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值