Redis-持久化机制

99 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

持久化

所有数据保存在内存中,对数据的更新将异步地保存到磁盘上

持久化方式:

1)、快照:如mysql的dump,redis的RDB

2)、写日志:如mysql的binlog,hbase的Hlog,redis的AOF

RDB

指定的时间间隔内保存数据快照,默认开启RDB数据持久化模式

缺点:因为是特定条件下进行一次持久化(每隔一段时间),就可能会导致一旦redis崩溃,再次回复时,可能会导致部分数据丢失。

注:如果设置的备份时间间隔较短,比较耗服务器性能,如果设置的备份时间间隔较长,又可能会导致数据恢复时部分数据丢失。

触发机制:

1)、save(同步)

可能造成阻塞,策略:如存在老的RDB文件,新替换老,O(n)

2)、bgsave(异步)

文件策略和复杂度跟save相同

image.png

image.png

3)、自动

满足一项自动配置就会执行

image.png

注意: 全量复制、debug reload、shutdown

AOP

先把命令追加到操作日志的尾部,保存所有的历史操作

将redis.conf 配置文件中的appendonly 参数改为yes 后,则redis开始启动AOF数据持久化模式

相比于RDB持久化方案的优点:

(1)数据非常完整,故障恢复丢失数据少

(2)可对历史操作进行处理

缺点

(1)因为AOF模式要把每一步redis命令都记录下来,所以就导致文件的体积会很大

(2)而且会导致速度低于RDB,并且恢复速度慢

1、三种策略

1、always

image.png

2、everysec(默认)

image.png

3、no:操作系统决定

image.png

比较

image.png

2、AOF重写

作用:减少硬盘占用量,加速恢复速度

两种实现方式:bgrewriteaof、AOF重写配置

1、bgrewriteaof命令:手动执行触发重写

image.png

2、AOF重写配置

auto-aof-rewrite-min-size 64MB   // 当文件小于64M时不进行重写
auto-aof-rewrite-min-percenrage 100  // 当文件比上次重写后的文件大100%时进行重写

重写流程

从主进程中fork出子进程,并拿到fork时的AOF文件数据写到一个临时AOF文件中

在重写过程中,redis收到的命令会同时写到AOF缓冲区和重写缓冲区中,这样保证重写不丢失重写过程中的命令

重写完成后通知主进程,主进程会将AOF缓冲区中的数据追加到子进程生成的文件中

redis会原子的将旧文件替换为新文件,并开始将数据写入到新的aof文件上

image.png

注意:

执行重写时如果发现有进程正在执行重写,那么直接返回。如果有进程正在执行BGSAVE,那么会等BGSAVE执行完成后再执行重写。

Redis执行重写时会fork一个进程进行,其开销和RDB一样

重写过程不影响原有的AOF过程,write,save操作都不影响

重写过程中有几种时刻会阻塞主进程: 在fork子进程时,将重写缓冲区的数据写到磁盘上时,使用新AOF文件替换旧文件时

配置

appendonly yes
appendfilename "appendonly-${port}.aof"
appendfsync everysec
dir ./
no-appendfsync-on-rewrite yes
auto-aof-rewrite-min-size 64MB   // 当文件小于64M时不进行重写
auto-aof-rewrite-min-percenrage 100  // 当文件比上次重写后的文件大100%时进行重写

RDB模式和AOF模式的恢复

image.png

image.png

3、常见问题

1、fork操作

1)、同步操作:虽然fork同步操作是非常快的,但是如果需要同步的数据量过大,fork就会阻塞redis主进程。

2)、与内存量息息相关:内存越大,fork同步数据耗时越长,当然也跟服务器有关,服务器有物理机,也有虚拟机

3)、info:latest_fork_usec:使用此命令可以查看持久化花费的时间,如果持久化时间过长,就会造成卡顿

改善

优先使用物理机或者高效的虚拟机支持fork操作

控制redis实际最大可用内存:maxmemory

合理配置linux内存分配策略:vm.overcommit_memory=1

降低fork频率:例如放宽AOF重写自动触发时机,减少不必要的全量复制。

2、子进程开销和优化

1)、cpu

开销:RDB和AOF文件生成,属于CPU密集型

优化:不做CPU绑定,不和CPU密集型部署

2)、内存

开销:fork内存开销,copy-on-write

优化:echo never > /sys/kernel/mm/transparent_hugepage/enabled

3)、硬盘

开销:AOF和RDB文件写入,可以结合iostat, iotop分析

优化:

  • 不要和高硬盘负载服务部署一起:存储服务、消息队列
  • no-appendfsync-on-rewrite = yes
  • 根据写入量决定磁盘类型:如ssd(固态硬盘)
  • 单机多实例持久化文件目录可以考虑分盘
3、AOF追加阻塞

image.png