7.Redis 持久化

  1. 作用
    持久化就是把内存的数据写到磁盘中去,防止服务器宕机了内存数据丢失。
  2. 持久化方式
    Redis 提供两种持久化机制:RDB(默认)和 AOF 机制。
    RDB(Redis DataBase)是 Redis 默认的持久化方式。
    按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据为 dump.rdb。通过配置文件中的 save 参数来定义快照的周期。
    当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:
    1)Redis 调用forks. 同时拥有父进程和子进程。
    2)子进程将数据集写入到一个临时 RDB 文件中。
    3)当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
    AOF(Append Only File)是将 Redis 执行的每次写命令记录到单独的日志文件中,当重启 Redis 会重新持久化的日志中文件恢复数据。
    采用追加的方式保存,默认文件appendonly.aof,记录所有的写操作命令,在服务启动的时候使用这些命令可以还原数据库。这种持久化策略,在服务出现故障时,几乎不丢失任何是数据,有可能会丢失一秒的数据,但是相对RDB损失小的多。
    1)AOF 写入机制
    AOF 方式不能保证绝对不丢失数据。
    目前常见的操作系统中,执行系统调用 write 函数,将一些内容写入到某个文件里面时,为了提高效率,系统通常不会直接将内容写入硬盘里面,而是现将内容放入一个内存缓冲区(buffer)里面,等到缓冲区被填满,或者用户执行 fsync 调用和 fdatasync 调用时才将存储在缓冲区里的内容真正的写入到硬盘里,为写入磁盘之前,数据可能会丢失。
    2)写入磁盘的策略
    appendfsync 选项,这个选项的值可以是 always、everysec 或者 no 。
    always:服务器没写入一个命令,就调用一次fdataaync,将缓冲区里面的命令写入磁盘。这种模式下,服务器出现故障,也会丢失任何一成功执行的命令数据。
    everysec(默认):服务器每一秒重调用一次 fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,最多只丢失一秒内的执行的命令数据。
    no:服务器不主动调用 fdatasync,由操作系统决定何时将缓冲区里面的命令写入到磁盘。这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的。
    3)AOF 的重写机制
    因为 AOF 的运作方式是不断地将命令追加到文件的末尾, 所以随着写入命令的不断增加, AOF 文件的体积也会变得越来越大。
    为了处理这种情况, Redis 支持一种有趣的特性: 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。Redis 2.2 需要自己手动执行 BGREWRITEAOF 命令; Redis 2.4 则可以自动触发 AOF 重写。
    在这里插入图片描述

重写过程
1、执行AOF重写请求
2、父进程执行fork创建子进程,开销等同于bgsave过程
3.1、主进程fork操作完成后,继续响应其他命令。所有修改命令依然写入AOF缓冲区,并根据appendfsync策略同步到磁盘,保证原有AOF机制正确性。
3.2、由于fork操作运用写时复制技术,子进程只能共享fork操作时的内存数据。由于父进程依然响应命令,redis使用“AOF重写缓冲区”保存这部分新数据,防止新AOF文件生成期间丢失这部分数据。
4、子进程根据内存快照,按照命令合并规则写入到新AOF文件。每次批量写入硬盘数据量由aof-rewrite-incremental-fsync控制,默认是32MB,防止单词刷盘数据过多造成硬盘阻塞。
5.1、新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息。
5.2、父进程把AOF重写缓冲区数据写入到新的AOF文件。
5.3、使用新AOF文件替换老文件,完成AOF重写。
:如果写入操作的时候出现故障导致命令写半截,可以使用redis-check-aof工具修复
3. Redis 持久化方式选择
一般来说,应该同时使用 RDB 和 AOF 两种持久化功能。
当 Redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整。
4. RDB 和 AOF 的优缺点
1)RDB 的优缺点
优点
完全备份,不同时间的数据集备份可以做到多版本恢复紧凑的单一文件,方便网络传输,适合灾难恢复;
恢复大数据集速度要比 AOF 块;
缺点
会丢失最近写入、修改的而未能持久化的数据;
fork过程非常耗时,会造成毫秒级不能响应客户端请求;
生产环境
创建一个定时任务 cron job,每小时或者每天将 dump.rdb 复制到指定目录,确保备份文件名称带有日期时间信息,便于管理和还原对应的时间点和快照版本定时任务删除过期的备份。如果有必要,跨物理主机、跨机架、异地备份。
2)AOF 的优缺点
优点
写入机制,默认fysnc每秒执行,性能很好不阻塞服务,最多丢失一秒的数据
重写机制,优化AOF文件
如果误操作了(FLUSHALL等),只要AOF未被重写,停止服务移除AOF文件尾部FLUSHALL命令,重启Redis,可以将数据集恢复到 FLUSHALL 执行之前的状态
缺点
相同数据集,AOF文件体积较RDB大了很多
恢复数据库速度比RDB慢(文本,命令重演)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些关于 Redis 持久化的可能面试问题: 1. Redis持久化有哪些方式Redis持久化有两种方式,一种是 RDB 持久化,一种是 AOF 持久化。 2. RDB 持久化和 AOF 持久化有什么区别? RDB 持久化是将 Redis 在内存中的数据快照保存到磁盘上,而 AOF 持久化则是将 Redis 执行的每条写命令记录到磁盘上。RDB 持久化可以节约磁盘空间,但可能会丢失最近的一些数据,而 AOF 持久化可以保证数据不会丢失,但可能会占用更多的磁盘空间和写入时间。 3. Redis持久化机制是如何保证数据一致性的? Redis持久化机制可以通过在每次写操作后立即同步到磁盘,或者设置定期同步时间来保证数据一致性。 4. Redis持久化可以在运行时进行吗? 可以,Redis持久化可以在运行时进行配置和切换,例如可以在运行时从 RDB 切换到 AOF 持久化,或者从 AOF 切换到 RDB 持久化。 5. Redis持久化会对性能产生影响吗? 会,Redis持久化会增加磁盘 I/O 开销,可能会对写入性能产生一定的影响,但可以通过合理的配置来平衡性能和数据一致性。 6. Redis持久化可以与 Redis 集群一起使用吗? 可以,Redis持久化可以与 Redis 集群一起使用,但需要注意配置文件的设置和数据同步的策略。 总之,Redis持久化是保证数据一致性和可靠性的重要手段,需要根据具体的业务需求和性能要求来选择合适的持久化方式,并进行合理的配置和优化。在面试中,还需要了解 Redis 持久化的原理、机制、优缺点、与集群的结合等方面的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值