Redis - 持久化-AOF

本文深入探讨Redis的AOF持久化机制,包括AOF文件的工作原理、配置选项、重写机制及优缺点。通过实例演示AOF文件的备份、修复与恢复过程。

【1】AOF简介

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录)。只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据。

换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF保存的是appendonly.aof文件。

与RDB做对比,AOF文件更大,但是安全更高。


【2】APPEND ONLY MODE

配置文件如下:

这里写图片描述


将其开启:

这里写图片描述


测试appendonly.aof数据备份与恢复

① 删除掉/usr/local/bin目录下的rdb文件与aof文件后重启redis

这里写图片描述


② 进行四个写操作,然后查看aof文件与rdb文件

这里写图片描述


③ 查看aof文件信息如下:

这里写图片描述

就是刚才的写操作指令。


④ 删除掉rdb文件,并重启redis(发现有rdb文件,再次删掉)。使用客户端检测keys,表明数据成功恢复。

这里写图片描述


测试rdb文件与aof文件共存,首先加载aof文件

① vim修改aof文件(生成环境不允许)

这里写图片描述


② 客户端shutdown生成rdb文件

这里写图片描述

此时,rdb文件是健康的,aof文件是错误的。


③ 重启,使用客户端链接

这里写图片描述

链接报错,说明首先找的是aof文件。


AOF文件修复

redis-check-aof --fix appendonly.aof

这里写图片描述

这里写图片描述

同理,rdb文件修复同上:

redis-check-rdb  --fix dump.rdb

总结,AOF备份、修复与恢复如下:

这里写图片描述


【3】AOF配置

appendfsync

其有如下属性值:

always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好。

everysec:出厂默认推荐,异步操作,每秒记录 如果一秒内宕机,有数据丢失。

no:可以忽略这个属性值了。

这里写图片描述


no-appendfsync-on-rewrite

重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性。

这里写图片描述


auto-aof-rewrite-min-size

设置重写的基准值(大小)。


auto-aof-rewrite-percentage

设置重写的基准值(百分比)。


【4】AOF重写

① 是什么?

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制。当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。

可以使用命令:

bgrewriteaof

② 重写原理

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。

重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。


③ 触发机制

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。

这里写图片描述

真实生产环境中,不可能为64M这么小的,一般为3G起步。


【5】AOF优劣

[1]优势

① 每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好。

② 每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失。

③ 不同步:appendfsync no 从不同步。


[2]劣势

① 相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb。

② aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同。

这里写图片描述


【6】RDB和AOF该如何选择

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些
命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。

Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

① 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.

② 同时开启两种方式

在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据。因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。

那要不要只使用AOF呢?

建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。


③ 性能建议

因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。

如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。

代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。

只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。

如果不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。

代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个(新浪微博就选用了这种架构)。

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
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值