05 持久化

一. 持久化的作用

1. 什么是持久化

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

2. 持久化的实现方式

# 1. 快照: 某时某刻数据的一个完成备份,
	mysql的Dump
	redis的RDB
	
# 2. 写日志:任何操作记录日志,要恢复数据,只要把日志重新走一遍即可
	mysql的 Binlog
	Redis的 AOF

二 RDB

1. 什么是RDB

image-20191226120500154

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) 重写流程

image-20191229185839519

四. RDB和AOF的选择

命令 rdb aof
启动优先级 高(挂掉重启,会加载aof的数据)
体积
恢复速度
数据安全性 丢数据 根据策略决定
轻重
posted @ 2020-09-05 23:06  给你加马桶唱疏通  阅读(105)  评论(0编辑  收藏  举报