三、Redis持久化

目录

1. RDB快照(snapshot)

1.1 介绍 

1.2 bgsave的写时复制(COW)机制

1.3 save与bgsave对比 

1.4 缺点 

2. AOF 

2.1 介绍 

2.2 基本命令 

2.3 具体文件内容 

2.4 AOF重写  

3. 总结

3.1 比较 

3.2 注意 

4. Redis 4.0 混合持久化  

4.1 介绍 

4.2 配置

4.3 优点   

4.4 过程解释 

5. 其他

5.1 如果aof名称改掉

5.2 Redis数据备份策略 


1. RDB快照(snapshot)

Redis Database Backup file(Redis数据备份文件) 

1.1 介绍 

在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中(经过压缩的而二进制文件)。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。 比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次 数据集: # save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可,这个配置在redis.conf里面

还可以手动执行命令生成RDB快照,进入redis客户端执行命令save或bgsave可以生成dump.rdb文件, 每次命令执行都会将所有redis内存快照到一个新的rdb文件里,并覆盖原有rdb快照文件。

1.2 bgsave的写时复制(COW)机制

Redis 借助操作系统提供的写时复制技术(Copy-On-Write, COW),在生成快照的同时,依然可以正常处理写命令。简单来说,bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。 bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。此时,如果主线程对这些数据也都是读操作,那么,主线程和 bgsave 子进程相互不影响。但是,如果主线程要修改一块数据,那么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。

1.3 save与bgsave对比 

1.4 缺点 

rdb持久化需要达到某一条件,才能触发持久化,如果在还没有达到这一条件,客户端那边还在修改数据的时候,服务挂掉了,这样的话就会丢失数据  

2. AOF 

append-only file 

2.1 介绍 

快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化,将修改的每一条指令记录进文件append only.aof中(先写入os cache,每隔一段时间 fsync到磁盘) 

2.2 基本命令 

你可以通过修改配置文件来打开 AOF 功能: 

从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文 件的末尾。这样的话, 当 Redis 重新启动时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。   

你可以配置 Redis 多久才将数据 fsync 到磁盘一次。有三个选项:  

1 appendfsync always:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全。 
2 appendfsync everysec:每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据。 
3 appendfsync no:从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择 

推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。   

2.3 具体文件内容 

比如执行命令“set tuling-zhuge 123”,aof文件里会记录如下数据。  

*3

$3

set

$12

tuling-zhuge

$3

123  

  • 这是一种resp协议格式数据,*后面的数字代表命令有多少个参数,$号后面的数字代表这个参数有几个字符
  • 注意,如果执行带过期时间的set命令,aof文件里记录的是并不是执行的原始命令,而是记录key过期的时间戳 
  • 比如执行“set tuling 888 ex 1000”,对应aof文件里记录如下 

1 *3 
2 $3 
3 set 
4 $6 
5 tuling 
6 $3 
7 888 
8 *3 
9 $9 
10 PEXPIREAT 
11 $6 
12 tuling 
13 $13
14 1604249786301 

2.4 AOF重写  

AOF文件里可能有太多没用指令,所以AOF会定期根据内存的最新数据生成aof文件 

例如,执行了如下几条命令: 

1 127.0.0.1:6379> incr readcount 
2 (integer) 1
3 127.0.0.1:6379> incr readcount 
4 (integer) 2 
5 127.0.0.1:6379> incr readcount 
6 (integer) 3 
7 127.0.0.1:6379> incr readcount 
8 (integer) 4 
9 127.0.0.1:6379> incr readcount 
10 (integer) 5 

重写后AOF文件里变成  

1 *3 
2 $3 
3 SET 
4 $2 
5 readcount 
6 $1 
7 5 

如下两个配置可以控制AOF自动重写频率 

1 # auto‐aof‐rewrite‐min‐size 64mb //aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大 
2 # auto‐aof‐rewrite‐percentage 100 //aof文件自上一次重写后文件大小增长了100%则再次触发重写 

当然AOF还可以手动重写,进入redis客户端执行命令bgrewriteaof重写AOF 注意,AOF重写redis会fork出一个子进程去做(与bgsave命令类似),不会对redis正常命令处理有太多影响 

3. 总结

3.1 比较 

RDB 和 AOF ,我应该用哪一个?

aof里面指令很多,如果恢复数据的话,执行速度相对比较慢,rdb体积比较小,因为是二进制存储,所以恢复数据快,但是aof相对来说数据安全性好一点,不能让rdb一秒钟执行一次持久化,rdb持久化慢,但是恢复快,aof丢失数据只会丢失1s数据,从数据库中再获取也行,但是rdb数据丢失多的话,也会增加数据库的一个访问压力

默认用rdb,生产环境可以都启用,redis启动时如果既有rdb文件又有aof文件则优先选择aof文件恢复数据,因为aof 一般来说数据更全一点。 

3.2 注意 

就是每次配置文件更改了,需要重启一下redis  

4. Redis 4.0 混合持久化  

4.1 介绍 

重启 Redis 时,我们很少使用 RDB来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对 RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。 Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。 

4.2 配置

通过如下配置可以开启混合持久化(必须先开启aof): 

# Redis can create append-only base files in either RDB or AOF formats. Using
# the RDB format is always faster and more efficient, and disabling it is only
# supported for backward compatibility purposes.
aof-use-rdb-preamble yes

4.3 优点   

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一 起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。 于是在 Redis 重启的时候,可以先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,因此重启效率大幅得到提升。 

4.4 过程解释 

 解释一下:就是把所有的内存数据不会再按照resp命令写入aof文件中,而是像rdb二进制数据存到aof文件里面去,这个写的过程中也会有新的命令过来,这些命令则会按照原来的方式追加到apendonly.aof文件里去,

开启混合持久化后,命令变成下面这个样子

然后你再去执行一些命令

把你刚刚执行的命令,追加了上去

重点:

你触发重写的时候,会把数据按照二进制的格式写到文件中去,而增量命令以aof方式追加到appendonly.aof中去,恢复的时候,二进制直接恢复数据,后面的命令就一条一条去执行,这个方式既能保证数据安全,又能让你数据更加紧凑 

混合持久化AOF文件结构如下:

5. 其他

5.1 如果aof名称改掉

如果aof文件名改掉,找不到对应恢复的文件,他会找rdb文件,如果你再把rdb文件名也改掉,那数据就恢复不了了,所以呢,每次持久化过后,最后把这些文件备份一下 

5.2 Redis数据备份策略 

1. 写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48 小时的备份

2. 每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份

3. 每次copy备份的时候,都把太旧的备份给删了

4. 每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值