Redis Persistence And RDB Backup

本篇将学习一下 Redis 的持久化机制,以及利用 Redis 的持久化,来做 Redis 数据的备份和迁移。

因为 Redis 是内存数据库,所有的数据库状态(数据库和数据库中的键值对)都存储在内存中,一旦服务器进程退出(断电、重启、Redis 进程异常崩溃等),这些内存中的数据状态将丢失。因此,为了避免数据丢失,必须实施一套持久化的机制,将内存中的数据库状态,保存到磁盘上。
Redis 提供 RDB 和 AOF 两种持久化的功能。

1.1 RDB 持久化

RDB 持久化功能,可以在指定的时间间隔内,生成数据集的时间点快照。 将 Redis 内存数据库状态,保存到磁盘上一个 RDB 文件中,避免数据意外丢失。RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成 RDB 文件时的数据库状态。
【特点】:RDB 文件保存了 Redis 在某个时间点上的数据集。用于保存和还原 Redis 服务器数据库状态。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

1.2 RDB 文件的创建

Redis 有两个命令,可以用于生成 RDB 文件:SAVE 和 BGSAVE
SAVE
会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止。 在进程阻塞期间,服务器不能处理任何命令请求。
BGSAVE
派生出一个子进程,负责创建 RDB 文件,非阻塞父进程,Redis 父进程继续处理命令请求。
配置选项,自动创建
因为 BGSAVE 命令可以在,不阻塞服务器进程的情况下,执行数据库状态的保存。可以通过设置服务器 save 选项,让服务器每隔一段时间,自动执行一次 BGSAVE 命令。从而实现自动保存。

服务器提供的,默认配置项如下: 只要满足三个条件中的任意一个,BGSAVE 命令就会被执行。

  save 900 1          # 服务器在 900 秒之内,对数据库进行了至少 1 次修改
  save 300 10         # 服务器在 300 秒之内,对数据库进行了至少 10 次修改
  save 60 10000       # 服务器在 60 秒之内,对数据库进行了至少 10000 次修改
  

1.3 利用 RDB 持久化迁移 Redis 数据

使用 BGSAVE 保存 Redis 数据库状态,将保存的 RDB 文件,拷贝至相关服务器上的 Redis 数据备份目录下。
启动 Redis 服务时,检测到 RDB 文件的存在,将会被自动载入。从而实现了 Redis 数据的迁移。

  $ redis-cli

  # 查看当前 Redis 数据库的状态
  redis 127.0.0.1:6379> info
  redis_version:2.4.8
  used_memory:946576
  used_memory_human:924.39K
  used_memory_rss:1417216
  used_memory_peak:947008
  used_memory_peak_human:924.81K

  # 保存内存中的数据
  redis 127.0.0.1:6379> SAVE
  OK
  redis 127.0.0.1:6379> BGSAVE
  Background saving started

  # 查询最新一次的保存时间戳
  redis 127.0.0.1:6379> LASTSAVE
  (integer) 1431668219

  # 关闭 Redis 服务器
  redis 127.0.0.1:6379> SHUTDOWN

  # 查看 Redis 的 RDB 文件
  find / -name dump.rdb
  /usr/local/var/db/redis/dump.rdb

  # 将 dump.rdb 文件拷贝至目标服务器,启动 Redis
  redis-server /usr/local/etc/redis.conf
  

2.1 AOF 持久化

AOF 持久化功能,记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
【特点】:AOF 策略默认的文件更新频率是每秒钟执行一次。在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据。AOF 文件有序地保存了对数据库执行的所有写入操作,这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂,对文件进行分析也很轻松。对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。

配置 AOF 项如下:

  # appendonly  no     # 默认关闭,性能好,容易丢失数据
  appendonly  yes      # 启用 AOF 持久化

  # appendfsync always # 一旦接收到写操作,就立即写入磁盘
  appendfsync everysec # 推荐配置,当开启 AOF 时,每秒写入磁盘一次,权衡了速度和安全性
  # appendfsync no     # 不写入磁盘

  no-appendfsync-on-rewrite yes   # 表示 rewrite 期间对新写操作不 fsync
  auto-aof-rewrite-percentage 100 # AOF 文件增加了一倍,则后台 rewrite 自动运行
  auto-aof-rewrite-min-size 64mb  # 进行后面 rewrite 要求的最小 AOF 文件大小
  

Redis 持久化总结

出于对数据安全性的考虑,在机器硬件允许的情况下,建议同时开启 AOF 和 RDB 持久化。 AOF (BGREWRITEAOF) 设置为每秒写入一次磁盘,RDB (BGSAVE) 保持默认设置。

参考链接
Redis Persistence
Redis 持久化

2015-05-15

rocket-wing