小记一手 “Redis持久化机制”
? Redis系列?:
?Redis安装教程(保姆级详细图文)
?布隆过滤器安装步骤
?手把手带你实操 RDB & AOF)
?带你 “亲自体验“ Redis主从复制
?“Redis哨兵“一撸到底 ,贼爽~
?温馨提示?:
本文所涉及操作都是围绕单进程单实例版(单机版)Redis,文中有关于Redis配置文件路径等需按自己个人服务器实际路径为准 !!或根据Redis单机版详细安装图文教程一文重新安装一个干净的环境来操作~
文章目录
- ? Redis系列?:
- ?温馨提示?:
- RDB
- 配置参数释义
- save / bgsave
- 弊端
- 优点
- Redis Forck
- AOF
- 优点
- 弊端
- 方案分析
- Redis VS HDFS
- HDFS
- Redis
- AOF配置
- 开启AOF
- fsync策略
RDB
- Redis执行快照/副本时是怎么保证非阻塞对外提供服务的同时实现将数据落地的?
- Redis数据落地的时候具有
时点性
- 在某一个
时间点
开始数据落地的时候,程序通过fork
的方式创建一个子进程
,当主进程数据
发生修改
后,每一笔修改会触发写时复制(COW)
,新的数据
指向新的内存地址
,子进程
中的落地数据
还是指向老的数据地址
,因此,子进程落地的数据
还是创建的时候的数据
,保证了时点正确
。
- Redis数据落地的时候具有
- Redis
默认
开启RDB
配置参数释义
save / bgsave
save
: 关机维护时使用,会阻塞
服务bgsave
: fork创建子进程,不会阻塞
服务
弊端
不支持拉链,只有一个dump.rdb,通常需要人工维护每天拷贝出最后一份rdb数据
丢失数据相对多一些,时点与时点之间窗口数据容易丢失,比如8点得到一个rdb, 当9点需要要落一个rdb,服务器宕机了
优点
类似java中的序列化,恢复的速度相对快
Redis Forck
- 使用linux的时候,父进程的数据,子进程可不可以看得到?
- 理论上进程是数据隔离的!但父进程其实可以让子进程看到数据!
- 比如linux中,export的环境变量,子进程的修改不会破坏父进程,父进程的修改也不会破坏子进程
- 如果父进程是redis,内存数据比如10G,触发fork() 创建子进程时应该如下:
- 速度快
- 空间小
AOF
Append Only File
(只会向文件追加)- Redis中,RDB和AOF可以
同时开启
- 如果开启了AOF,只会用AOF恢复
v4.0 后变化
AOF中包含RDB全量,增加记录新的写操作
- 如果开启了AOF,只会用AOF恢复
优点
丢失数据少
弊端
文件体量无限变大,恢复慢
方案分析
Redis运行了N(假设N>=10)年,开启了AOF,N年初刚过完年,Redis突然挂了,新的一年整个人都不好了,问:
1、AOF多大?
- 很大,假设有10T
2、恢复时,内存不会溢出?
- 不会,因为要溢出N年前就溢出了,而且溢出的数据根本不会成功写到文件中
3、恢复要多久?
- 恢复最快且至少N/2年
既然如此,什么方案才能既保住AOF丢失数据量少的优点,又要让AOF足够小?
Redis VS HDFS
HDFS
- Fsimage+edits.log
- 让日志只记录增量合并的过程
Redis
- v4.0以前
- 重写
- 删除抵消的命令
- 合并重复的命令
- 最终也是一个纯指令的日志文件
- v4.0以后
- 重写
- 将老数据RDB到AOF文件中
- 将增量的以指令形式Append到AOF
- AOF是一个混合体
- 利用了RDB的快
- 利用了日志的全量
有这样一个配置项【aof-use-rdb-preamble yes】
当重写AOF文件时,Redis可以在AOF文件中使用RDB的前导来更快地重写和恢复。 当这个选项被打开时,重写的AOF文件由两个不同的节组成:【RDB文件】【AOF尾巴】 当加载时,Redis识别AOF文件以“Redis”字符串开始,然后加载带有前缀的RDB文件,并继续加载AOF尾部。
AOF配置
开启AOF
-
编辑配置文件
vi /etc/redis/6379.conf
-
找到`APPEND ONLY MODE 部分配置文件
-
将
appendonly no
修改为appendonly yes
-
自动AOF
自动重写只
追加
文件。当AOF日志大小增长指定的百分比
时Redis能够自动重写
日志文件隐式调用BGREWRITEAOF
指令。自动AOF是怎样工作的?
Redis记住最近一次重写后AOF文件的大小(如果在重启后没有重写,则使用启动时AOF文件的大小)。将此基础大小与当前大小进行比较。如果当前大小大于指定的百分比,则会触发重写。您还需要为要重写的AOF文件指定最小大小,这对于避免重写AOF文件时,即使达到了百分比增长,但它的实际大小却很小。
fsync策略
Redis支持三种不同的模式
默认值
是“everysec
”
-no
:不进行fsync,让操作系统在需要的时候更快的刷新数据.
Always
:每次写入追加日志后进行fsync。速度较慢但是数据是最安全可靠的。Everysec
:每秒fsync一次。基于两者之间的折中速度和数据安全的一种模式。