Redis持久化
持久化方式
RDB 快照模式
redis默认的方式是RDB
在某一个时间段生成一个全量的 dump.rdb 文件,把数据全部保存在这个文件。
触发机制
自动触发:
1:配置触发,在redis.config文件中默认配置的三种情况,三种情况是 任意满足一个就触发
save 900 1 // 900s内有一个key被修改就触发
save 300 10 // 300s内有10个key被修改就触发
save 60 10000 // 60秒内有10000个key被修改就触
2:shutdow
任何组件做持久化或高可用,正常关闭服务都会触发持久化 , 比如 mysql的redolog正常关闭都会触发落盘。
3:flushall
执行flushall操作会生成一个空的dump.rdb文件,因为数据都被清空了
手动触发:有特殊情况要关机或者重启手动去做备份。
1:save 指令 线程阻塞的
2:bgsave 在后台去fork一个子线程,不会阻塞其他指令
如何恢复rdb文件
重启服务,redis启动的时候会自动加载dump.rdb文件的数据
优缺点
缺点:数据安全性不够,容易造成数据丢失
优点:速度快,dump.rdb是一个二进制文件,恢复数据的时候性能比较高
AOF
AOF是以日志形式来记录每次操作,将redis所有执行写过程的指令都记录下来,追加到AOF文件的末尾。
默认是不开启的,开启即默认,重启服务时会重新执行AOF文件中的命令来恢复数据,主要解决持久化实时性问题。
appendonly no // 默认不开启
appendfilename "appendonly.aof" //文件名
AOF是先执行命令在记录日志的。是因为redis向AOF记录日志的时候不会先对这些命令进行语法校验,如果先记录了日志,可能命令有误,恢复数据的时候就会报错
AOF机制的三种写回策略 appendfsync**
每条命令都要跟磁盘交互,会有性能问题,提供了三种方案:
默认使用everysec
redis.config配置文件:
#appendfsync always //同步写回,可以基本保证数据不丢失
appendfsync everysec // 执行完命令,先把日志记录到aof的内存缓冲区,每隔一秒同步到磁盘
#appendfsync no //由操作系统觉得何时写入磁盘
官方给出的解释:
appendfsync always:fsync每次将新命令附加到 AOF
时。非常非常慢,非常安全。请注意,在执行来自多个客户端或管道的一批命令之后,这些命令会附加到 AOF,因此这意味着一次写入和一次
fsync(在发送回复之前)。
appendfsync everysec :fsync每一秒。足够快(因为 2.4
版本可能和快照一样快),如果发生灾难,您可能会丢失 1 秒的数据。
appendfsync no:从不fsync,只是将您的数据交到操作系统手中。更快,更不安全的方法。通常,Linux 将使用此配置每 30 秒刷新一次数据,但这取决于内核的精确调整。
建议(和默认)策略是fsync每秒。它既快速又相对安全。该always策略在实践中很慢,但它支持组提交,因此如果有多个并行写入,Redis
将尝试执行单个fsync操作。
重写机制
随着写入操作的执行,AOF 变得越来越大,会存在一些冗余命令。此时就需要用到重写机制。
在4.0版本之前,采用的合并命令的方式,缺点是需要一条条比对,性能慢。
AOF+RDB混合
4.0版本以后,新增了AOF+RDB混合的方式。直接把AOF里面的内容压缩成RDB的内容格式(二进制),新加的数据继续追加。
默认是 开启的方式:
aof-use-rdb-preamble yes
当开启混合模式后,重写之后的aof文件是以rdb的二进制格式存储数据,继续进行写操作,后续操作在aof中依然是以命令的方式追加。所以AOF重写后由两个文件组成, 一个是RDBE二进制快照, 另一个是命令形式的文本。
什么时候重写(触发机制)
1:配置触发
redis.config配置
> auto-aof-rewrite-percentage 100 // 下次重写是第一次重写的2倍
> auto-aof-rewrite-min-size 64mb // 第一次文件必须达到64
2:手动触发
执行bgrewriteaof命令直接触发AOF重写
优缺点
优点:数据安全性高
缺点: 没有RDB快,4.0优化后速度差不多
关于redis的持久化官方讲述的非常清楚:https://redis.io/docs/manual/persistence/#log-rewriting
主从数据同步
配置主从只需要在slave配置,master服务不需要
在redis.conf文件中找到
######REPLICATION ########
slaveof 主地址 端口号
masterauth 主密码
主从数据的一致性是怎么保证的?
一:连接阶段,主从相互知道对方的ip 和端口,保证是相通的可以通信
二 :数据传输
1:全量同步,主收到从的sync的命令,通过bgsave指令 生成当前的RDB快照文件,传输给从,(此时主还是可以正常写入数据 ,bgsave不会阻塞命令)从收到后会清空自己数据,加载RDB文件。
2:增量同步
主节点新写的指令会保存到主的缓存区间,等待从加载完RDB文件后,在把所有新写的指令同步给从