Redis持久化详解
Redis是一个支持持久化的内存数据库,也就是说Redis需要经常将内存中的数据同步到磁盘来保证持久化,避免因某些原因(比如突然断电)造成的数据丢失问题,即保证数据的安全性。Redis支持两种持久化方式,一种是RDB(快照)也是默认方式,另一种是AOF(Append-only file)的方式。
一、RDB简介
RDB是Redis DataBase缩写,功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数。RDB持久化是把当前进程数据生成快照保存到硬盘的过程。
二、RDB的配置
<span style="color:#000000"><span style="background-color:#282c34"><code># 时间策略
save 900 1
save 300 10 # 表示300s内有10条写入,就产生快照
save 60 10000
# 文件名称
dbfilename dump.rdb
# 文件保存路径
dir /home/work/app/redis/data/
# 如果持久化出错,主进程是否停止写入(保护持久化的数据一致性问题)
stop-writes-on-bgsave-error yes
# 是否压缩
rdbcompression yes
# 导入时是否检查
rdbchecksum yes
</code></span></span>
三、RDB的原理
在Redis中RDB持久化的触发分为两种:手动触发与定时触发。
1、手动触发
-
save:会阻塞当前Redis服务器,直到持久化完成,线上应该禁止使用。
-
bgsave:该触发方式会fork一个子进程,由子进程负责持久化过程,因此阻塞只会发生在fork子进程的时候。
2、自动触发
-
根据我们的 save m n 配置规则自动触发;
-
从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发 bgsave;
-
执行 debug reload 时;
-
执行 shutdown时,如果没有开启aof,也会触发。
3、bgsave的持久化过程
这里注意的是 fork 操作会阻塞,导致Redis读写性能下降。我们可以控制单个Redis实例的最大内存,来尽可能降低Redis在fork时的事件消耗。以及上面提到的自动触发的频率减少fork次数,或者使用手动触发,根据自己的机制来完成持久化。
四、AOF简介
以独立日志的方式记录每次写命令,重启时在重新执行AOF文件中的命令达到恢复数据的目的。主要作用:解决了数据持久化的实时性。
五、AOF的配置
<span style="color:#000000"><span style="background-color:#282c34"><code># 是否开启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时如果有错如何处理(向客户端写入一个log,但是会继续执行)
aof-load-truncated yes
# 文件重写策略
aof-rewrite-incremental-fsync yes
</code></span></span>
六、AOF原理
-
所有的写入命令会追加到aof_buf(缓冲区:减小磁盘负载)中。
-
AOF缓冲区根据对应的策略向磁盘做同步操作。
-
随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
-
当Redis服务器重启时,可以加载AOF文件进行数据恢复。
存储结构:redis通讯协议(RESP )格式的命令文本存储,兼容性好、追加方便、可读性高。
七、从持久化中恢复数据
数据的备份、持久化做完了,我们如何从这些持久化文件中恢复数据呢?如果一台服务器上有既有RDB文件,又有AOF文件,该加载谁呢?其实想要从这些文件中恢复数据,只需要重新启动Redis即可。
启动时会先检查AOF文件是否存在,如果不存在就尝试加载RDB。那么为什么会优先加载AOF呢?因为AOF保存的数据更完整,通过上面的分析我们知道AOF基本上最多损失1s的数据。
八、两种持久化方法的优缺点及优化
1、AOF的优点
-
最安全,在启用appendfsync always时,任何已写入的数据都不会丢失,使用在启用appendfsync everysec也至多只会丢失1秒的数据。AOF文件在发生断电等问题时也不会损坏,即使出现了某条日志只写入了一半的情况,也可以使用redis-check-aof工具轻松修复。
-
AOF文件易读,可修改,在进行了某些错误的数据清除操作后,只要AOF文件没有rewrite,就可以把AOF文件备份出来,把错误的命令删除,然后恢复数据。
2、AOF的缺点:
-
AOF文件通常比RDB文件更大;
-
性能消耗比RDB高;
-
数据恢复速度比RDB慢。
3、RDB的优点
-
对性能影响最小。如前文所述,Redis在保存RDB快照时会fork出子进程进行,几乎不影响Redis处理客户端请求的效率。
-
每次快照会生成一个完整的数据快照文件,所以可以辅以其他手段保存多
个时间点的快照(例如把每天0点的快照备份至其他存储媒介中),作为非常可靠的灾难恢复手段。 -
使用RDB文件进行数据恢复比使用AOF要快很多。
4、RDB的缺点
-
快照是定期生成的,所以在Redis crash时或多或少会丢失一部分数据。
-
如果数据集非常大且CPU不够强(比如单核CPU),Redis在fork子进程时可能会消耗相对较长的时间,影响Redis对外提供服务的能力。
转发自:Redis持久化详解-CSDN博客