目录
一、redis的简单介绍
Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、 hash(哈希)、list(列表)、set(集合)、zset(有序集合)、 Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景,而且因为Redis会 将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样 在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。
这次我们来看一下redis的持久化存储
二、redis持久化
Redis支持RDB和AOF两种持久化机制,Redis的持久化功能有效避免因进程退出造成的数据丢失问题,通过持久化文件进行数据的恢复;
1.RDB快照式存储
1.1 如何使用RDB持久化
- 手动触发:save和bgsave命令
1)save命令:执行该命令时redis服务器阻塞,直到RDB过程完成,阻塞时间很长
2)bgsave命令:save命令的优化,执行fork操作创建子线程,RDB过程交给子进程执行,阻塞只发生在fork阶段,阻塞时间很短
Redis内部所有 的涉及RDB的操作都采用bgsave的方式
- 自动触发:
1)配置redis.conf文件 save m n m秒内数据有n次修改 就会自动触发bgsave
2)节点执行全量复制操作,主节点自动执行bgsave生成 RDB文件并发送给从节点
3)执行debug reload命令重新加载Redis时,也会自动触发save操 作
4)执行shutdown命令时,如果没有开启AOF持久化功 能则自动执行bgsave
1.2 bgsave的持久化流程
1)执行bgsave命令,父进程判断当前是否存在正在执行的子 进程,如RDB/AOF子进程,如果存在bgsave命令直接返回
2)执行fork操作创建子进程,fork操作过程中父进程会阻塞
3)fork完成后,bgsave命令返回“Background saving started”父进程不再阻塞,继续响应其他命令
4)子进程创建RDB文件,根据父进程内存生成临时快照文件,对原有文件进行原子替换
5)子进程发送信号给父进程表示完成,父进程更新统计信息
1.3 RDB文件处理相关
RDB文件保存:
通过修改redis.conf配置文件
dir 配置项指定保存目录
dbfilename 配置项指定文件名
坏盘或磁盘写满等情况,可以通过config set dir{newDir} 动态在线修改文件路径,config set dbfilename{newFileName}运行期动态执行指定文件名,当下次运行时RDB文件会保存到新目录
RDB文件压缩:
采用LZF算法对生成的RDB文件做压缩处理,默认开启,压缩后的文件远远小于内存大小
可以通过参数config set rdbcompression{yes|no}动态修改
压缩RDB会消耗CPU,但可以大幅降低文件的体积,建议开启
数据恢复常见运维问题:
如果Redis加载损坏的RDB文件时拒绝启动,并打印日志
# Short rea