Redis的数据持久化

1、什么是持久化?
持久化是将数据从掉电易失的内存存放在能够永久存储的设备上
2、Redis持久化的方式
1)RDB(Redis DB):主要用来存放数据
RDB持久化功能可以将服务器包含的所有数据库数据以二进制文件的形式保存到硬盘里面。而通过在服务器启动时载入RDB文件,服务器可以根据RDB文件的内容还原服务器原有的数据库数据。

在redis服务器创建RDB文件的情况中,以下三种最常见:
a、服务器执行客户端发送的SAVE命令;
在执行SAVE命令的过程中(也即是创建 文件的过程中),redis服务器将被阻塞,无法处理客户端发送的命令请求,只有在SAVE命令执行完毕之后(也即是RDB文件创建完毕之后),服务器才会重新开始处理客户端发送的命令请求。如果RDB文件已经存在,那么服务器将自动使用新的RDB文件去代替旧的RDB文件。

[root@db ~]# redis-cli 
127.0.0.1:6379> SAVE
OK
127.0.0.1:6379> exit
[root@db ~]# ll /var/lib/redis/6379/dump.rdb 
-rw-r--r-- 1 root root 274 2月   3 18:01 /var/lib/redis/6379/dump.rdb
[root@db ~]# date
2019年 02月 03日 星期日 18:02:21 CST
//当前情况redis数据库的数据较少所有保存的时间很短

b、BGSAVE保存时,不会阻塞前台,而是服务器会自动创建一个fork子进程,去后台去保存数据;创建子进程会消耗额外的内存,因为需要创建子进程会耗费额外的内存,所以SAVE创建RDB文件的速度会比BGSAVE快,可以集中资源来创建RDB文件,SAVE和BGSAVE没有孰好孰坏之分。

[root@db ~]# redis-cli 
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> exit
[root@db ~]# date
2019年 02月 03日 星期日 18:04:59 CST
[root@db ~]# ll /var/lib/redis/6379/dump.rdb 
-rw-r--r-- 1 root root 274 2月   3 18:04 /var/lib/redis/6379/dump.rdb
[root@db ~]# 

c、定义配置文件实现自动创建RDB文件

[root@db redis]# vim 6379.conf
save 60 10000

则表示“如果距离上一次创建RDB文件已经过去了60秒,并且服务器的所有数据库总共已经发生了不少于10000次修改,那么执行BGSAVE命令”。
另外,用户还可以通过设置多个save选项来设置多个自动保存条件,当任意一个条件满足时,服务器就会自动执行BGSAVE命令。
每次创建RDB文件之后,服务器为实现自动持久化而设置的时间计数器和次数计数器就会被清零。并重新开始计数,所以多个保存条件的效果是不会叠加的。

RDB持久化的缺点:
因为创建RDB文件需要将服务器所以的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才创建一个新的RDB文件,也即是说,创建RDB文件的操作不能执行的过于频繁,否则就会严重得影响服务器的性能。

2)AOF(AppendOnlyFile):主要用来存放命令
AOF持久化的原理:
AOF持久化保存数据库的方法是:每当有修改的数据库的命令被执行时,服务器就会将执行的命令写入到AOF文件的末尾。因为AOF文件里面存储了服务器执行过的所有数据库修改的命令,所以给定一个AOF文件,服务器只要重新执行一遍AOF文件里面包含的命令,就可以达到还原数据库的目的。
对于AOF持久化来说,当一条命令真正的被写入到硬盘里面时,这条命令才不会因为停机而意外丢失。

为了控制redis服务器在遇到意外停机或是丢失的数据量,redis为AOF持久化提供了appendfsync选项,这个选项的值可以是always、everysec或者no
Always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到磁盘里面,在这种模式下,服务器即使遭遇意外停机,也不会丢失任何自己已经成功执行的命令数据。
Everysec:服务器每一秒重调用一次fdatasync,将缓冲区里面的命令写入到磁盘里面,在这种模式下,服务器即使遭遇意外停机时,最多只丢失一秒钟内的执行的命令数据。
**No:**服务器不主动调用fdatasync,由操作系统决定任何将缓冲区里面的命令写入到磁盘里面,在这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的。
运行速度:always的书读慢,everysec和no都很快。
默认值:everysec

有两种方法可以触发AOF重写:
a、客户端向服务器发送BGREWRITEAOF命令。

[root@db 6379]# redis-cli 
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
127.0.0.1:6379> exit
[root@db 6379]# date
2019年 02月 03日 星期日 18:16:53 CST
[root@db 6379]# ll /var/lib/redis/6379/appendonly.aof 
-rw-r--r-- 1 root root 516 2月   3 18:16 /var/lib/redis/6379/appendonly.aof
[root@db 6379]# 

b、通过设置配置选项来让服务器自动执行BGREWRITEAOF命令,他们分别是:
auto-aof-rewrite-min-size,触发AOF重写所需要的最小体积:只要AOF文件的体积大于等于size时。服务器才会考虑是否需要进行AOF重写,这个选项用于避免对体积过小的AOF文件进行重写。
auto-aof-rewrite-percentage,指定触发重写所需要的AOF文件体积百分比:当AOF文件的体积大于auto-aof-rewrite-min-size指定的体积,并且超过上一次重写之后的AOF文件体积的percent%时,就会触发AOF重写。(如果服务器刚刚启动不久,还没有进行过AOF重写,name使用服务器启动时载入的AOF文件的体积来作为基准值)将这个值设置为0表示关闭自动AOF重写。

例子:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
解释:第二条规则的意思就是说,当AOF文件大于64mb之后才考虑进行AOF重写,然后第一条规则的意思是只有当AOF文件的**增量大于100%**的时候才进行重写,也就是大一倍的时候才触发。

RDB持久化 AOF持久化
全量备份,一次保存整个数据库 增量备份,一次保存一个修改数据库的命令。
保存的间隔较长。 保存的间隔默认为一秒钟。
数据还原速度快。 数据还原速度一般。冗余的命令越多,还原的速度越慢。
执行SAVE命令时会阻塞服务器,但手动或者自动触发BGSAVE都不会阻塞服务器。 无论是平时还是进行AOF重写时,都不会阻塞服务器。
更适合数据备份 更适合用来保存数据,通常意义上的数据持久化。在appendfsync always模式下运行时,Redis的持久化方式和一般的SQL数据库的持久化方式一样

猜你喜欢

转载自blog.csdn.net/Micky_Yang/article/details/86760596
今日推荐