当服务器发生意外导致服务器宕机的时候,redis保存在内存中的数据将会丢失,此时需要将数据持久化到硬盘中,防止丢失数据。redis持久化有两种基本的方案:RDB与AOF。
一、RDB:数据快照
RDB是一种数据快照的持久化方式,将当前所有数据进行保存。Redis 重启会通过加载dump.rdb文件恢复数据。
1 使用save指令执行存储(手动执行):
save指令的执行会阻塞当前redis服务,直到RDB过程执行完成,数据量大可能会阻塞很长时间,生产环境不建议使用。
save命令相关配置(redis.conf中):
dir /usr/local/redis/redis-5.0.8/data #文件存储路径,包括持久化文件、日志文件等
dbfilename dump_6379.rdb #RDB持久化文件的文件名
rdbcompression yes #是否开启LZF压缩;需要消耗cpu,但节省了空间;默认开启
rdbchecksum yes #是否进行RDB文件格式检验(读写都会校验),设为no可以节省10%时间,但是有一定的数据损坏风险;默认开启
2 使用bgsave(后台保存)指令执行存储(手动执行):
bgsave指令的执行不会阻塞当前redis服务。会调用fork函数生成子进程来进行RDB存储。可以在日志文件中看到。建议使用
bgsave相比于save,多出一个配置:
stop-writes-on-bgsave-error yes #后台存储过程中出现错误,是否停止保存操作;默认yes
3 自动执行保存操作(用的是bgsave的方式):
此方法用于在满足特定条件的情况下,由redis服务器来发起指令(bgsave),保存数据。
redis.conf指令:save seconds changes # 在指定时间内(seconds),发生了N次改变(changes ),则自动持久化数据
#一般以前面大,后面小的方式依次配置,需要根据生产环境业务来衡量配置方式
save 900 1 #900秒之内发生1次改变
save 300 10 #300秒之内发生10次改变
save 60 10000 #60秒之内发生10000次改变
4 其它触发保存的方式
4.1 主从全量复制的时候
4.2 服务运行过程中重启(redis-cli中):debug reload
4.3 关闭服务器的时候指定(redis-cli中):shutdown save
5 使用dump.rdb文件恢复redis数据:
只需要将dump.rdb文件复制到对应的redis安装包下,然后在redis.conf中指定这个文件后启动redis服务。
6 RDB优点:
6.1 RDB是一个紧凑的二进制文件,存储效率高。
6.2 RDB存储的是redis在某个时间点的数据快照,非常适合用于数据备份和全量复制等场景
6.3 RDB恢复数据的速度比AOP快很多
6.4 服务器可以每隔N小时执行bgsave备份,将备份文件拷贝到其它服务器中,用于灾备。
7 RDB缺点
7.1 每次读写RDB都是全量数据,占用内存和IO,数据量大的时候效率低。
7.2 无法做到实时持久化,可能丢失数据。
7.3 basave指令每次都要执行fork函数创建子进程,会牺牲掉一些性能。
7.4 Redis的众多版本中未进行RDB文件格式的统一,有可能出现版本服务之间数据格式无法兼容。
二、AOP:过程日志
AOP是以独立日志的方式记录每次写命令,重启redis时再重新执行AOF文件中的命令来恢复数据。
AOF解决了数据持久化的实时性,目前已经是redis持久化的主流方式。
AOF三种写数据策略:
always(每次):每次写入操作都同步到AOF文件,数据零丢失,性能较差。不建议使用,除非对性能要求不高
everysec(每秒):每秒将缓冲区的指令同步到AOF文件。最多丢失一秒内的数据,性能较高。建议使用,默认配置
no(系统控制):由操作系统控制每次同步到AOF文件的周期,整体过程不可控。
1 配置redis.conf
appendonly yes #是否开启AOP,默认不开启。yes | no
appendfilename "6379.aof" #AOF存储文件名
appendfsync everysec #每秒存储一次,always | everysec | no
dir /usr/local/redis/redis-5.0.8/data #文件存储路径,包括持久化文件、日志文件等
2 AOF重写
随着时间的推移,AOF文件会越来越大,使用AOF重写可以“去除很多不必要的或者过时的指令”和”合并一些指令“;可以降低磁盘占有量,提高磁盘利用率,提高持久化效率,降低持久化写的时间,提高IO性能。降低数据恢复用时,提高数据恢复效率。
AOF重写的两种方式:
a、手动重写:redis-cli执行指令:bgrewriteaof
b、自动重写:
auto-aof-rewrite-percentage 100 #自动重写百分比。设为0则关闭重写功能
auto-aof-rewrite-min-size 64mb #达到64mb自动重写。设为0k,则不限制重写最小值
#单位设置:1k => 1000字节、1kb => 1024字节、1m => 1000000字节、1mb => 1024 * 1024字节、1g => 1000000000字节、1gb => 1024 * 1024 * 1024字节
#"info Persistence"指令查看当前大小:aof_current_size、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