Redis 分别提供了
RDB
和AOF
两种持久化机制:
RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中
AOF
则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件
,
以此达到记录数据库状态的目的。
/usr/bin/redis-server /etc/redis/redis.conf
(指定配置文件启动redis)
建议cp一份配置文件,启动时redis指定
RDB
主动执行 save 命令

主动执行 bgsave 命令 (异步,非阻塞 )

关于 RDB 备份的配置信息
(/etc/redis.conf
)
# 时间策略
save 900 1
save 300 10
save 60 10000
# 文件名称
dbfilename dump.rdb
# 文件保存路径
dir /home/work/app/redis/data/
# 如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes
# 是否压缩
rdbcompression yes
# 导入时是否检查
rdbchecksum yes
配置其实非常简单,这里说一下持久化的时间策略
具体是什么意思。
save 900 1
表示900s内如果有1条是写入命令,就触发产生一次快照,可以理解为就进行一次备份
save 300 10
表示300s内有10条写入,就产生快照
关于压缩的配置
rdbcompression yes
,建议没有必要开启,毕竟Redis本身就属于CPU密集型服务器,再开启压缩会带来更多的CPU消耗,相比硬盘成本,CPU更值钱。
假如你的 Redis 服务器允许客户端可以从非本机访问,应该在配置文件中,把
protected-mode
的值设置问 no。
这样的话,客户端就可以从其他主机访问 Redis 服务器了,并且不需要密码
AOF
特点:
AOF 文件保存了 Redis 的数据库状态
, 而文件里面包含的都是符合 Redis 通讯协议格式的命令文本。
AOF 保存的模式
Redis 目前支持三种 AOF 保存模式,它们分别是:
AOF_FSYNC_NO
:不保存。
AOF_FSYNC_EVERYSEC
:每一秒钟保存一次。(生产中一般选这种)
AOF_FSYNC_ALWAYS
:每执行一个命令保存一次

一种是
手动触发
,一种是配置文件执行
配置文件详解
# 是否开启aof
appendonly yes
# 文件名称
appendfilename "appendonly.aof"
# 同步方式
appendfsync everysec
# aof重写期间是否同步
no-appendfsync-on-rewrite no
# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 加载aof时如果有错如何处理
aof-load-truncated yes
# 文件重写策略
aof-rewrite-incremental-fsync yes
还是重点解释一些关键的配置:
appendfsync everyse
c 它其实有三种模式:
always
:把每个写命令都立即同步到aof,很慢,但是很安全
everysec
:每秒同步一次,是折中方案 (生产中一般使用)
no
:redis不处理交给OS来处理,非常快,但是也最不安全
一般情况下都采用 everysec 配置,这样可以兼顾速度与安全,最多损失1s的数据。
aof-load-truncated yes
如果该配置启用,在加载时发现aof尾部不正确是,会向客户端写入一个log,但是会继续执行,如果设置为 no ,发现错误就会停止,必须修复后才能重新加载。
注意:无论是RDB还是AOF都是先写入一个临时文件,然后通过
rename
完成文件的替换工作。
AOF重写机制
rewrite
是AOF的一个机制,用来压缩aof文件,
通过fork一个子进程,重新写一个新的aof文件,该次重写不是读取旧的aof文件进行复制,
而是将读取内存中的redis数据库,重写一份aof文件,有点类似于rdb的快照方式;
触发机制为:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
解释:当rof文件的大小,比旧aof文件大百分之百的时候(2倍),且aof文件的大小大于64mb的时候,触发重写机制;
查看 AOF 文件
[root@s1 ~]# head appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
$5
hello
从持久化中恢复数据
其实想要从这些文件中恢复数据,只需要重新启动Redis即可
恢复机制

在线上我们到底该怎么做?我提供一些自己的实践经验。
1.如果Redis中的数据并不是特别敏感或者可以通过其它方式重写生成数据,可以关闭持久化,如果丢失数据可以通过其它途径补回;
2. 自己制定策略定期检查Redis的情况,然后可以手动触发备份、重写数据;
3.单机如果部署多个实例,要防止多个机器同时运行持久化、重写操作,防止出现内存、CPU、IO资源竞争,让持久化变为串行;
4.可以加入主从机器,利用一台从机器进行备份处理,其它机器正常响应客户端的命令;
5.RDB持久化与AOF持久化可以同时存在,配合使用。
关闭RDB和AOF存储
*关闭rdb的命令:config set save ""
(或者进入配置文件将:
Save 900 1
Save 300 10
Save 60 10000
注释掉,并打开save "" 的注释,使得 save "" 生效,即可关闭rdb;
)
*关闭aof的命令:config set appendfsync no
(或者进入配置文件,将appendonly设置为no,默认是 appendonly no )
(注:appendfsync 是同步机制,默认为appendfsync everysec)
每秒同步一次写操作到aof文件中;
该两种设置查询是否已修改成功,可分别通过config get save
, config get appendfsync
命令来查看。
本文参考:https://juejin.im/post/5b70dfcf518825610f1f5c16
进阶阅读:https://blog.csdn.net/hguisu/article/details/8836819
网友评论