Redis 的两种持久化方式

86 阅读4分钟

1、Redis 的两种持久化方式

阅读关键字:持久化方式、持久化的优势和劣势、持久化时线程执行过程、数据备份。

1.1、RDB(Redis Database)

在固定的时间间隔以快照的方式将数据定期存储到磁盘当中。文件一般保存在 dump.rdb 中。

可以手动执行 SAVE 或者 BGSAVE 将数据写入到磁盘当中。但是 save 会阻塞所有客户端,BGSAVE 会在后台执行写入,所以在生成环境当中还是 BGSAVE 执行更好一点。

执行过程

在进行数据写入时,父线程会创建一个子线程,子线程会将数据写入到一个临时的 RDB 文件当中,当子线程写入完毕之后,会将临时的 RDB 文件替换旧的文件。

什么时候会发生数据丢失

1、突然断电或者服务器停止运行。

2、通过 kill -9 关闭进程。

优势

在大数据集当中,相比于 AOF 能够更加快速的启动。

父线程通过创建子线程完成持久化,父线程永远不会执行 IO 操作或者类似的相关操作。

缺点

数据可靠性相较于 AOF 来说更低,如果出现突然断电的情况,RDB 可能会丢失最新时间的数据。

配置

save 60 1000

每隔 60 秒检查一次,如果出现 1000 个 key 发生变化,则触发一次 RDB 写入机制。可以配置多个监测点。可以通过 save "" 指令禁用 RDB;

1.2、AOF (Append Only File)

AOF 持久化方式每一次写操作都将会它记录到文件当中,当 redis 重启时会把 AOF 产生的文件全部执行一遍。

从 7.0.0 版本开始,redis 变成了多文件 AOF 机制。也就是将单个 AOF 文件拆分成基础文件(最多一个)和增量文件(可能有多个)。基础文件是未启动时的快照文件(RDB 或者 AOF 格式),增量文件是启动以来的 AOF 文件。

日志重写

AOF 中可能存在 100 次对单个 key 的操作,这样可能实际有效条数是一条,开启日志重写功能后会保留最终有效的一条。

优势

相较于 RDB 来说数据更加可靠,它有着不同的 fsync 策略,appendfsync no 、appendfsync everysec(每秒) 或者 appendfsync always(每次请求) 。默认的策略是 appendfsync everysec。AOF 最多丢失 1 秒的写入数据。

appendfsync no 会将数据的更新交由操作系统操作,通常 linux 每 30 秒刷新一次。

不会出现因为断电而损坏数据,即时因为磁盘已满或者其他原因导致的写数据写到一半而中断,可以使用 redis-check-aof 工具轻松的修复它。

缺点

文件比 RDB 大。

写入速度比 RDB 慢。

恢复比 RDB 慢。

配置

appendonly yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

这个是默认配置,auto-aof-rewrite-percentage 为超过百分比,auto-aof-rewrite-min-size 为重写触发机制,超过了该大小才会触发重写机制。这个配置的意思是当 AOF 文件超过 64MB 的时候,如果大小达到了 128MB (假设启动前的 AOF 文件大小是 64MB)也就是达到了原值的 100%,就会触发重写。

1.3、No persistence

禁用持久化,每次重启后数据都将丢失。

1.4、RDB + AOF

每次 redis 重启时,先加载 RDB 文件,然后执行 AOF 增量文件。

1.5、RDB 如何在运行时切换 AOF

redis >= 2.2

  • 备份最新的 dump.rdb 文件
  • 将文件移动到备份文件夹
  • 执行 redis-cli config set appendonly yes redis-cli config set save "" 命令
  • 确保数据库中的 key 数量与 rdb 文件数量一致。

redis-cli config set appendonly yes 作用是启用 AOF 持久化。

redis-cli config set save "" 作用是关闭 RDB 持久化,当前操作时可选的。

1.6、数据备份

RDB 备份

直接复制 RDB 文件就可以实现备份

AOF 备份

redis <= 7.0.0,复制 AOF 文件,可能存在数据截断问题,但是 AOF 还是能够加载它,只不过会丢弃最后一个不正确的命令。