Redis数据持久化的两种方式

本文详细介绍了Redis的两种持久化机制:RDB和AOF。RDB通过快照方式定期备份数据,适用于大规模数据恢复场景;AOF则通过日志记录每次写操作,确保数据的完整性和一致性。文章还对比了两种机制的优缺点,提供了实际应用场景下的选择建议。
部署运行你感兴趣的模型镜像

一、RDB(Redis DataBase)

1.1什么是RDB

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot 快照,它恢复时是将快照文件直接读到内存里,这个快照文件默认是dump.rdb ,可以在redis.conf 中查看与修改。

Redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO 操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB 方式要比AOF 方式更加的高效。RDB 的缺点是最后一次持久化后的数据可能丢失。其中rdb 保存的是dump.rdb 文件。

1.2什么是fork

fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)。数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

1.3配置快照

在redis.conf 配置文件中有关于快照的相关配置如下图:在满足下面的配置信息时将会触发RDB 。

1.4如何触发RDB快照

1. 执行Save:save时只管保存,其它不管,全部阻塞 。

2. 执行BGSAVE:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave 命令获取最后一次成功执行快照的时间 。

3. 执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义 。

4. 自定义快照触发条件 。

1.5数据恢复演示

//1. 更改redis.conf 配置文件中5 分钟修改10 次的触发条件为:30 秒修改1 次
save 30 1   

//2.在终端1 中删除原来的 dump.rdb文件,保证正确性
[root@localhost bin]# ls
redis-benchmark  redis-cli  redis-server

//3. 在终端2 中开启Redis 服务并做了一次设置
127.0.0.1:6379> SET s1 v1 

//4. 30 秒后在终端1 中查询文件,这时就多了一个dump.rdb 文件,并将该文件复制一份
[root@localhost bin]# ls
dump.rdb  redis-benchmark  redis-cli  redis-server
[root@localhost bin]# cp dump.rdb dump_cp.rdb
[root@localhost bin]# ls
dump_cp.rdb  redis-benchmark  redis-server
dump.rdb     redis-cli

//5.在终端2 中清除所有的数据,执行FLUSHDB ,重新启动Redis 服务,执行keys * 进行查询,发现并没有备份数据
127.0.0.1:6379> FLUSHDB
OK
........退出,登录步骤省略
127.0.0.1:6379> keys *
(empty list or set)

//6.原因是执行FLUSHDB 也会触发快照,dump.rdb 中的数据被清空,所以我们在终端2退出Redis 服务
127.0.0.1:6379> SHUTDOWN
not connected> EXISTS

//7.在终端1 中删除dump.rdb 空文件,并将拷贝的dump_cp.rdb(改文件保存了原快照信息) 命名为 dump.rdb
mv dump_cp.rmb dump.rmb

//8.在终端2 中重新开启Redis 服务,再查询时就发现s1 数据被恢复了
[root@localhost bin]# ./redis-server /myredis/redis.conf 
[root@localhost bin]# ./redis-cli -p 6379
127.0.0.1:6379> keys *
1) "s1"

1.6RDB 的优缺点

适合大规模的数据恢复。

对数据完整性和一致性要求不高。

在一定间隔时间做一次备份,所以如果redis 出故障的话,就会丢失最后一次快照后的所有修改。

fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。

1.7RDB 总结

二、AOF(Append Only File)

2.1什么是AOF

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis 启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。其中AOF 保存的是appendonly.aof 文件,可以在redis.conf 配置文件中查看与修改。

相关配置信息:AOF 默认配置是关闭的。

2.2数据恢复演示

//1.在终端1 中将redis.conf 配置文件中的appendonly  改为yes
appendonly yes

//2.在终端2 中开启Redis 的服务,并做一个数据设置,删除数据库中的信息,退出Redis 的服务
[root@localhost bin]# ./redis-server /myredis/redis.conf 
[root@localhost bin]# ./redis-cli -p 6379
127.0.0.1:6379> set s1 v1
OK
127.0.0.1:6379> keys *
1) "s1"
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> SHUTDOWN
not connected> exit

//3.在终端1 中查看查询该目录下的文件,会发现多了一个appendonly.aof 文件
[root@localhost bin]# ls
appendonly.aof  redis-benchmark  redis-server
dump.rdb        redis-cli

//4.在终端1 中删除dump.rdb 文件,防止这个文件影响,然后查看appendonly.aof 配置文件,发现所有的操作都以日志的形式被记录下来
[root@localhost bin]# rm -rf dump.rdb 
[root@localhost bin]# cat appendonly.aof 
*2
......省略一部分数据
0
*1
$7
FLUSHDB

//5.为了让数据恢复用删除appendonly.aof 中的FLUSHDB,保存退出

//6.在终端2 中重新开启Redis 服务,发现数据被恢复
[root@localhost bin]# ./redis-server /myredis/redis.conf 
[root@localhost bin]# ./redis-cli -p 6379
127.0.0.1:6379> keys *
1) "s1"

当appendonly.aof 文件出现错误时(比如乱加一些数据),在启动Redis 时会报错,可以使用redis-check-aof –fix进行修复,对不符合语法的数据进行删除。

2.3rewrite介绍

什么是rewrite

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

rewrite 重写的原理

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

rewrite 触发机制

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

2.4AOF的优缺点

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

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

不同步:appendfsync no 从不同步。

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

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

2.5AOF 总结

三、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文件,载入较新的那个。

您可能感兴趣的与本文相关的镜像

Anything-LLM

Anything-LLM

AI应用

AnythingLLM是一个全栈应用程序,可以使用商用或开源的LLM/嵌入器/语义向量数据库模型,帮助用户在本地或云端搭建个性化的聊天机器人系统,且无需复杂设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值