Redis7_02 基础篇 第二章 Redis的持久化 (上)

本文主要介绍

        Redis持久化方式之一 RDB方式(也称SnapShot方式)

下篇会讲解 另一种持久化方式 AOF

下篇链接 :

1 Redis持久化简介

1.1 什么是持久化?

        Redis的持久化是指将Redis服务器中的数据持久化到磁盘上的过程,以确保数据在Redis重启或发生故障时不会丢失。持久化机制可以将内存中的数据写入磁盘,从而实现数据的持久化存储。

1.2 为什么要有持久化?

        持久化的重要性体现在以下几个方面:

  1. 数据安全性:持久化可以确保即使在Redis服务器重启或发生故障时,数据也不会丢失。通过将数据写入磁盘,可以保证数据的持久性,防止数据丢失或损坏。

  2. 数据恢复:通过持久化机制,可以在Redis重启时将数据从磁盘加载到内存中,实现数据的恢复。这对于保证数据的持久性和可靠性非常重要。

  3. 高可用性:持久化可以帮助确保数据的高可用性。即使发生意外情况,如服务器宕机或断电等,数据也可以通过持久化机制进行恢复,保证系统的持续运行。

  4. 灾难恢复:持久化使得在灾难发生时可以更容易地恢复数据。通过定期备份数据到磁盘,可以减少数据丢失的风险,同时提高数据的安全性和可靠性。

        总的来说,持久化是确保数据持久存储、保证数据安全、实现数据恢复和提高系统可靠性的重要手段。通过选择适合的持久化方式,并根据实际需求进行配置和优化,可以有效地保护和管理Redis中的数据。

1.3 Redis持久化概览

        Redis提供了两种主要的持久化方式,分别是快照(Snapshot)和日志(Append-only file,AOF)。这两种方式可以确保在Redis重启时数据不会丢失。

  1. 快照(Snapshot)持久化

    • 在快照持久化中,Redis会将内存中的数据以快照的形式写入磁盘文件。这个过程是通过fork一个子进程,然后子进程负责将数据写入磁盘,主进程继续处理命令请求。
    • 快照持久化的优点是可以在一个特定的时间点创建数据的备份,且备份文件是紧凑的二进制文件,适合用于全量恢复。
    • 缺点是当数据量较大时,fork子进程可能会导致性能问题,而且如果发生故障,可能会丢失最后一次快照之后的数据。
  2. 日志(Append-only file,AOF)持久化

    • 在AOF持久化中,Redis会将写命令追加到一个文件中,记录了对数据的修改操作。这些写命令以追加的方式写入文件,形成一个操作日志。
    • AOF持久化的优点是可以保证更高的数据安全性,因为可以通过重新执行AOF文件中的写命令来恢复数据。另外,AOF文件通常比快照文件更小。
    • 缺点是AOF文件可能会变得很大,影响恢复速度,而且在Redis重启时,AOF文件需要重新加载并重新执行所有写命令,可能会影响性能。

        除了以上两种主要的持久化方式,Redis还提供了混合持久化(Mixed persistence)的方式,即同时使用快照和AOF。在混合持久化中,Redis会先通过AOF文件进行恢复,然后再用快照文件进行全量恢复,以此来提高恢复速度。

        用户可以根据自己的需求和应用场景选择适合的持久化方式,或者结合使用多种持久化方式来达到更好的数据保护和性能表现。

        Redis默认开启了RDB持久化,而没有开启AOF持久化. AOF持久化的开启需要自行修改配置文件.

2 Redis持化双雄之一RDB(Redis DataBase)

        RDB持久化也就是上面讲到的Snapshot持久化.        

        RDB 持久化即为: 以指定的时间间隔执行所有数据集的时间点快照,将快照写入磁盘中方式持久化数据。

        当出现特殊情况,Redis丢失了数据时,通过持久化机制,Redis再重启后就可以把之前保存的快照文件再写回到redis内存中.

        快照文件的后缀为rdb,例如dump.rdb.

2.1 RDB持久化的参数配置

        6.0.16及以下的版本中

        

        具体可以参考redis.conf文件第307行

        

        6.0.16以后的版本(不包含6.0.16)

        

2.2 RDB持久化的实操

