redis 持久化原理与实战
官网介绍:http://www.redis.io
Redis
提供了2个不同形式的持久化方式。
RDB(Redis DataBase)
AOF(Append Of File)
docker安装redis
拉取redis
镜像,展示镜像
docker pull redis:latest
docker images
创建myredis
文件夹,在下面创建conf
和data
两个子文件夹,用于映射docker redis
中的redis.conf
和data
文件夹
mkdir -p myredis/{conf,data}
cd myredis/conf
wget http://download.redis.io/redis-stable/redis.conf
修改redis.conf
文件,主要修改以下几个地方
bind
将这个注释掉,保证redis
可以远程访问requirepass
设置密码daemonize
这个要注释掉,不然docker
容器起不来appendonly
用于开启AOF
(Append-only file
)默认是no
,如果想开启,改成yes
即可。
再myredis
路径下,运行docker
:
# home/sdz/myredis
docker run -d \
-p 6379:6379 \
-v $PWD/conf/redis.conf:/etc/redis/redis.conf \
-v $PWD/data:/data --name myredis \
--restart=always \
--privileged=true \
redis redis-server /etc/redis/redis.conf
进入redis
客户端
docker exec -it myredis redis-cli
RDB(Redis DataBase)
定义
在指定的时间间隔内将内存中的数据集快照写入磁盘, 即Snapshot
快照,它恢复时是将快照文件直接读到内存里。
流程
Redis
会单独创建(fork
)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO
操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB
方式要比AOF
方式更加的高效。RDB
的缺点是最后一次持久化后的数据可能丢失。
实战
配置
在redis.conf
中配置文件名称,默认为dump.rdb
。rdb
文件的保存路径,也可以修改。默认为Redis
启动时命令行所在的目录下。docker
上面配置了data
目录,会在那里显示。
dbfilename dump.rdb
配置文件中默认的快照配置
格式:save 秒钟 写操作次数
RDB
是整个内存的压缩过的Snapshot
,RDB
的数据结构,可以配置复合的快照触发条件,
默认是1分钟内改了1万次,或5分钟内改了10次,或15分钟内改了1次。
推荐:禁用,不设置save
指令,或者给save
传入空字符串
命令
save
:save
时只管保存,其它不管,全部阻塞。手动保存。不建议。
bgsave
:Redis
会在后台异步进行快照操作,快照同时还可以响应客户端请求。
可以通过lastsave
命令获取最后一次成功执行快照的时间
redis.conf
其他相关配置
-
stop-writes-on-bgsave-error
:当Redis
无法写入磁盘的话,直接关掉Redis
的写操作。推荐yes
。 -
rdbcompression
压缩文件: 对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis
会采用LZF
算法进行压缩。如果不想消耗CPU
来进行压缩的话,可以设置为关闭此功能。推荐yes
。 -
rdbchecksum
检查完整性:在存储快照后,还可以让redis
使用CRC64
算法来进行数据校验,但是这样做会增加大约
10%
的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。推荐yes
。
如何停止
动态停止RDB
:redis-cli config set save ""
save
后给空值,表示禁用保存策略
rdb
的备份
先通过config get dir
查询rdb
文件的目录
将*.rdb
的文件拷贝到别的地方
rdb
的恢复
-
关闭
Redis
-
先把备份的文件拷贝到工作目录下
cp dump2.rdb dump.rdb
-
启动
Redis
, 备份数据会直接加载
优势
- 适合大规模的数据恢复
- 对数据完整性和一致性要求不高更适合使用
- 节省磁盘空间
- 恢复速度快
劣势
Fork
的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑- 虽然
Redis
在fork
时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。 - 在备份周期在一定间隔时间做一次备份,所以如果
Redis
意外down
掉的话,就会丢失最后一次快照后的所有修改。
小结
AOF(Append Only File)
定义
以日志的形式来记录每个写操作(增量保存),将Redis
执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis
启动之初会读取该文件重新构建数据,换言之,redis
重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
流程
- 客户端的请求写命令会被
append
追加到AOF
缓冲区内; AOF
缓冲区根据AOF
持久化策略[always
,everysec
,no
]将操作sync
同步到磁盘的AOF
文件中;AOF
文件大小超过重写策略或手动重写时,会对AOF
文件rewrite
重写,压缩AOF
文件容量;Redis
服务重启时,会重新load
加载AOF
文件中的写操作达到数据恢复的目的;
实战
AOF
默认不开启,可以在redis.conf
中配置文件名称,默认为 appendonly.aof
AOF
文件的保存路径,同RDB
的路径一致。
注意:AOF
和RDB
同时开启,系统默认取AOF
的数据(数据不会存在丢失)。