Redis持久化

Redis持久化

RDB(Redis DataBase)

说明

  Redis的数据都存储在内存中,保存备份时它执行的是全量快照,将内存中所有数据都记录到磁盘中。保存为dump.rdb。可以通过修改配置文件自定义备份的时机。

配置文件相关的修改点

1.修改备份的条件

2.禁用快照

3.dbfilename

设置备份文件的默认文件名

4.dir

修改备份文件(.rdb文件)的存储路径

5.stop-writes-on-bgsave-error

默认yes。如果配置成no,表示你不在乎数据不一致或者有其他手段发现也能确保redis继续接受新的写请求。

6.rdbcompression

默认yes。对于存储到磁盘中的快照,是否进行压缩。如果是的话,redis会采用LZF算法进行压缩。需要消耗CPU来进行压缩,如果不想消耗CPU可以设置为no。

7.rdbchecksum

默认yes。存储快照之后,redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭。

8.rdb-del-sync-files

在没有持久性的情况下删除复制中的RDB文件启用。默认为no,表示禁用此功能。

常用命令

save(阻塞保存)

在主程序中执行备份,会阻塞当前redis服务器,直到备份完成后。执行save命令期间,redis不能处理其他命令,线上禁止使用。

bgsave(不阻塞保存)

redis会在后台异步进行快照(备份)操作,不阻塞主程序。备份同时还可以响应客户端请求。该出发方式会fork一个子进程,,由子进程进行备份。

lastsave

查看最后一次备份的时间

redis-check-rdb

格式

redis-check-rdb xxx.rdb(文件名)

修复损坏的rdb文件

优缺点

优点

1.适合大规模的数据恢复

2.按照业务定时备份

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

4.RDB文件在内存中的家在速度要比 AOF 快的多

缺点

1.在一定间隔时间做一次备份,所以如果redis意外down机的话,就会丢失从当前至最后一次快照期间的数据,快照之间的数据会丢失。

2.内存数据的全量同步,如果数据量太大会导致I/O严重,影响服务器的性能

3.RDB依赖于主进程的fork,在更大的数据集中,着可能会导致服务请求的瞬间延迟。fork的时候内存中的数据被克隆了一份,大致2倍的膨胀性,需要考虑。

总结

 

AOF(Append Only File)

说明

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

2.AOF默认是关闭的,需要在配置文件中开启

3.AOF开启后,数据备份会生成三个不同后缀的文件,介绍如下:

BASE:基础AOF

他一般由子进程通过重写产生,该文件最多只有一个

INCR:增量AOF

他一般会在AOFRW开始执行时被闯将,该文件可能存在多个

HISTORY:历史AOF

它由BASE和INCR AOF变化而来,每次AOFRW成功完成时,本次AOFRW之前对应的BASE和INCR AOF都将变成HISTORY,HISTORY类型的AOF会被Redis自动删除。

 

配置文件,常用配置

开启AOF

 

设置写回策略,默认为每秒写回

设置AOF文件保存路径:为dir+appenddirname

dir的路径

 appenddirname的路径

设置AOF文件的文件前缀

文件名为appendfilename,后跟不同类型文件的附加信息

演示使用AOF恢复数据 

演示一

