没有合适的资源?快使用搜索试试~ 我知道了~
Redis的持久化方案.pdf(两种持久化方案:RDB 和 AOF,共15页)
0 下载量 140 浏览量
2024-05-15
11:06:21
上传
评论
收藏 534KB PDF 举报
温馨提示
试读
15页
两种持久化方案:RDB 和 AOF 包含:两钟方案各自的优缺点、如何选择持久化方式、RDB 持久化设置、AOF持久化设置、AOF与RDB之间的相互影响、备份Redis 数据、灾难恢复、Redis 的数据回写机制、灾难恢复模拟
资源推荐
资源详情
资源评论
Redis 数据持久化
总的来说有两种持久化方案:RDB 和 AOF
RDB 方式按照一定的时间间隔对数据集创建基于时间点的快照,是默认的持久化方式。可理解为半持久化模式,即
按照一定的策略周期性的将数据保存到磁盘。
AOF 方式记录 Server 收到的写操作到日志文件,在 Server 重启时通过回放这些写操作来重建数据集。该方式类似于
MySQL 中基于语句格式的 binlog。当日志变大时 Redis 可在后台重写日志。若仅期望数据在 Server 运行期间存在则
可禁用两种持久化方案。在同一 Redis 实例中同时开启 AOF 和 RDB 方式的数据持久化方案也是可以的。该情况下
Redis 重启时 AOF 文件将用于重建原始数据集,因为叫 RDB 方式而言,AOF 方式能最大限度的保证数据完整性。
两钟方案各自的优缺点
RDB
优点
RDB 是 Redis 数据集的基于时间点的紧凑的副本,非常适合于备份场景。比如每个小时对 RDB 文件做一次小的归档,
每天对 RDB 文件做一次大的归档,每月对 RDB 文件做一次更大的归档。这样可以在必要的时刻选择不同的备份版本
进行数据恢复。同时,Redis 的 RDB 文件也是 Redis 主从同步内部实现中的一环。
第一次 Slave 向 Master 同步的实现是:
Slave 向 Master 发出同步请求,Master 先 dump 出 rdb 文件,然后将 rdb 文件全量传输给 slave,然后 Master 把缓
存的命令转发给 Slave,初次同步完成。
第二次以及以后的同步实现是:
Master 将变量的快照直接实时依次发送给各个 Slave。
但不管什么原因导致 Slave 和 Master 断开重连都会重复以上两个步骤的过程。由于是一个紧凑的文件,易于传输到
远程数据中心或 Amazon S3,因此 RDB 非常适合于灾难恢复。RDB 方式的开销较低,在该种方式下 Redis 父进程
所要做的仅是开辟一个子进程来做剩下的事情。与 AOF 相比 RDB 在数据集较大时能够以更快的速度恢复。RDB 的
启动时间会更短,原因有两个:
一是 RDB 文件中每一条数据只有一条记录,不会像 AOF 日志那样可能有一条数据的多次操作记录。所以每条数据只
需要写一次就行了。另一个原因是 RDB 文件的存储格式和 Redis 数据在内存中的编码格式是一致的,不需要再进行
数据编码工作,所以在 CPU 消耗上要远小于 AOF 日志的加载。
RDB
缺点
若需在 Redis 停止工作时(例如意外断电)尽可能保证数据不丢失,那么 RDB 不是最好的方案。例如,通常会每隔
5 分钟或者更长的时间来创建一次快照,如若 Redis 没有被正确的关闭就可能丢失最近几分钟的数据。
RDB 方式需经常调用 fork()函数以开辟子进程来实现持久化。在数据集较大、CPU 性能不够强悍时 fork()调用可能很
耗时从而会导致 Redis 在几毫秒甚至一秒中的时间内不能服务 clients。AOF 也需要调用 fork()但却可以在不影响数据
持久性的条件下调整重写 logs 的频率。
AOF
优点
使用 AOF 方式时 Redis 持久化更可靠:有三种不同的 fsync 策略供选择:no fsync at all、fsync every second、
fsync at every query。默认为 fsync every second 此时的写性能仍然很好,且最坏的情况下可能丢失一秒钟的写操作。
AOF 日志是 append only 方式产生的日志,因此不存在随机访问问题以及意外断电时造成的损毁问题。即使出于某种
原因(如磁盘满)日志以一个写了一半的命令结尾,仍可以使用 redis-check-aof 工具快速进行修复。
当 AOF 日志逐渐变大后,Redis 可在后台自动的重写 AOF 日志。当 Redis 在继续追加旧的 AOF 日志文件时重写日
志是完全安全的。Redis 利用可以重建当前数据集的最少的命令产生一个全新的日志文件,一旦新的日志文件创建完
成 Redis 开始向新的日志文件追加日志。
AOF 日志的格式易于理解易于解析。这在某些场景非常有用。比如,不下心使用 FLUSHALL 命令清空了所有的数据,
同时 AOF 日志没有发生重写操作,那么就可以简单的通过停止 Redis Server 移除日志中的最后一条 FLUSHALL 命
令重启 Redis Server 来恢复数据。
AOF
缺点
同样的数据集 AOF 文件要比 RDB 文件大很多。
根据使用的 fsync 方式不同 AOF 可能比 RDB 慢很多。在使用 no fsync at all 时 AOF 的性能基本与 RDB 持平,在使
用 fsync every second 时性能有所下降但仍然较高,在使用 fsync at every query 时性能较低。然而 RDB 方式却能在
高负载的情况下保证延迟尽可能小。
一些特定的命令可能存在 bug 从而导致重载 AOF 日志时不能重建出完全一样的数据集。这样的 bugs 非常非常罕见,
已经通过测试套件做了充分的测试。这种类型的 bugs 对于 RDB 来说几乎是不可能的。说的更清晰一点:Redis AOF
增量的更新既存的状态而 RDB 快照每次都重新创建,从概念上讲 RDB 方式更加健壮。然而,需要注意两点:每次
AOF 日志被 Redis 重写的时候日志由包含数据集的实际数据重新生成,与追加 AOF 文件的方式相比该方式能有效减
少 bugs 出现的概率;现实的应用场景中还未收到过任何用户关于 AOF 损毁的报告。
如何选择持久化方式?
取决于具体的应用场景,通常,两种方式可同时使用。若比较关心数据但仍能忍受几分钟的数据丢失,那么可以简单
的使用 RDB 方式。有许多用户只使用 AOF 方式,不建议这种做法,一方面以一定时间间隔创建 RDB 快照是创建数
据备份并快速恢复数据的极好的办法,一方面可以避免 AOF 方式可能存在的 bugs。出于上述原因,将来可能将 AOF
和 RDB 方式合二为一。
RDB 持久化设置
默认情况下 Redis 在磁盘上创建二进制格式的命名为 dump.rdb 的数据快照。可以通过配置文件配置每隔 N 秒且数据
集上至少有 M 个变化时创建快照、是否对数据进行压缩、快照名称、存放快照的工作目录。redis 的默认配置如下:
1. #900 秒后且至少 1 个 key 发生变化时创建快照
2. save 900 1
3. #300 秒后且至少 10 个 key 发生变化时创建快照
4. save 300 10
5. #60 秒后且至少 10000 个 key 发生变化时创建快照
6. save 60 10000
7. #可通过注释所有 save 开头的行来禁用 RDB 持久化
8. #创建快照时对数据进行压缩
9. rdbcompression yes
10. #快照名称
11. dbfilename dump.rdb
12. #存放快照的目录(AOF 文件也会被存放在此目录)
13. dir /usr/local/redis/
关于配置参数的详细信息可参阅 redis.conf 中的说明。
除了通过配置文件进行设置外也可以通过手工执行命令来创建快照
SAVE 命令执行一个同步操作,以 RDB 文件的方式保存实例中所有数据的快照。一般不在生产环境直接使用 SAVE
命令,因为会阻塞所有的客户端的请求,可以使用 BGSAVE 命令代替,BGSAVE 后台创建数据快照。命名执行结果
的状态码会立即返回。Redis 开辟一个子进程,父进程继续相应客户端请求,子进程保存 DB 到磁盘后退出。客户端
可通过执行 LASTSAVE 命令检查操作是否成功。
创建
RDB
快照的工作流程
Redis 需 dump 数据集到磁盘时会执行下列过程:
Redis forks 一个子进程;
子进程写数据集到临时的 RDB 文件;
子进程写完新的 RDB 文件后替换旧的 RDB 文件。
该方式使 Redis 可以利用 copy-on-write 机制的好处。
AOF持久化设置
利用快照的持久化方式不是非常可靠,当运行Redis的计算机停止工作、意外掉电、意外杀掉了Redis进程那么最近写
入Redis的数据将会丢。对于某些应用这或许不成问题,但对于持久化要求非常高的应用场景快照方式不是理想的选
择。AOF文件是一个替代方案,用以最大限度的持久化数据。同样,可以通过配置文件来开闭AOF:
1. #关闭AOF
2. appendonly no
3. #打开AOF
4. appendonly yes
当设置appendonly为yes后,每次Redis接收到的改变数据集的命令都会被追加到AOF文件。重启Redis后会重放AOF
文件来重建数据。还可以通过配置文件配置AOF文件名、调用fsync的频率、调用fsync的行为、重写AOF的条件。
redis 的默认配置如下:
1. #默认 AOF 文件名
2. appendfilename appendonly.aof
3. #每秒调用一次 fsync 刷新数据到磁盘
4. appendfsync everysec
5. #当进程中 BGSAVE 或 BGREWRITEAOF 命令正在执行时不阻止主进程中的 fsync()调用(默认为 no,当存在延迟问题时需调整
为 yes)
6. no-appendfsync-on-rewrite no
7. #当 AOF 增长率为 100%且达到了 64mb 时开始自动重写 AOF
8. auto-aof-rewrite-percentage 100
9. auto-aof-rewrite-min-size 64mb
各参数含义可参阅redis.conf中详细说明。
几点说明
日志重写
随着Redis接收到的命令的增加AOF文件会变得越来越大。Redis支持日志重写特性,可以在不影响响应客户端的前提
下在后台重构AOF文件。当在Redis中执行BGREWRITEAOF后Redis将使用构建数据集所需的最少的命令来重构日志
文件。Redis2.2中需要经常手动运行BGREWRITEAOF,Redis2.2开始支持自动触发日志重写。
日志重写同样使用copy-on-write机制,流程大致如下:
Redis开辟一个子进程;
子进程在临时文件中写新的AOF文件;
父进程将所有新的更改缓存在memory中(同时新更改被写入旧的AOF,这样即使重写操作失败了也是安全的);
在子进程重写好临时AOF后父进程收到一个信号并追加memory中缓冲的更改到子进程产生的临时文件的末尾;
Redis进行文件重命名用新的文件替换旧的文件并开始追加新的数据到新文件。
fsync
调用模式
该模式决定了Redis刷新数据到磁盘的频率,有三个可选项:
no fsync at all 全由操作系统决定刷数据的时机。最快但最不安全。
fsync every second 每秒一次刷新。足够快,最多可丢失一秒的数据。
fsync at every query 每次记录一条新的命令到AOF便刷一次数据到磁盘。最慢但最安全。
默认策略(也是默认策略)为fsync every second
剩余14页未读,继续阅读
资源评论
平底斜
- 粉丝: 1070
- 资源: 55
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功