04_Redis之持久化机制
04_Redis之持久化机制
redis 是一个支持持久化的内存数据库,也就是说 redis 需要经常将内存中的数据同步到磁盘来保证持久化。redis 支持两种持久化方式,一种是Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写AOF)的方式。
RDB:将当前数据保存到硬盘(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),默认的持久化方式。
AOF:将每次执行的写命令保存到硬盘(原理是将Reids的操作日志以追加的方式写入文件),主流的持久化方式。
一、SNAPSHOTTING 方式
快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中。
指定的时间间隔能对你的数据进行快照存储。指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb 文件。Redis 重启会通过加载 dump.rdb 文件恢复数据。(/var/lib/redis/)
快照保存过程
redis 调用fork,现在有了子进程和父进程。
父进程继续处理 client 请求,子进程负责将内存内容写入到临时文件。由于os 的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时 os 会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程地址空间内的数据是fork时刻整个数据库的一个快照。
当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
触发快照的方式
- 执行shutdown命令,会触发快照
- 执行flushall命令,会触发快照
- 手动执行save或者bgsave命令,会触发快照
- 在指定的时间间隔内,执行指定次数的写操作(自动触发)(两个条件要都成立)
优缺点
优点
- 适合大规模数据的恢复,恢复速率是比较快的
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
- 使用的是二进制进行存储
缺点
- 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
- 备份时占用内存,因为Redis 在备份时会独立创建一个fork子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍(写时复制)),最后再将临时文件替换之前的备份文件。
二、AOF方式
############################## 仅追加模式 ###############################
# 默认情况下,Redis 异步将数据集转储到磁盘。这种模式在许多应用程序中已经足够好,
# 但 Redis 进程问题或电源故障可能导致几分钟的写入丢失(取决于配置的保存点)。
#
# 仅追加文件是一种替代的持久化模式,提供了更好的持久性。
# 例如,使用默认的数据 fsync 策略(见配置文件后面的部分),
# Redis 在服务器电源故障等严重事件中可能仅丢失一秒钟的写入,或者在 Redis 进程本身发生问题时仅丢失一次写入,但操作系统仍在正常运行。
#
# AOF 和 RDB 持久化可以同时启用而不会出现问题。如果在启动时启用了 AOF,Redis 将加载 AOF 文件,该文件具有更好的持久性保证。
#
# 更多信息请查看 https://redis.io/topics/persistence。
appendonly no # 打开/关闭追加模式持久化
# 仅追加文件的基本名称。
#
# Redis 7 及更高版本使用一组仅追加文件来持久化数据集及其更改。使用的基本文件类型有两种:
#
# - 基本文件,表示文件创建时数据集的完整状态。基本文件可以是 RDB(二进制序列化)或 AOF(文本命令)形式。
# - 增量文件,包含在前一个文件之后应用于数据集的附加命令。
#
# 此外,清单文件用于跟踪文件及其创建顺序和应用顺序。
#
# 仅追加文件名由 Redis 根据特定模式创建。文件名的前缀基于 'appendfilename' 配置参数,后跟有关序列和类型的附加信息。
#
# 例如,如果 appendfilename 设置为 appendonly.aof,可以派生出以下文件名:
#
# - appendonly.aof.1.base.rdb 作为基本文件。
# - appendonly.aof.1.incr.aof, appendonly.aof.2.incr.aof 作为增量文件。
# - appendonly.aof.manifest 作为清单文件。
appendfilename "appendonly.aof"
# 为了方便,Redis 将所有持久化的仅追加文件存储在一个专用目录中。目录的名称由 appenddirname 配置参数确定。
appenddirname "appendonlydir"
# fsync() 调用告诉操作系统实际将数据写入磁盘,而不是等待输出缓冲区中的更多数据。
# 某些操作系统会真正将数据刷新到磁盘,而其他操作系统只会尽快尝试这样做。
#
# Redis 支持三种不同的模式:
#
# no: 不进行 fsync,让操作系统在需要时刷新数据。更快,持久化没保证。
# always: 每次写入仅追加日志后进行 fsync。较慢,最安全。
# everysec: 每秒仅进行一次 fsync。折衷方案。
#
# 默认是 "everysec",因为这通常是速度和数据安全性之间的正确折衷。
# 你可以根据情况决定是否可以将其放宽为 "no",让操作系统在需要时刷新输出缓冲区,以获得更好的性能
# (但如果你能接受一些数据丢失,可以考虑使用默认的快照持久化模式),或者相反,使用 "always",虽然非常慢,但比 everysec 更安全。
#
# 更多详情请查看以下文章:
# http://antirez.com/post/redis-persistence-demystified.html
#
# 如果不确定,请使用 "everysec"。
# appendfsync always
appendfsync everysec
# appendfsync no
# 自动重写仅追加文件。
# Redis 能够在 AOF 日志大小增长到指定百分比时隐式调用 BGREWRITEAOF 自动重写日志文件。
#
# 工作原理如下:Redis 记住最新重写后的 AOF 文件大小(如果自重启以来未发生重写,则使用启动时的 AOF 大小)。
#
# 将此基本大小与当前大小进行比较。如果当前大小大于指定百分比,则触发重写。
# 此外,你还需要指定 AOF 文件重写的最小大小,这对于避免在达到百分比增长但文件仍然很小的情况下重写 AOF 文件非常有用。
#
# 指定百分比为零以禁用自动 AOF 重写功能。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 在 Redis 启动过程中,当 AOF 数据加载回内存时,可能会发现 AOF 文件在末尾被截断。
# 这可能发生在运行 Redis 的系统崩溃时,特别是在 ext4 文件系统未使用 data=ordered 选项挂载时
# (然而,当 Redis 本身崩溃或中止但操作系统仍在正常运行时,这种情况不会发生)。
#
# Redis 可以在此情况下退出并报错,或者尽可能多地加载数据(现在是默认行为)并在发现 AOF 文件在末尾被截断时启动。以下选项控制此行为。
#
# 如果 aof-load-truncated 设置为 yes,则加载被截断的 AOF 文件,并且 Redis 服务器开始发出日志以通知用户该事件。
# 否则,如果选项设置为 no,服务器将报错并拒绝启动。当选项设置为 no 时,用户需要在重新启动服务器之前使用 "redis-check-aof" 工具修复 AOF 文件。
#
# 请注意,如果 AOF 文件在中间被发现损坏,服务器仍将报错退出。此选项仅适用于 Redis 尝试从 AOF 文件读取更多数据但未找到足够字节的情况。
aof-load-truncated yes
自动重写仅追加文件具体过程
- redis 调用fork ,现在有父子两个进程;
- 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令;
- 父进程继续处理 client 请求,除了把写命令写入到原来的aof 文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
- 当子进程把快照内容以写入命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
- 现在父进程可以使用临时文件替换老的aof 文件,并重命名,后面收到的写命令也开始往新的aof 文件中追加。
需要注意到是重写aof 文件的操作,并没有读取旧的aof 文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof 文件。
优缺点
优点
-
对数据的完整性与一致性的比较高
-
数据的丢失比较小(相对RDB而言)
缺点
- 不适合大规模数据的恢复,因为恢复的速率比较慢,需要将所有的写命令重新执行一次
- 因为使用的是文件追加的模式,所以文件的体积会比较大
总结
- 两种持久化的方式可以同时存在,如果对数据的恢复速率比较快,可以选择rdb持久化;如果对数据的完整性与一致性要求比较高(更加精确),可以选择aof持久化
- 单独使用aof持久化的方式,也是可以启动服务器的
- 如果aof持久化是唯一的方式,那么如果该文件损坏了,就不能启动服务器
- 如果aof文件损坏了,可以使用修复命令进行修复文件,
redis-check-aof appendonly.aof.1.incr.aof

浙公网安备 33010602011771号