# 1 先在redis中进行写入操作,经过一秒后会写入到AOF文件。(因为配置文件中设置的每秒写回
127.0.0.1:6379> set k1 v2222222
OK
127.0.0.1:6379> set k2 v33333333
OK 
复制代码
# 2 查看AOF存放目录中是否有AOF文件生成
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# pwd
/myredis #操作目录
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# ll
总用量 120
drwxr-xr-x 2 root root   4096 7月   8 17:17 appendonlydir
-rw-r--r-- 1 root root    121 7月   8 17:17 dump6379.rdb
drwxr-xr-x 2 root root   4096 7月   3 00:10 dumpfiles
-rw-r--r-- 1 root root 106729 7月   8 17:14 redis.conf
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# cd appendonlydir/ #AOF文件存放的上级目录
[root@iZ2ze4jd3wbsstj2idalpgZ appendonlydir]# ll #AOF文件
总用量 12
-rw-r--r-- 1 root root  89 7月   8 17:17 appendonly.aof.1.base.rdb
-rw-r--r-- 1 root root 112 7月   8 17:17 appendonly.aof.1.incr.aof
-rw-r--r-- 1 root root  88 7月   8 17:17 appendonly.aof.manifest
[root@iZ2ze4jd3wbsstj2idalpgZ appendonlydir]# 
复制代码
# 3 重启redis(模拟redis宕机)
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# redis-server /myredis/redis.conf 
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# redis-cli
127.0.0.1:6379> auth xxxxx
OK
127.0.0.1:6379> get k1 #数据依然存在
"v2222222"

演示二

将AOF文件复制,并删除rdb文件,再将AOF还原,重启服务器,会读取还原后的AOF文件

1 复制AOF文件所在的目录,并删除被复制的AOF目录和rdb文件

复制代码
[root@iZ2ze4jd3wbsstj2idalpgZ appendonlydir]# cd /myredis/
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# ll
总用量 120
drwxr-xr-x 2 root root   4096 7月   8 17:17 appendonlydir
-rw-r--r-- 1 root root    121 7月   8 17:31 dump6379.rdb
drwxr-xr-x 2 root root   4096 7月   3 00:10 dumpfiles
-rw-r--r-- 1 root root 106729 7月   8 17:14 redis.conf
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# cp -r appendonlydir appendonlydir_bak # 将原来的目录复制一份,随便改个名字
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# ll # 查看当前目录下的文件
总用量 124
drwxr-xr-x 2 root root   4096 7月   8 17:17 appendonlydir
drwxr-xr-x 2 root root   4096 7月   8 17:40 appendonlydir_bak #复制后
-rw-r--r-- 1 root root    121 7月   8 17:31 dump6379.rdb
drwxr-xr-x 2 root root   4096 7月   3 00:10 dumpfiles
-rw-r--r-- 1 root root 106729 7月   8 17:14 redis.conf
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# rm -rf appendonlydir # 删除原来的目录
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# rm -rf dump6379.rdb  #删除rdb文件
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# 
复制代码

2 重启redis 之前的数据都不在了(因为删除了rdb文件和AOF文件的目录)

