Redis - 持久化

一、RDB 持久化

描述:会在指定的时间间隔内将内存中的数据集快照写入磁盘。

工作机制:

  • Redis 调用 fork()。于是我们有了父子两个进程。
  • 子进程开始将数据集写入一个临时 RDB 文件。
  • 当子进程完成了新 RDB 文件,替换掉旧文件。

优点:

  • RDB 文件适合用于备份,是一种表示某个即时点数据集的紧凑文件。例如,你可能想要每小时归档最近 24 小时的 RDB 文件,每天保存近 30 天的 RDB 快照。这允许你很容易的恢复不同版本的数据集以容灾。
  • RDB 非常适合于灾难恢复。作为一个紧凑的单一文件,可以被传输到其他设备上。
  • 性能最大化。因为 Redis 父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘 IO 这样的操作。
  • RDB 在重启保存了大数据集的实例时比 AOF 要快。

缺点:

  • 若想保证数据的高可用性能,即最大限度地避免数据丢失,RDB 将不是一个很好的选择。因为每隔一段时间会进行一次备份,若中途出现宕机,那最近的修改就会丢失。
  • RDB 经常调用 fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且 CPU 性能不够强大的话,Redis 会停止服务客户端几毫秒甚至一秒。AOF 也需要 fork(),但是你可以调整多久频率重写日志而不会有损持久性。

二、AOF 持久化(append-on file)

描述:快照并不是非常具有可持久性。如果电脑停机了,电源线断了,最近写入 Redis 的数据将会丢失。所以 AOF 是一个替代方案,是 Redis 的完全可持久性策略。

工作机制:在服务端记录每次收到的写操作,将会被追加到 AOF 中。在服务器启动时会根据这些操作重建原始数据集。

如何开启:

appendonly yes

三种同步方式的配置:

// 每次有数据修改发生时都会写入AOF文件
appendfsync always
// 每秒钟同步一次,该策略为AOF的缺省策略
appendfsync everysec
// 从不同步。高效但是数据不会被持久化
appendfsync no

优点:

  • 更高的数据安全性,即数据持久性。有三种同步策略:每秒同步,每修改同步,不同步。默认为每秒同步策略,写性能也仍然很不错(同步是由后台线程完成的,主线程继续努力地执行写请求)。
  • AOF 日志是一个追加文件,即使出现宕机现象,也不会破坏文件的已有内容。即使由于某种原因文件末尾是一个写到一半的命令(磁盘满或者其他原因),redis-check-aof 工具也可以很轻易的修复。
  • AOF 文件变得很大时,Redis 会自动在后台进行重写。重写是绝对安全的,因为 Redis 继续往旧的文件中追加,使用创建当前数据集所需的最小操作集合来创建一个全新的文件,一旦第二个文件创建完毕,Redis 就会切换这两个文件,并开始往新文件追加。
  • AOF 文件里面包含一个接一个的操作,以易于理解和解析的格式存储。你也可以轻易的导出一个 AOF 文件。例如,即使你不小心错误地使用 FLUSHALL 命令清空一切,如果此时并没有执行重写,你仍然可以保存你的数据集,你只要停止服务器,删除最后一条命令,然后重启 Redis 就可以。

缺点:

  • 对同样的数据集,AOF 文件通常要大于等价的 RDB 文件。
  • AOF 可能比 RDB 慢,这取决于准确的 fsync 策略。通常 fsync 设置为每秒一次的话性能仍然很高,如果关闭 fsync,即使在很高的负载下也和 RDB 一样的快。不过,即使在很大的写负载情况下,RDB 还是能提供能好的最大延迟保证。
  • 在过去,我们经历了一些针对特殊命令(例如,像 BRPOPLPUSH 这样的阻塞命令)的罕见 bug,导致在数据加载时无法恢复到保存时的样子。这些 bug 很罕见,我们也在测试套件中进行了测试,自动随机创造复杂的数据集,然后加载它们以检查一切是否正常,但是,这类 bug 几乎不可能出现在 RDB 持久化中。为了说得更清楚一点:Redis AOF 是通过递增地更新一个已经存在的状态,像 MySQL 或者 MongoDB 一样,而 RDB 快照是一次又一次地从头开始创造一切,概念上更健壮。但是,1)要注意 Redis 每次重写 AOF 时都是以当前数据集中的真实数据从头开始,相对于一直追加的 AOF 文件(或者一次重写读取老的 AOF 文件而不是读内存中的数据)对 bug 的免疫力更强。2)我们还没有收到一份用户在真实世界中检测到崩溃的报告。

如何修复损坏的 AOF 文件,文件损坏后 Redis 就无法装载了,可以使用下面步骤解决这个问题

  • 创建 AOF 的一个拷贝用于备份。
  • 使用 Redis 自带的 redis-check-aof 工具来修复原文件:$ redis-check-aof --fix <filename>
  • 使用 diff -u 来检查两个文件有什么不同。用修复好的文件来重启服务器。

三、如何选择持久化机制

1). RDB

2). AOF

3). 可以完全禁止持久化。

4). RDB + AOF

我们该选谁:

通常来说,你应该同时使用这两种持久化方法。

如果你很关注你的数据,但是仍然可以接受灾难时有几分钟的数据丢失,你可以只单独使用 RDB。

有很多用户单独使用 AOF,但是我们并不鼓励这样,因为时常进行 RDB 快照非常方便于数据库备份,启动速度也较之快,还避免了 AOF 引擎的 bug。

