Redis持久化
Redis 为了内部数据的安全考虑,会把本身的数据以文件的形式保存到硬盘中一份,在服务器重启后会自动把硬盘的数据恢复到内存(Redis)里面
Redis持久化分为:
RDB 持久化方式
AOF 持久化方式
两种持久化可以同时开启
RDB(Redis DataBase)持久化方式
RDB 持久化是指在指定的时间间隔内将内存中的数据快照写入磁盘,实际操作过程是 fork 一个子进程,先将数据写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储
Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中
RDB 持久化快照名称与路径(redis.conf 文件):
RDB持久化备份频率:
$ save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
$ save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
$ save 60 10000 #60秒内如果超过10000个key被修改,则发起快照保存
优点:
非常适合于备份,比如你可以在
每个小时保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据很方便传送到远端数据中心,非常适用于
灾难恢复RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化Redis的性能
4.与AOF相比,在恢复大的数据的时候,RDB效率更高
缺点:
如果你想保证数据的
高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,你可能会丢失几分钟的数据由于
RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟
手动发起RDB持久化方式:
输入 save
或者 bgsave (bgsave 是开启单独线程)
AOF(Append Only File)持久化方式
AOF 持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据
开启 AOF 持久化(redis.conf)
注:重启 Redis 才生效
AOF 持久化名称与路径:
AOF 持久化备份频率:
# 每次有新命令追加到 AOF 文件时就执行一次同步 :非常慢,也非常安全
$ always
# 每秒同步一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据
# 推荐(并且也是默认)的措施为每秒同步一次, 这种策略可以兼顾速度和安全性
$ everysec
# 从不同步:将数据交给操作系统来处理。更快,也更不安全的选择
$ no
AOF 持久化备份优化:
因为 AOF 的运作方式是不断地将命令追加到文件的末尾, 所以随着写入命令的不断增加, AOF 文件的体积也会变得越来越大
例如, 如果你对一个计数器调用了 100 次 INCR , 那么仅仅是为了保存这个计数器的当前值, AOF 文件就需要使用 100 条记录(entry)。然而在实际上, 只使用一条 SET 命令已经足以保存计数器的当前值了, 其余 99 条记录实际上都是多余的
输入 bgrewriteaof 命令优化 AOF 文件
AOF 文件损坏:
服务器可能在程序正在对 AOF 文件进行写入时宕机, 宕机会造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。
修复出错的 AOF 文件:
为现有的
AOF文件创建一个备份-
使用
Redis附带的redis-check-aof程序,对原来的 AOF文件进行修复:$ redis-check-aof –fix 使用
diff -u对比修复后的 AOF文件和原始 AOF文件的备份,查看两个文件之间的不同之处重启 Redis服务器,等待服务器载入修复后的 AOF文件,并进行数据恢复
优点:
AOF持久化可以带来更高的数据安全性。Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步。使用默认的每秒同步其效率也是非常高的(同步是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题Redis可以在AOF文件体积变得过大时,自动地在后台对AOF进行重写: 重写后的新 AOF文件包含了恢复当前数据所需的最小命令集合。 整个重写操作是绝对安全的,因为Redis在创建新AOF文件的过程中,会继续将命令追加到现有的AOF文件里面,即使重写过程中发生宕机,现有的 AOF文件也不会丢失。 而一旦新 AOF文件创建完毕,Redis就会从旧 AOF文件切换到新 AOF文件,并开始对新 AOF文件进行追加操作AOF文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以Redis协议的格式保存, 因此AOF文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export)AOF文件也非常简单: 举个例子, 如果你不小心执行了FLUSHALL命令, 但只要AOF文件未被重写, 那么只要停止服务器, 移除AOF文件末尾的FLUSHALL命令, 并重启Redis, 就可以将数据集恢复到FLUSHALL执行之前的状态
缺点:
对于
相同的数据来说,AOF文件通常要大于RDB文件根据
同步策略的不同,AOF的运行效率可能会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。不过在处理巨大的写入载入时,RDB可以提供更有保证的最大延迟时间(latency)
从RDB方式切换为AOF方式
在 Redis 2.2 或以上版本,可以在不重启的情况下,从 RDB 切换到 AOF :
为最新的 dump.rdb 文件创建一个备份
将备份放到一个安全的地方
执行以下两条命令:
# 开启 AOF 功能,Redis 会阻塞直到初始 AOF 文件创建完成为止
# 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾
$ redis-cli config set appendonly yes
# 关闭 RDB 功能
$ redis-cli config set save
确保
写命令会被正确地追加到AOF文件的末尾注:在redis.conf中打开AOF功能,否则服务器重启之后, 之前通过CONFIG SET设置的配置就会被遗忘, 程序会按原来的配置来启动服务器。
总结:
如果你对
数据安全性非常重视的话,你应该同时使用两种持久化功能如果你承受
数分钟以内的数据丢失,你可以只使用RDB 持久化
二者选择的标准,就是看是否愿意牺牲一些性能,换取更高的缓存一致性(AOF),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行 save 的时候,再做备份(RDB)。注: 未来 Redis 可能会将 AOF 和 RDB 整合成单个持久化模型.
相关文档:
英文:https://redis.io/topics/persi...
中文:http://www.redis.cn/topics/pe...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。