[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# redis-cli
127.0.0.1:6379> auth xxxx
OK
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> 

 3 关闭redis服务,并删除AOF文件目录和rdb文件。再将之前复制的AOF文件还原

复制代码
127.0.0.1:6379> SHUTDOWN  #关闭redis服务
not connected> quit
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# ll
总用量 124
drwxr-xr-x 2 root root   4096 7月   8 17:42 appendonlydir
drwxr-xr-x 2 root root   4096 7月   8 17:40 appendonlydir_bak
-rw-r--r-- 1 root root     89 7月   8 17:42 dump6379.rdb
drwxr-xr-x 2 root root   4096 7月   3 00:10 dumpfiles
-rw-r--r-- 1 root root 106729 7月   8 17:14 redis.conf
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# rm -rf appendonlydir #删除目录
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# mv appendonlydir_bak appendonlydir # 还原之前复制的AOF文件
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# ll
总用量 120
drwxr-xr-x 2 root root   4096 7月   8 17:40 appendonlydir
-rw-r--r-- 1 root root     89 7月   8 17:42 dump6379.rdb
drwxr-xr-x 2 root root   4096 7月   3 00:10 dumpfiles
-rw-r--r-- 1 root root 106729 7月   8 17:14 redis.conf
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# rm -rf dump6379.rdb # 删除文件 
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# redis-server /myredis/redis.conf #重启redis服务 
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# redis-cli
127.0.0.1:6379> auth xxxxx
OK
127.0.0.1:6379> get k1 #之前的数据还原
"v2222222"
复制代码

常用命令

redis-check-aof --fix 文件名

说明:文件异常修复命令

场景:文件写到一半出现异常,导致文件损坏,可以使用该命令恢复

演示:乱写AOF文件模拟异常

复制代码
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# vim /myredis/appendonlydir/appendonly.aof.1.incr.aof 

*2
$6
SELECT
$1
0
*1
$8
FLUSHALL
*3
$3
set
$2
k1
$8
v2222222
*3
$3
set
$2
k2
$9
v33333333


sadfarewafsaf
asdf
asd
fasd
fas

# 保存修改

# 发现redis服务都无法启动
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# redis-server /myredis/redis.conf 
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# redis-cli 
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> 

#使用命令修复文件
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# redis-check-aof --fix /myredis/appendonlydir/appendonly.aof.1.incr.aof 
Start checking Old-Style AOF
0x               0: Expected \r\n, got: 3a3a
AOF analyzed: filename=/myredis/appendonlydir/appendonly.aof.1.incr.aof, size=161, ok_up_to=0, ok_up_to_line=1, diff=161
This will shrink the AOF /myredis/appendonlydir/appendonly.aof.1.incr.aof from 161 bytes, with 161 bytes, to 0 bytes
Continue? [y/N]: y
Successfully truncated AOF /myredis/appendonlydir/appendonly.aof.1.incr.aof
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# 

# redis重启成功
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# redis-server /myredis/redis.conf 
[root@iZ2ze4jd3wbsstj2idalpgZ ~]# redis-cli 
127.0.0.1:6379> auth xxxxxx
OK
复制代码

 AOF的优点

  • 更好的保护数据不丢失,性能高,可以做紧急恢复
  • 文件内容容易被人读懂,对文件进行分析也更轻松

 AOF的缺点

  1. 相同的数据集恢复起来AOF要远大于rdb文件,恢复速度慢于rdb
  2. AOF运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

 AOF重写机制

 说明:

由于AOF持久化是redis不断将写命令记录到AOF文件中,随着Redis不断的进行,AOF文件会越来越大,文件越大,占用服务器内存越大以及AOF恢复要求时间越长。

为了解决这个问题,redis新增了重写机制,当AOF文件的大小超过所设定的峰值时,redis就会自动启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集或者可以手动使用bgrewriteaof来重写

比如,多次set k1 只需保留最后一次即可。

常用配置说明

自动触发重写机制

配置文件中配置重写条件

两个条件同时满足才会触发。

1.根据上次重写后的aof大小,判断当前aof大小是不是增长了1倍

2.重写时需要满足设置的文件大小64mb 

 演示

1.修改重写条件 

 2.关闭rdb混合

3.通不过重复set k1,使aof的文件一直扩大,直到扩大到1k触发重写机制

set k1 11111111111111111111111111111111111111111111111111111
...

4.到达1k之后,incr文件清空,base文件变大。并且文件的后缀需要由1变成2(每次重写数字+1)。

 5.查看base文件中存储的命令

只保留了最后一次set k1的命令

手动触发重写机制

命令: bgrewriteaof

 1.重复setk2,不足1k时使用命令手动触发重写机制

 2.查看base文件中存储的命令

 

 重写原理

 RDB+AOF混合持久化

说明:

结合了RDB和AOF的优点,既能快速加载又能避免丢失过多的数据。

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

RDB的数据不实时,同时使用两者时服务器重启也只会找AOD文件。但是不要只使用AOF,因为RDB更适合用于备份数据库(AOF不断变化不好备份),留着rdb兜底。

数据恢复时的加载顺序

 

配置文件

开启混合方式(预置条件:必须开启AOF)

常用命令

save "" 本次操作禁用rdb。(下次重启后rdb仍然走配置文件中所设置的)

禁用的模式下,仍然可以使用命令sace,basave生成rdb文件

appendonly no 本次操作禁用aof。(下次重启后仍然走配置文件中所设置的)

禁用的模式下,仍然可以使用命令bgrewriteaof生成aof文件

 

 
posted @   邵杠杠  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示