Redis持久化

Redis 是基于内存型的NoSQL, 和MySQL是不同的,使用内存进行数据保存

如果想实现数据的持久化,Redis也可支持将内存数据保存到硬盘文件中

Redis支持两种数据持久化保存方法
RDB:Redis DataBase         (把数据库的全部内容做完全备份--快照) redis默认开启
AOF:AppendOnlyFile         (类似于mysql二进制日志--写日志)
在配置文件中查询rdb存放路径
[root@ubuntu2004 ~]#vim /etc/redis/redis.conf
dir /var/lib/redis          #这个路径存放数据的地方,不能直接打开看,是个二进制格式文件

[root@ubuntu2004 redis]#ll
-rw-rw----  1 redis redis   92 10月 31 15:06 dump.rdb
[root@ubuntu2004 redis]#systemctl stop redis
redis服务退出时会自动把内存数据存放在dump.rdb文件中,如果把文件移走再start启动,文件就没了,数据丢失。
把数据移回来,需要先把服务stop停止,把文件拷贝进来,再start启动服务

把数据移回来,如果是restart重启redis服务,是先停再起,移来rdb文件就被redis现有内存的内容所覆盖,则原有的数据会丢失
查看redis当前有多少数据
[root@ubuntu2004 ~]#redis -a 123456 dbsize

RDB

RDB工作原理

RDB(Redis DataBase):是基于某个时间点的快照,注意RDB只保留当前最新版本的一个快照 


RDB 持久化功能所生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成该 RDB 文件时数据库的状态.因为 RDB 文件是保存在磁盘中的,所以即便 Redis 服务进程甚至服务器宕机,只要磁盘中 RDB 文件存在,就能将数据恢复
RDB bgsave 实现保存的具体过程:
从redis主进程fork生成一个新的子进程,此子进程负责将redis的内存数据保存为一个临时文件temp-<子进程id>.rdb
当数据保存完后,再将此临时文件改名为RDB文件,如果有前一次保存的RDB文件则会被替换,最后关闭子进程

由于redis只保留最后一个版本的RDB文件,如果想保存多个版本的数据,可后跟时间
RDB手动触发保存

范例: save 执行过程会使用主进程进行立即快照

[root@ubuntu2004 ~]#redis-cli -a 123456 save

save执行时立即备份,为阻塞性,在执行备份时,用户是不能访问,不能在高峰期执行save

bgsave后台专门生成一个子进程用于备份,不影响用户的访问

[root@ubuntu2004 ~]#redis-cli -a 123456 bgsave
手动备份RDB文件的脚本

判断redis当rdb_bgsave_in_progress:0时,rdb快照完成,就执行备份

获取此值 redis-cli -a 123456 info |grep rdb_bgsave_in_progress

cat redis_backup_rdb.sh
#!/bin/bash
BACKUP=/backup/redis-rdb 
DIR=/apps/redis/data
FILE=dump_6379.rdb 
PASS=123456 

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $" OK "
    elif [ $2 = "failure" -o $2 = "1" ] ;then
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi    
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo
}
backup_redis_rdb () {
    redis-cli -h 127.0.0.1 -a $PASS --no-auth-warning bgsave 
    result=`redis-cli -a $PASS --no-auth-warning info Persistence |grep rdb_bgsave_in_progress| sed -rn 's/.*:([0-9]+).*/\1/p'`
until [ $result -eq 0 ] ;do
    sleep 1
    result=`redis-cli -a $PASS --no-auth-warning info Persistence |grep rdb_bgsave_in_progress| sed -rn 's/.*:([0-9]+).*/\1/p'`
done 
DATE=`date +%F_%H-%M-%S`

[ -e $BACKUP ] || { mkdir -p $BACKUP ; chown -R redis.redis $BACKUP; } 
cp $DIR/$FILE $BACKUP/dump_6379-${DATE}.rdb 

color "Backup redis RDB" 0
RDB自动保存规则
配置文件
vim /etc/redis/redis.conf
save 900 1                  #900s之内有1个key变了,就触发RDB保存
save 300 10                 #300s之内10个key变了,就触发RDB保存
save 60 10000               #60s之内有10000个key变了,就触发RDB保存
前边加#注释,取消自动快照规则
#save ""
禁用RDB保存规则
如果想完全禁用这个功能  
save ""
快照失败是否禁止写入
stop-writes-on-bgsave-error yes  #当快照失败是否允许写入,yes为出错禁止写入,建议改为no
开启错误校验 
rdbcompression yes 
rdbchecksum yes

RDB总结

实现 RDB 方法
save: 同步,不推荐使用,使用主进程完成快照,因此会阻赛其它命令执行 
bgsave: 异步后台执行,不影响其它命令的执行,会开启独立的子进程,因此不会阻赛其它命令执行 
配置文件实现自动保存: 在配置文件中制定规则,自动执行bgsave
RDB模式的优缺点
优点:
一:RDB快照只保存某个时间点的数据,恢复的时候直接加载到内存即可,不用做其他处理,这种文件适合用于做灾备处理.可以通过自定义时间点执行redis指令bgsave或者save保存快照,实现多个版本的备份
比如: 可以在最近的24小时内,每小时备份一次RDB文件,并且在每个月的每一天,也备份一个RDB文件.这样的话,即使遇上问题,也可以随时将数据集还原到指定的不同的版本. 

二:RDB在大数据集时恢复的速度比AOF方式要快
缺点:
一:备份有时间间隔,不能实时保存数据,可能会丢失自上一次执行RDB备份到当前的内存数据 
如果需要尽量避免在服务器故障时丢失数据,那么RDB并不适合.虽然Redis允许设置不同的保存 点(save point)来控制保存RDB文件的频率,但是,因为RDB文件需要保存整个数据集的状态, 所以它可能并不是一个非常快速的操作.因此一般会超过5分钟以上才保存一次RDB文件.在这种 情况下,一旦发生故障停机,就可能会丢失较长时间的数据.

二:在数据集比较庞大时,fork()子进程可能会非常耗时,造成服务器在一定时间内停止处理客户端请求,如果数据集非常巨大,并且CPU时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒或更久.另外子进程完成生成RDB文件的时间也会花更长时间.

可以在非关键业务中使用