redis持久化
目录
一持久化
1.1 什么是持久化
redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上
1.2 持久化的实现方式
# 数据库(mysql,redis,mongodb,rabbitmq,infludb,clickhose,kafak)--->持久化方法通常是以下两种
快照:某时某刻数据的一个完成备份,
-mysql的Dump
-redis的RDB
写日志:任何操作记录日志,要恢复数据,只要把日志重新走一遍即可
-mysql的 Binlog
-Redis的 AOF
# redis支持 :3中方案
-rdb方案:在某一刻完成备份
-aof方案:每个操作都会有日志,恢复的时候,把日志重放即可
-混合持久化:rdb+aof方案
-aof重写
-隔一段时候,会把之前的日志做成rdb文件放在日志文件中,后续的继续使用aof方案记录日志
-达到快速恢复的目的
http://www.taodudu.cc/news/show-5528045.html?action=onClick
二 rdb方案
2.1 使用
# 触发机制-主要三种方式
# save(同步)--->阻塞-->如果数据量很多--->影响redis的查询操作
save
# bgsave(异步,Backgroud saving started)
# 自动(通过配置)
配置 seconds changes
save 900 1
save 300 10
save 60 10000
如果60s中改变了1w条数据,自动生成rdb
如果300s中改变了10条数据,自动生成rdb
如果900s中改变了1条数据,自动生成rdb
2.2 RDB问题
- 耗时,耗性能:
- 不可控,可能会丢失数据
三 AOF
3.1 AOF介绍
客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复
3.2 # AOF的三种策略
日志不是直接写到硬盘上,而是先放在缓冲区,缓冲区根据一些策略,写到硬盘上
always:redis–>写命令刷新的缓冲区—>每条命令fsync到硬盘—>AOF文件
everysec(默认值):redis——>写命令刷新的缓冲区—>每秒把缓冲区fsync到硬盘–>AOF文件
no:redis——>写命令刷新的缓冲区—>操作系统决定,缓冲区fsync到硬盘–>AOF文件
命令 | always | everysec | no |
---|---|---|---|
优点 | 不丢失数据 | 每秒一次fsync,丢失1秒数据 | 不用管 |
缺点 | IO开销大,一般的sata盘只有几百TPS | 丢1秒数据 | 不可控 |
3.3 AOF 重写
随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题
- 本质就是把过期的,无用的,重复的,可以优化的命令,来优化
- 这样可以减少磁盘占用量,加速恢复速度
实现方式
bgrewriteaof:
客户端向服务端发送bgrewriteaof命令,服务端会起一个fork进程,完成AOF重写
AOF重写配置:
配置名 | 含义 |
---|---|
auto-aof-rewrite-min-size | AOF文件重写需要尺寸 |
auto-aof-rewrite-percentage | AOF文件增长率 |
统计名 | 含义 |
---|---|
aof_current_size | AOF当前尺寸(单位:字节) |
aof_base_size | AOF上次启动和重写的尺寸(单位:字节) |
自动触发时机(两个条件同时满足):
aof_current_size>auto-aof-rewrite-min-size:当前尺寸大于重写需要尺寸
(aof_current_size-aof_base_size)/aof_base_size>auto-aof-rewrite-percentage:(增长率)当前尺寸减去上次重写的尺寸,除以上次重写的尺寸如果大于配置中的增长率
重写流程
aof配置
appendonly yes # 是否开启aof持久化
appendfilename "appendonly.aof" # 指定 AOF 文件名
# Redis支持三种不同的刷写模式:
# appendfsync always # 每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。
appendfsync everysec # 每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。
# appendfsync no # 完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。
dir /root/lqz/redis/data # 配置持久化文件存放位置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
dir /root/lqz/redis/data
7.3 混合持久化
# 必须先开启AOF,再加入一条配置
aof-use-rdb-preamble yes