持续创作,加速成长!这是我参与「掘金日新计划 · 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相同
3)、自动
满足一项自动配置就会执行
注意: 全量复制、debug reload、shutdown
AOP
先把命令追加到操作日志的尾部,保存所有的历史操作
将redis.conf 配置文件中的appendonly 参数改为yes 后,则redis开始启动AOF数据持久化模式
相比于RDB持久化方案的优点:
(1)数据非常完整,故障恢复丢失数据少
(2)可对历史操作进行处理
缺点
(1)因为AOF模式要把每一步redis命令都记录下来,所以就导致文件的体积会很大
(2)而且会导致速度低于RDB,并且恢复速度慢
1、三种策略
1、always
2、everysec(默认)
3、no:操作系统决定
比较
2、AOF重写
作用:减少硬盘占用量,加速恢复速度
两种实现方式:bgrewriteaof、AOF重写配置
1、bgrewriteaof命令:手动执行触发重写
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文件上
注意:
执行重写时如果发现有进程正在执行重写,那么直接返回。如果有进程正在执行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模式的恢复
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(固态硬盘)
- 单机多实例持久化文件目录可以考虑分盘