配置修改准备

        注意修改的是自定义的配置文件,之前我们存放的位置是 /myredis/redis7.conf

        为了更加容易的触发备份操作,我们修改了配置文件

        在配置文件的434行加上我们自行定义的rdb策略 save 5 2 ,读者可以快速定位修改

        

        此外,我们还应当修改 快照文件的位置,和文件名,方便后期查看,定位,以及分辨该快照文件来自于哪一个端口下的redis服务

        首先修改快照文件保存位置 配置文件下的505行

        注意,修改的文件位置要保证该文件夹存在 

        若需要自行创建,先退出客户端连接, 在/myredis文件夹下     

        执行 mkdir /myredis/dumpfiles 即可

        

        再来修改 快照文件的文件名         在第482行

        推荐修改为 dump+端口号的形式

        

        自动触发快照

        情况一

        

        情况二

       

        由情况二可知,自动快照的策略 不是 两次修改必须集中在同一个五秒内, 而是 一个五秒只能快照一次, 每过五秒 检查 累计的 key修改次数, 达到两次立即 快照.

        结论  save 5 2

        不是说 2次修改必须集中在同一个五秒内

        而是说,每五秒检查一次key累计更新的次数,到达两次就立即快照.

        如何从硬盘中恢复数据? 

       1.将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
       
        2.备份成功后故意用flushdb清空redis,看看是否可以恢复数据

        清空前,我们先把原rdb自行备份一下(通过改名的方式,不让它被覆盖实现备份)

        可以发现,清空后在重启服务,redis没能恢复原来的数据,说明 执行flushdb 或 flushall 命令生成的rdb文件 是空的 没有任何意义

        把改名的原来有数据的rdb文件改回来, 再启动服务,发现 数据自动恢复了!

结论

        执行fulshdb/flushall命令,也会产生dump.rdb文件,但是 这个文件是空的 没有任何意义, 因此 真实有数据的rdb文件我们一定要及时备份,最好的当然是分机备份,也就是使用物理恢复法. 言外之意就是 把rdb文件 备份到 和redis服务不同的机器上去.

        手动触发快照

        触发方式,使用两大命令Save 或 BGSave触发,触发后,会开辟子进程来备份redis的所有数据,写入到一个缓存文件中, 备份完成后,将会用这个新的rdb文件替换旧的rdb文件

注意

        生产中 绝对禁止使用Save方法触发rdb,因为save 后 开辟的子进程会直接阻塞 redis的主进程服务,会导致严重的生产危险!

        而BGSave不会有这样的问题.BGsave 是 异步的      

 BGsave执行流程

         

BGsave实操演示

RDB的优势

  1. 性能高效:RDB持久化是将数据以快照的形式保存到磁盘上,相对于AOF持久化来说,在数据恢复时速度更快,适合对性能要求较高的场景。

  2. 节省空间:RDB文件是一个二进制文件,相比AOF文件通常更小,可以节省磁盘空间。

  3. 适合灾难恢复:RDB文件是一个全量的数据快照,适合用于灾难恢复,能够快速恢复整个数据集。

  4. 灵活性:RDB持久化支持手动和自动触发,用户可以根据需要灵活配置持久化策略。

  5. 降低数据丢失风险:RDB持久化可以定期将数据写入磁盘,降低了数据丢失的风险,尤其是在发生意外故障时。

        总的来说,RDB持久化适合对性能要求高、对数据恢复速度和灾难恢复能力有要求的场景,可以提供高效的数据持久化和保护。

RDB的劣势 

  1. 数据丢失风险:RDB持久化并不是最适合需要最小化数据丢失风险的情况,因为RDB是周期性生成数据快照,如果Redis在未正确关闭的情况下停止工作,可能会丢失最新数据。

  2. 频繁fork操作:RDB持久化需要频繁进行fork操作以使用子进程在磁盘上持久化数据,当数据集很大时,这可能会耗费较多时间,并且可能导致Redis在服务客户端时出现短暂的停顿。相比之下,AOF持久化的fork操作频率较低,可以根据需要调整日志重写的频率,而无需进行持久性方面的权衡。

        综上所述,虽然RDB持久化有其优点,但在一些特定情况下可能会面临数据丢失风险和性能影响的挑战,需要根据实际需求和情况来选择合适的持久化策略。

RDB持久化 数据丢失案例

         

该案例证实了 rdb的周期化rdb的缺陷.

如何检查并修复 RDB 文件 

        使用命令redis-check-rdb dump6379.rdb 来检查并修复你的快照文件

        

小结 哪些情况会触发快照?

  1. 配置文件中默认的快照配置
  2. 手动save/bgsave命令
  3. 执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义
  4. 执行shutdown且没有设置开启AOF持久化
  5. 主从复制时,主节点自动触发

禁用EDB快照的方式

  1. (当前 Redis 实例中生效)停止RDB保存规则的命令: redis-cli config set save ""
  2. (永久生效) 见下图修改配置文件  把 save "" 的注释给打开就可以了

        

RDB优化配置详解

        在配置文件 SnapShoting 模块中 

1. save

2. dbfilename

3. dir

前三种 在之前的 配置修改准备 中 我们已经演示过

4. stop-writes-on-bgsave-error

        如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制这种不一致,那么在快照写入失败时,也能确保redis继续接受新的写请求

        在配置文件449行 建议默认 yes

        

5. rdbcompression

        对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能

        配置文件的445行 建议默认yes

        

6. rdbchecksum

        在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能

         配置文件的464行 建议默认yes

        

7. rdb-del-sync-files

        用于控制在删除 RDB 文件时是否使用同步操作。当设置为 "yes" 时,Redis 在删除 RDB 文件时会使用同步操作,这意味着删除操作会等待直到数据被写入磁盘。这样可以确保在删除 RDB 文件后不会丢失任何数据。

        配置文件的495行 建议 默认no

        

总结

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤尘Java

感谢认可!感谢您的打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值