RDB模式


RDB工作模式原理

RDB(Redis DataBase):基于时间的快照,其默认只保留当前最新的一次快照,特点是执行速度比较 快,缺点是可能会丢失从上次快照到当前时间点之间未做快照的数据

RDB bgsave 实现快照的具体过程:

Redis从master主进程先fork出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时 文件,比如:tmp-.rdb,当数据保存完成之后再将上一次保存的RDB文件替换掉,然后关闭子进程,这 样可以保证每一次做RDB快照保存的数据都是完整的

因为直接替换RDB文件的时候,可能会出现突然断电等问题,而导致RDB文件还没有保存完整就因为突然 关机停止保存,而导致数据丢失的情况.后续可以手动将每次生成的RDB文件进行备份,这样可以最大化 保存历史数据

RDB 相关配置

save 900 1   900秒内有一个key发生变化就自动保存

save 300 10  300秒内有10个key发生变化就自动保存

save 60 10000 60秒内有10000个key发生变化就自动保存

dbfilename dump.rdb  #保存的文件名

dir ./         #编泽编译安装 ,默认RDB文件存放在启动redis的工作目录 ,建议明确指定存入目录

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

实现RDB方式

save: 同步,会阻赛其它命令,不推荐使用

bgsave: 异步后台执行,不影响其它命令的执行

自动: 制定规则, 自动执行

RDB 模式优点

RDB快照保存了某个时间点的数据,可以通过脚本执行redis指令bgsave(非阻塞,后台执行)或者save(会阻塞写操作,不推荐)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不 同时间点的版本,很适合备份,并且此文件格式也支持有不少第三方工具可以进行后续的数据分析

比如: 可以在最近的24小时内,每小时备份一次RDB文件,并且在每个月的每一天,也备份一个 ROB文件。这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。

RDB可以最大化Redis的性能,父进程在保存 RDB文件时唯一要做的就是fork出一个子进程,然后 这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘工/0操作。

RDB在大量数据,比如几个G的数据,恢复的速度比AOF的快

RDB 模式缺点

不能实时保存数据,可能会丢失自上一次执行RDB备份到当前的内存数据

如果你需要尽量避免在服务器故障时丢失数据,那么RDB不适合你。虽然Redis允许你设置不同的 保存点(save point)来控制保存RDB文件的频率,但是,因为ROB文件需要保存整个数据集的状 态,所以它并不是一个轻松的操作。因此你可能会至少5分钟才保存一次RDB文件。在这种情况    下,一旦发生故障停机,你就可能会丢失好几分钟的数据。

当数据量非常大的时候,从父进程fork子进程进行保存至RDB文件时需要一点时间,可能是毫秒或 者秒,取决于磁盘IO性能

在数据集比较庞大时,  fork()可能会非常耗时,造成服务器在一定时间内停止处理客户端﹔如果数 据集非常巨大,并且CPU时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒或更久。 虽然 AOF重写也需要进行fork(),但无论AOF重写的执行间隔有多长,数据的持久性都不会有任何 损失

手动备份RDB文件脚本
vim /apps/redis/etc/redis.conf
save "" #原有自动保存配置注释掉
dbfilename dump_6379.rdb
dir "/data/redis"
appendonly no

#!/bin/bash


. /etc/init.d/functions
BACKUP=/backup/redis-rdb
DIR=/data/redis
FILE=dump_6379.rdb
PASS=123456

redis-cli -h 127.0.0.1 -a $PASS --no-auth-warning bgsave
RESULT=`redis-cli -a 123456 --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 123456 --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
action "Backup redis RDB"