【Redis】RDB & AOF 持久化 [ 编程杂谈 ]
大数据男孩 文章 正文
明妃
{{nature("2022-08-14 17:23:19")}}更新什么是持久化
Redis 是内存数据库,数据保存在内存中,当关机时,内存中的数据也就丢失了。
持久化就是把内存
中的数据写入
到磁盘
上,保存内存在断电情况下,数据也不会丢失。
RDB (Redis DataBase)
- RDB 文件是在硬盘上的
二进制文件
; - RDB 文件是 Redis 在内存存储的数据在
某一时刻的快照
; - RDB 文件可在 Redis
启动
的时候自动载入
; - RDB 文件是 Redis 节点
复制
时的媒介
;
[]()
相关配置
# RDB自动持久化规则
# 当 900 秒内有至少有 1 个键被改动时,自动进行数据集保存操作
save 900 1
# 当 300 秒内有至少有 10 个键被改动时,自动进行数据集保存操作
save 300 10
# 当 60 秒内有至少有 10000 个键被改动时,自动进行数据集保存操作
save 60 10000
# RDB持久化文件名
dbfilename dump.rdb
# 数据持久化文件存储目录
dir ./
# bgsave发生错误时是否停止写入,通常为yes
stop-writes-on-bgsave-error yes
# rdb文件是否使用压缩格式
rdbcompression yes
# 是否对rdb文件进行校验和检验,通常为yes
rdbchecksum yes
持久化过程
Redis 会单独创建
一个子线程
来进行持久化操作,会先将内存中
的数据写入
到一个文件
中,待持久化结束后,再替换
掉上次持久化的文件
,整个过程中,主进程不进行
IO 操作,保证了性能。
缺点:最后一次持久化的数据可能丢失(子进程还没有写入完成就被某种原因关闭)
触发 RDB 持久化机制的方式
手动触发
save
、bgsave
save 命令
会阻塞
Redis服务器进程
,直到RDB文件创建完毕为止,在Redis服务器阻塞期间
,服务器不能处理任何命令请求
。bgsave 命令
会创建
一个子进程,由子进程
来负责创建
RDB文件,父进程(即Redis主进程)则继续处理请求
。
127.0.0.1:6379> save
OK
127.0.0.1:6379> bgsave
Background saving started
自动触发规则,在配置文件配置
save 900 1
save 300 10
save 60 10000
[]()
AOF(Append Only File)
快照功能(RDB)并不是
非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入
、且仍未保存
到快照中的那些数据。 从 1.1 版本开始, Redis 增加了一种完全耐久
的持久化方式: AOF 持久化。
- 需要在配置文件开启,重启 Redis 服务生效。
appendonly yes
相关配置
# 开启AOF持久化方式
appendonly yes
# AOF持久化文件名
appendfilename appendonly-<port>.aof
# appendfsync always # 每次修改值,都会同步数据到磁盘,消耗资源
appendfsync everysec # 每秒把缓冲区的数据同步到磁盘
# appendfsync no # 不执行数据同步,让操作系统在需要的时候刷新数据
# 数据持久化文件存储目录
dir ./
# 是否在执行重写时不同步数据到AOF文件
# 这里的 yes,就是执行重写时不同步数据到AOF文件
no-appendfsync-on-rewrite yes
# 触发AOF文件执行重写的最小尺寸
auto-aof-rewrite-min-size 64mb
# 触发AOF文件执行重写的增长率
auto-aof-rewrite-percentage 100
执行流程
windows 下需要使用
redis-server.exe redis.windows.conf
启动,配置文件才生效
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> set k4 v4
OK
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> set k5 v5
OK
可以看到修改值的操作都被记录下来了
[]()
AOF 文件修复
Redis 自带有
redis-check-aof
程序,用来修复 AOF 文件,修复后的文件能打开
,但会出现数据丢失
的情况,至少比 不能打开好
。
删除 RDB 文件(里面有完整数据),破坏 AOF 文件(删除某些文件),模拟数据被破坏的场景。 []()
启动 Redis 服务,启动失败
[]()
使用 aof 修复工具,修复成功 []()
再次启动 Redis 服务,启动成功
[]()
查看所有的 Key
,发现只有两个,其他的已经丢失,至少能打开了
[]()
扩展 对比
-
RDB AOF 启动优先级 低 高 体积 小 大 恢复速度 快 慢 数据安全性 丢数据 根据策略决定
- RDB持久化方式能够在
指定
的时间间隔能对你的数据进行快照存储- AOF持久化方式
记录每
次对服务器写
的操作,当服务器重启的时候会重新执行
这些命令恢复
原始的数据,AOF命令以 Redis 协议追加保存每次写的操作到文件末尾。 - Redis还能对AOF文件进行
后台重写
(缩减某些格式),使得AOF文件的体积不至于过大。
- AOF持久化方式
只做缓存
,如果你只希望你的数据在服务器运行的时候存在,你也可以不使用
任何持久化方式.同时开启
两种持久化方式- 在这种情况下,当Redis重启的时候会
优先
载入AOF文件
来恢复
原始的数据, 因为在通常情况下AOF文件
保存的数据集要比RDB文件
保存的数据集要完整
。 - RDB的数据
不实时
,同时使用
两者时服务器重启也只会找AOF文件
。那要不要只使用AOF呢?作者建议不要
,因为RDB更适合
用于备份数据库
(AOF在不断变化不好备份),快速重启
,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。
- 在这种情况下,当Redis重启的时候会
- 性能建议:
- 因为
RDB文件
只用作后备用途
,建议只在Slave
上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。 - 如果启用 AOF,好处是在
最恶劣情况
下也只会丢失不超过两秒
数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO
,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的
。只要硬盘许可,应该尽量减少AOF rewrite的频率
,AOF重写的基础大小默认值64M太小
了,可以设到5G以上
。默认超过原大小100%大小时重写可以改到适当的数值。 - 如果不启用 AOF ,仅靠
Master-Slave Replication
(主从复制) 实现高可用性也可以。能省掉
一大笔IO
也减少
了rewrite
时带来的系统波动。代价是如果Master/Slave
同时倒掉,会丢失十几分钟
的数据,启动脚本也要比较
两个Master/Slave中的RDB文件,载入较新
的那个。
- 因为
{{nature('2020-01-02 16:47:07')}} {{format('12641')}}人已阅读
{{nature('2019-12-11 20:43:10')}} {{format('9527')}}人已阅读
{{nature('2019-12-26 17:20:52')}} {{format('7573')}}人已阅读
{{nature('2019-12-26 16:03:55')}} {{format('5017')}}人已阅读
目录
标签云
一言
评论 0
{{userInfo.data?.nickname}}
{{userInfo.data?.email}}