05 持久化
一. 持久化的作用
1. 什么是持久化
redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上
2. 持久化的实现方式
# 1. 快照: 某时某刻数据的一个完成备份,
mysql的Dump
redis的RDB
# 2. 写日志:任何操作记录日志,要恢复数据,只要把日志重新走一遍即可
mysql的 Binlog
Redis的 AOF
二 RDB
1. 什么是RDB
2. 三种主要的触发机制
1) save(同步)
# 命令
save
# 流程:
客户端执行save命令 -> redis服务端 -> 同步创建RDB二进制文件
# 缺点:
会造成redis的阻塞(数据量非常大的时候)
# 文件策略: 新覆盖旧
如果老的RDB存在,会替换老的
# 复杂度:
o(n)
2) bgsave(异步,Backgroud saving started)
# 命令
bgsave(异步,Backgroud saving started)
# 流程:
客户端执行save命令 -> redis服务端 -> 异步创建RDB二进制文件(内部实现: fork函数生成一个子进程(fork会阻塞reids),执行createRDB,执行成功,返回给reids消息)
# 缺点:
此时访问redis,会正常响应客户端
# 文件策略:
跟save相同,如果老的RDB存在,会替换老的
# 复杂度:
o(n)
3) 配置redis.conf配置文件
# 配置参数介绍
'''
# 配置 seconds changes(提示: 可以配置任意多条)
# 如果900s中改变了1条数据,自动生成rdb
save 900 1
# 如果300s中改变了10条数据,自动生成rdb
save 300 10
# 如果60s中改变了1w条数据,自动生成rdb
save 60 10000
'''
# 基本配置
save 900 1
save 300 10
save 60 10000
# rdb文件的名字,默认为dump.rdb
dbfilename dump.rdb
# rdb文件存储目录(提示: 检查是否已经指定过dir目录位置)
dir "/opt/redis-5.0.7/data/"
# 如果bgsave出现错误,是否停止写入,默认为yes
stop-writes-on-bgsave-error yes
# 采用压缩格式
rdbcompression yes
# 是否对rdb文件进行校验和检验
rdbchecksum yes
# 最佳配置
save 900 1
save 300 10
save 60 10000
# 以端口号作为文件名,可能一台机器上很多reids,不会乱
dbfilename dump-${port}.rdb
# 保存路径放到一个大硬盘位置目录
dir "大硬盘位置目录"
# 出现错误停止
stop-writes-on-bgsave-error yes
# 采用压缩格式
rdbcompression yes
# 是否对rdb文件进行校验和检验
rdbchecksum yes
3. 不容忽略的触发机制
# 1. 全量复制
没有执行save和bgsave没有添加rdb策略,还会生成rdb文件,如果开启主从复制,主会自动生成rdb
# 2. debug reload
debug级别的重启,不会将内存中的数据清空
# 3. shutdown save
关闭会出发rdb的生成
4. 试验
三种主要的触发机制
# 第一种方式: save
10.0.0.100:6379> save
OK
[root@yang data]# pwd
/opt/redis-5.0.7/data
[root@yang data]# ls
6379.log dump.rdb
# 第二种方式: bgsave
10.0.0.100:6379> bgsave
Background saving started
[root@yang data]# ls
6379.log dump.rdb
# 第三种方式: 配置文件
vim /opt/redis-5.0.7/conf/redis_6379.conf
i
# 20秒修改了3条数据就生成rdb
save 20 3
ESC
:wq
# 关闭redis-server
# 方式一:
10.0.0.100:6379> shutdown
# 方式二:
[root@yang conf]# redis-cli -a 123456 shutdown
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
[root@yang conf]# ps aux | grep redis
root 9486 0.0 0.0 112812 968 pts/0 S+ 23:05 0:00 grep --color=auto redis
# 开启redis-server
[root@yang conf]# redis-server /opt/redis-5.0.7/conf/redis_6379.conf
[root@yang conf]# ps aux | grep redis
root 9496 0.0 0.1 153996 7688 ? Ssl 23:06 0:00 redis-server 0.0.0.0:6379
root 9501 0.0 0.0 112812 972 pts/0 S+ 23:06 0:00 grep --color=auto redis
# 20秒内执行三条命令以后查看dump.rdb
10.0.0.100:6379> set lqz 1
OK
10.0.0.100:6379> set lqz 2
OK
10.0.0.100:6379> set lqz 3
OK
[root@yang conf]# more /opt/redis-5.0.7/data/dump.rdb
1 REDIS0009ú redis-ver^E5.0.7ú
2 redis-bitsÀ@ú^EctimeÂ8XR_ú^Hused-memÂHe^L^@ú^Laof-preambleÀ^@þ^@û^A^@^@^ClqzÀ^CÿG]^AD^[<94>&
三. AOF
1. RDB问题
1. 耗时,耗性能
2. 不可控,可能会丢失数据
2. AOF介绍
客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复
3. AOF的三种策略
# 注意:
日志不是直接写到硬盘上,而是先放在缓冲区,缓冲区根据一些策略,写到硬盘上
# 日志从缓冲区写入磁盘的三种略:
# 1. always:
redis –》 写命令刷新的缓冲区 —》 每条命令fsync到硬盘 —》 AOF文件
# 2. everysec(默认值):
redis ——》 写命令刷新的缓冲区 —》 每秒把缓冲区fsync到硬盘 –》 AOF文件
# 3. no:
redi s——》 写命令刷新的缓冲区 —》 操作系统决定,缓冲区fsync到硬盘 –》 AOF文件
命令 | always | everysec | no |
---|---|---|---|
优点 | 不丢失数据 | 每秒一次fsync,丢失1秒数据 | 不用管 |
缺点 | IO开销大,一般的sata盘只有几百TPS | 丢1秒数据 | 不可控 |
4. AOF 重写
AOF重写作用: 随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题, 本质就是把过期的,无用的,重复的,可以优化的命令,来优化, 这样可以减少磁盘占用量,加速恢复速度.
原生AOF | AOF重写 |
---|---|
set hello world set hello java set hello hehe incr counter incr counter rpush mylist a rpush mylist b rpush mylist c 过期数据 | set hello hehe set counter 2 rpush mylist a b c |
1) 实现方式
# 命令
'''
客户端向服务端发送bgrewriteaof命令,服务端会起一个fork进程,完成AOF重写
'''
bgrewriteaof
# 配置文件
# 将该选项设置为yes,打开
appendonly yes
# 文件保存的名字
appendfilename appendonly-${port}.aof
# 采用第二种策略: always, everysec, no
appendfsync everysec
# 存放的路径(提示: 如果dir指定了就不要重复指定哦)
dir "/opt/redis-5.0.7/data/"
# 在aof重写的时候,是否要做aof的append操作,因为aof重写消耗性能,磁盘消耗,正常aof写磁盘有一定的冲突,这段期间的数据,允许丢失
no-appendfsync-on-rewrite yes
# 注意: 默认配置
# AOF文件重写需要尺寸: 默认64mb
auto-aof-rewrite-min-size 64mb
# AOF文件增长率: 默认100
auto-aof-rewrite-percentage 100
2) 自动触发时机(两个条件同时满足)
'''
# AOF当前尺寸(单位:字节)
aof_current_size
# AOF上次启动和重写的尺寸(单位:字节)
aof_base_size
'''
# 1. 当前尺寸大于重写需要尺寸
aof_current_size > auto-aof-rewrite-min-size
# 2. (增长率)当前尺寸减去上次重写的尺寸,除以上次重写的尺寸如果大于配置中的增长率
(aof_current_size - aof_base_size) / aof_base_size > auto-aof-rewrite-percentage
3) 重写流程
四. RDB和AOF的选择
命令 | rdb | aof |
---|---|---|
启动优先级 | 低 | 高(挂掉重启,会加载aof的数据) |
体积 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 丢数据 | 根据策略决定 |
轻重 | 重 | 轻 |