1:Redis的持久化介绍
什么是持久化?
利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化,
持久化用于防止数据的意外丢失,确保数据安全性。
持久化过程保存什么?
1:将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据
2:将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程
Redis的持久化分两种:
RDB 默认开启 config set save "" 进行关闭
AOF 默认关闭 config set appendonly yes 进行开启
启动优先级:Redis同时开启了RDB和AOF时,Redis重启
Redis先加载AOF进行数据恢复。降低丢失数据的量
那同时开启是 RDB 有什么作用?
全量备份,灾难恢复。
2:RDB启动方式 —— save指令相关配置
在redis.conf 里面有以下配置 实际上save 执行的还是 bgsave命令
具体配置解释:
1:设置本地数据库文件名,默认值为 dump.rdb,通常设置为dump-端口号.rdb
dbfilename filename
2:设置存储.rdb文件的路径,通常设置成存储空间较大的目录中,目录名称data
dir path
3:设置存储至本地数据库时是否压缩数据,默认yes,设置为no,节省 CPU 运行时间,但存储文件变大
rdbcompression yes|no
4:设置读写文件过程是否进行RDB格式校验,默认yes,设置为no,节约读写10%时间消耗,但存在数据损坏的风险
rdbchecksum yes|no
5:后台存储过程中如果出现错误现象,是否停止保存操作,默认yes
stop-writes-on-bgsave-error yes|no
默认配置:
1:dbfilename dump.rdb
2:dir ./ (相对于本redis.server的根路径)
3:rdbcompression yes
4:rdbchecksum yes
5:stop-writes-on-bgsave-error yes
3:RDB启动方式
1:手动执行save命令
手动执行 save (立刻执行)
指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,
有可能会造成长时间阻塞,线上环境不建议使用。
2:手动执行 bgsave 命令
数据量过大,单线程执行方式造成效率过低如何处理? 使用bgsave
手动启动 bgsave (后台保存)
启动后台保存操作,不是立刻开始保存 需要满足条件save second changes
bgsave命令是针对save阻塞问题做的优化。
Redis内部所有涉及到RDB操作都采用bgsave的方式,save命令可以放弃使用。
具体流程
1.客户端发送bgsave指令到redis服务端
2.系统调用fork函数,生成子进程
3.创建rdb文件
4.完成之后会返回redis服务端消息,告诉已经保存完毕
3:自动执行save(实际上是执行bgsave 命令)
自动执行save配置(后台还是使用bgsave指令)
save配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,
结果可能是灾难性的
设置自动持久化的条件,满足限定时间范围内key的变化数量达到指定数量即进行持久化
save second changes
second:监控时间范围
changes:监控key的变化量
#900秒内监测到1个key发生变化,进行bgsave命令
save 900 1
save 300 10
save 60 10000
怎么才算是影响的key值?
除了查询之外,增加、修改、覆盖key值都会保存记录
4:save与bgsave 最后对比
save 手动执行一次立刻保存一次数据
bgsave 实际上不管如何配置 最终实际上都是使用该命令
5:RDB特殊启动形式
服务器运行过程中重启:debug reload
关闭服务器时指定保存数据:shutdown save
全量复制(在主从复制中详细讲解)
4:RDB的优点和缺点
RDB优点:
1:RDB是一个紧凑压缩的二进制文件,存储效率较高
2:RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
3:RDB恢复数据的速度要比AOF快很多
应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复。
RDB缺点:
1:耗时,耗性能
每次保存 RDB 的时候Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。
在数据集比较庞大时fork() 可能会非常耗时,
写的数据量很大,内存页设置的比较大,会产生很大的内存消耗,
同时RDB也是一个IO的过程,RDB文件很大拷贝速度就会很慢。
2:不可控,容易丢失数据,服务器在发生故障时候会丢失数据。
T3和T4时间段所操作的命令都会丢失。因为无法知道什么时候会宕机及其他异常情况。
如果使用save和bgsave做定时备份也是无法保障数据不会丢失。
参考技术文章:
https://www.cnblogs.com/songgj/p/9408784.html
http://blog.sina.com.cn/s/blog_a1e9c7910102vkdi.html
网友评论