四、如何从 RDB 切换到 AOF

  • 备份你最新的 dump.rdb 文件。
  • 把备份文件放到一个安全的地方。
  • 发送以下两个命令:
  • redis-cli config set appendonly yes
  • redis-cli config set save ""
  • 确保你的数据库含有其包含的相同的键的数量。
  • 确保写被正确的追加到 AOF 文件。

第一个 CONFIG 命令开启 AOF。Redis 会阻塞以生成初始转储文件,然后打开文件准备写,开始追加写操作。

第二个 CONFIG 命令用于关闭快照持久化。这一步是可选的,如果你想同时开启这两种持久化方法。

重要:记得编辑你的 redis.conf 文件来开启 AOF,否则当你重启服务器时,你的配置修改将会丢失,服务器又会使用旧的配置。

时间: 2024-10-06 00:07:18

Redis - 持久化的相关文章

Redis持久化

Redis持久化功能简介: Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边. 数据保存到硬盘的过程就称为“持久化”效果. Redis持久化的两种方式:snap shotting  快照持久化  /  append only file   AOF持久化 snap shotting快照持久化 该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(10-20G)就不适合频繁进行

解密Redis持久化

本文内容来源于 Redis 作者博文,Redis 作者说,他看到的所有针对 Redis 的讨论中,对 Redis持久化的误解是最大的,于是他写了一篇长文来对 Redis 的持久化进行了系统性的论述.文章非常长,也很值得一看,NoSQLFan 将主要内容简述成本文. 什么是持久化,简单来讲就是将数据放到断电后数据不会丢失的设备中.也就是我们通常理解的硬盘上. 写操作的流程 首先我们来看一下数据库在进行写操作时到底做了哪些事,主要有下面五个过程. 客户端向服务端发送写操作(数据在客户端的内存中) 数

Redis持久化以及其原理

一.Redis持久化 Redis之所以强大是因为其将所有数据都直接存储在内存中.可是,为了使Redis在重启后数据仍然不丢失,就需要把数据以某种方式持久化到磁盘中(这是使用它作系统缓存的一大优势).Redis支持两种方式进行持久化,一种是RDB,一种是AOF,可以使用一种方式,也可以混合使用它们两种方式. 二.RDB方式(默认的持久化方式) 2.1 RDBa方式简介 其实是通过snapshot快照的方式进行持久化的,当符合一定条件时,Redis会自动将内存中的所有数据快照存储到磁盘中.进行快照的

Redis持久化实践及灾难恢复模拟

参考资料: Redis Persistence http://redis.io/topics/persistence Google Groups https://groups.google.com/forum/?fromgroups=#!forum/redis-db 一.对Redis持久化的探讨与理解 目前Redis持久化的方式有两种: RDB 和 AOF 首先,我们应该明确持久化的数据有什么用,答案是用于重启后的数据恢复. Redis是一个内存数据库,无论是RDB还是AOF,都只是其保证数据恢

redis持久化与可用性

redis对于持久化有快照及aof日志文件两种形式. 快照db文件,优点是二进制,大小比aof日志文件小.但会丢失最后一次成功备份时间到down机时间的数据. aof相比而言文件大小就大了点,但相对快照来讲,不大容易丢失文件. 目前redis检查数据文件是否有错对于快照及aof都能够支持,但修复则只对aof文件有效. 快照文件每次备份都是全量备份,原理是先fork出一个子进程,父子进程共享数据域.接着子进程开始将共享数据域中的数据写入到一个临时文件,写完之后原子性的替换掉原先的备份db文件.如果

redis持久化策略梳理及主从环境下的策略调整记录

redis是一个内存数据库,它的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为"半持久化模式"):也可以把每一次数据变化都写入到一个Append Only File(AOF)里面(这称为"完全持久化模式").redis提供了两种不同级别的持久化方式:一种是默认的RDB(filesnapshotting快照)持久化,一种是AOF持久化,这两种持久化方式都可以将内存中的数据库状态保存到磁盘上,但是原理非常不同,区别很明显! 1.RDB持久化可以在

深度剖析Redis持久化

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt118 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到,他看到的所有针对Redis的讨论中,对Redis持久化的误解是最大的,于是他写了一篇长文来对Redis的持久化进行了系统性的论述.文章主要包含三个方面:Redi

第十章 Redis持久化--RDB+AOF

注:本文主要参考自<Redis设计与实现> 1.Redis两种持久化方式 RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中直接存储的是key-values的二进制形式,对于恢复数据也快) 缺点:在save配置条件之间若发生宕机,此间的数据会丢失 AOF 执行机制:将对数据的每一条修改命令追加到aof文件 优点:数据不容易丢失 缺点:性能较低(每一条修改操作都要追加到aof文

Redis持久化--AOF

除了RDB持久化之外,Redis还提供了AOF(Append Only File)持久化功能.与RDB持久化通过保存数据库中键值对来保存数据库的状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库的状态.被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,该格式是一种纯本文的格式,所以可以通过直接打开AOF文件,观察里面的类容. 1 AOF持久化的实现 AOF持久化功能的实现可以分为:命令追加(append),文件写入(write),文件同步(sync)三个

redis持久化配置

一. rdb快照持久化 1. 配置,在redis.conf中配置 save 900 1 # 刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之后至少1个关键字发生变化.save 300 10 # 必须是300秒之后至少10个关键字发生变化.save 60 10000 # 必须是60秒之后至少10000个关键字发生变化. # 注 上面三个选项注释,即屏蔽了 rdb快照持久化存储 stop-writes-on-bgsave-error yes # 后台存储错误停止写.rdbcompressio