redis持久化

 每日运维   2018-06-22 18:42   5573 人阅读  0 条评论

持久化概述

默认情况下,redis工作时所有数据集都是存储于内存中的,不论是否有磁盘上的持久化数据,都是工作于内存当中,redis本身就是一个内存的数据库,把所有数据库相关的存储都存储在内存中,如果redis崩溃或断电导致所有数据丢失,所以redis提供了持久化功能来保证数据的可靠性,redis持久化有两种实现方式,RDB和AOF

 

说明

1)RDB和AOF持久化可以一起使用,不冲突,RDB是Redis已经在配置文件中默认使用了。

2)持久化本身不能取代备份,还应该制定备份策略,对Redis数据库定期进行备份。

3)BGSAVE和BGREWRITEAOF不会同时执行,为了避免对磁盘的I/O影响过大,在某一时刻只允许一者执行;如果BGSAVE在执行当中,而用户手动执行BGREWRITEAOF时,Redis会立即返回OK,但是Redis不会同时执行,会等BGSAVE执行完成,再执行BGREWRITEAOF

4)在Redis服务器启动用于恢复数据时,会优先使用AOF(如果启用了AOF)

 

RDB持久化

存储为二进制格式的数据文件,默认启动的持久化机制;按事先定制的策略(配置文件中),周期性地将数据保存至磁盘,使用save参数即可设定周期和策略;数据文件默认为dump.rdb(可修改),客户端连接服务器以后可以使用SAVE命令进行保存数据至磁盘

 

设置RDB持久化有两种方式:

1)客户端使用SAVE或BGSAVE命令进行数据保存至磁盘

2)在配置文件中定义save和策略进行周期性保存至磁盘,如下

save 900 1

save 300 10

save 60 10000

 

使用RDB持久化方法一

SAVE:是同步保存,在客户端使用save保存快照时,是在redis主线程中保存快照;因为redis的主线程是用于处理请求的,所以此时会阻塞所有客户端请求,每次的保存快照都是把内存中的数据完整的保存一份,并非是增量的,如果内存中的数据比较大,而还有大量的写操作请求时,此方式会引起大量的I/O,会导致redis性能下降

 

使用RDB持久化方法二

BGSAVE:异步方式,将立即返回结果,但自动在后台保持操作,所以BGSAVE命令启动以后,前台不会被占用,客户端的请求是不会被阻塞(主进程不会被阻塞)

 

使用RDB持久化方法三

配置文件save参数:如果是在配置文件中定义的save,那么redis在持久化的时候,则会开启另外的进程去处理,不会阻塞redis的主进程

 

RDB不足之处

redis的RDB持久化不足之处则是,一旦数据出现问题,由于RDB的数据不是最新的,所以基于RDB恢复过来的数据一定会有一部分数据丢失,也就是RDB保存之后的修改的数据会丢失

 

AOF持久化

AOF:Append Only File,有着更好的持久化能力的解决方案,AOF类似于MySQL的二进制日志,记录每一次redis的写操作命令,以顺序IO方式附加在指定文件的尾部,是使用追加方式实现的,这也叫做一种附加日志类型的持久化机制,由于每一次的操作都记录,则会随着时间长而增大文件的容量,并且有些记录的命令是多余的,AOF不像RDB,RDB是保存数据集的本身。

 

但是redis进程能够自动的去扫描这个对应的AOF文件,把其中一些冗余的操作给合并一个,以实现将来一次性把数据恢复,也就是说redis能够合并重写AOF的持久化文件,由BGREWRITEAOF命令来实现,BGREWRITEAOF命令是工作于后台的重写AOF文件的命令,重写后redis将会以快照的方式将内存中的数据以命令的方式保存在临时文件中,最后替换原来的文件,重写AOF文件方式,并没有读取旧AOF文件,而是直接将当前内存中的所有数据直接生成一个类似于MySQL二进日志命令一样的操作,例:set cjk 0 ,incr cjk  … 1000 ,则会替换为set cjk 1000 些命令放到重写文件中,如果此过程完成,那么原有的AOF将被删除。

 

BGREWRITEAOF说明

是对AOF文件的重写,其不会读取正在使用AOF的文件,而通过将内存中的数据,为内存中的所有数据生成一个命令集,以命令的方式保存到临时文件中,完成之后替换原来的AOF文件;所以AOF文件是通过重写将其变小

 

配置文件中与RDB持久化相关的参数

stop-writes-on-bgsave-error yes              //在进行快照备份时,一旦发生错误的话是否停止写操作

rdbcompression yes                         //RDB文件是否使用压缩,压缩会消耗CPU

rdbchecksum yes                              //是否对RDB文件做校验码检测,此项定义在redis启动时加载RDB文件是否对文件检查校验码,在redis生成RDB文件是会生成校验信息,在redis再次启动或装载RDB文件时,是否检测校验信息,如果检测的情况下会消耗时间,会导致redis启动时慢,但是能够判断RDB文件是否产生错误

dbfilename dump.rdb                       //定义RDB文件的名称

dir /var/lib/redis                              //定义RDB文件存放的目录路径

 

我们可以查看一下现在的设置

127.0.0.1:6379> config get dir

1) "dir"

2) "/a01/apps/redis/data"

 

配置文件中与AOF持久化相关的参数

appendonly no                                 //定义是否开启AOF功能,默认为关闭

appendfilename "appendonly.aof"   //定义AOF文件

appendfsync always                         //表示每次收到写命令时,立即写到磁盘上的AOF文件,虽然是最好的持久化功能,但是每次有写命令时都会有磁盘的I/O操作,容易影响redis的性能

appendfsync everysec                      //表示每秒钟写一次,不管每秒钟收到多少个写请求都往磁盘中的AOF文件中写一次

appendfsync no                                //表示append功能不会触发写操作,所有的写操作都是提交给OS,由OS自行决定是如何写的

no-appendfsync-on-rewrite no         //当此项为yes时,表示在重写时,对于新的写操作不做同步,而暂存在内存中

auto-aof-rewrite-percentage 100       //表示当前AOF文件的大小是上次重写AOF文件的二倍时,则自动日志重写过程

auto-aof-rewrite-min-size 64mb              //定义AOF文件重写过程的条件,最少为定义大小则触发重写过程


本文地址:https://linux365.cn/32.html
版权声明:本文为原创文章,版权归 每日运维 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?