Redis系列(二):深入解读Redis的两种持久化方式(上)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,倚天版 1GB 1个月
简介: Redis系列(二):深入解读Redis的两种持久化方式

博客地址:blog.zysicyj.top

Redis为什么要引入持久化机制

Redis引入持久化机制是为了解决内存数据库的数据安全性和可靠性问题。虽然内存数据库具有高速读写的优势,但由于数据存储在内存中,一旦服务器停止或崩溃,所有数据将会丢失。持久化机制的引入旨在将内存中的数据持久化到磁盘上,从而在服务器重启后能够恢复数据,提供更好的数据保护和可靠性。

以下是持久化机制的几个主要原因:

「1. 数据安全和可靠性:」 通过将数据持久化到磁盘上,即使在服务器崩溃或异常停止的情况下,也可以保证数据不会丢失。持久化机制可以防止重要的数据在突发情况下遭受损失。

「2. 数据恢复:」 持久化机制允许在服务器重启后将数据重新加载到内存中,从而实现数据的恢复。这对于业务的连续性和可用性非常重要。

「3. 数据灾难恢复:」 持久化机制对于灾难恢复也很有帮助。在不幸发生硬件故障、电力中断等情况下,持久化机制可以帮助恢复数据。

「4. 数据迁移:」 持久化机制也有助于将数据从一个服务器迁移到另一个服务器。你可以通过备份持久化文件并在另一台服务器上进行恢复来完成数据迁移。

虽然持久化机制带来了磁盘IO和性能开销,但它为Redis提供了更强大的数据保护能力。根据应用的需求,可以根据数据的重要性和数据丢失的容忍度来选择适当的持久化方式,或者结合两种方式以提供更高的数据保护级别。

Redis提供了哪些持久化机制

Redis提供了两种主要的持久化机制,分别是RDB快照(Snapshotting)和AOF日志(Append-Only File)。这两种机制可以根据不同的需求和场景来选择使用。

「1. RDB快照(Snapshotting):」 RDB快照是一种全量持久化方式,它会周期性地将内存中的数据以二进制格式保存到磁盘上的RDB文件。RDB文件是一个经过压缩的二进制文件,包含了数据库在某个时间点的数据快照。RDB快照有助于实现紧凑的数据存储,适合用于备份和恢复。

「优点:」

  • RDB快照在恢复大数据集时速度较快,因为它是全量的数据快照。
  • 由于RDB文件是压缩的二进制文件,它在磁盘上的存储空间相对较小。
  • 适用于数据备份和灾难恢复。

「缺点:」

  • RDB快照是周期性的全量持久化,可能导致某个时间点之后的数据丢失。
  • 在保存快照时,Redis服务器会阻塞,可能对系统性能造成影响。

「2. AOF日志(Append-Only File):」 AOF日志是一种追加式持久化方式,它记录了每个写操作命令,以追加的方式将命令写入AOF文件。通过重新执行AOF文件中的命令,可以重建出数据在内存中的状态。AOF日志提供了更精确的持久化,适用于需要更高数据安全性和实时性的场景。

「优点:」

  • AOF日志可以实现更精确的数据持久化,每个写操作都会被记录。
  • 在AOF文件中,数据可以更好地恢复,因为它保存了所有的写操作历史。
  • AOF日志适用于需要实时恢复数据的场景,如秒级数据恢复要求。

「缺点:」

  • AOF日志相对于RDB快照来说,可能会占用更多的磁盘空间,因为它是记录每个写操作的文本文件。
  • AOF日志在恢复大数据集时可能会比RDB快照慢,因为需要逐条执行写操作。

根据不同的需求,可以选择RDB快照、AOF日志或两者结合使用。你可以根据数据的重要性、恢复速度要求以及磁盘空间限制来选择合适的持久化方式。有时候,也可以通过同时使用两种方式来提供更高的数据保护级别。

AOF日志是如何实现的

首先,大家要知道,AOF是写后日志,“写后”的意思是Redis先执行命令,把数据写入内存,然后才记录日志,如下图所示:

AOF 为什么要先执行命令再记日志呢

AOF(Append-Only File)持久化机制中,为什么要先执行命令再记录日志,而不是相反,这涉及到数据的一致性和持久性。

AOF的设计目标之一是保证数据的持久性,即在服务器重启后能够恢复出与重启前一致的数据状态。为了实现这个目标,AOF的操作顺序非常重要。

「先执行命令再记录日志的原因:」

  1. 「数据一致性:」 如果先记录日志再执行命令,假设记录日志成功而执行命令失败(例如服务器崩溃),那么日志中记录的操作实际上没有被应用,会导致数据在重启后与预期不一致。
  2. 「可恢复性:」 先执行命令再记录日志可以保证在服务器重启后,即使在崩溃前未能将操作记录到日志中,也可以通过重新执行AOF日志中的命令,将数据恢复到正确的状态。
  3. 「避免日志丢失:」 如果先记录日志再执行命令,如果在记录日志之前发生了服务器崩溃,会导致操作丢失,而这些操作可能已经影响了数据的一致性。

当然,这里面还有一个非常重要的原因,「它是在命令执行后才记录日志,所以不会阻塞当前的写操作」

因此,为了确保数据的持久性和一致性,Redis选择了先执行命令再记录日志的方式。这样可以保证只有在操作真正成功执行后,才会将操作记录到AOF日志中,从而在服务器重启后能够准确地重放这些操作,保持数据的正确性。

AOF日志里面记录了什么内容呢

AOF(Append-Only File)日志记录了每个写操作命令,以追加的方式将命令写入AOF文件。这些写操作命令被以一种协议格式(通常是RESP协议)写入AOF文件,以文本形式保存。下面是AOF日志中记录的内容示例:

假设执行了以下操作:

SET key1 value1
INCR key2
LPUSH list1 item1

对应的AOF日志内容可能是:

*3\r\n$3\r\nSET\r\n$4\r\nkey1\r\n$6\r\nvalue1\r\n
*2\r\n$4\r\nINCR\r\n$4\r\nkey2\r\n
*3\r\n$5\r\nLPUSH\r\n$5\r\nlist1\r\n$5\r\nitem1\r\n

在这个示例中,每个写操作都以RESP协议格式记录在AOF文件中,以一系列字节数组来表示命令和参数。每个写操作的记录由多行组成,以\r\n分隔。

  • *3:表示命令参数的个数为3。
  • $3\r\nSET\r\n:表示第一个参数为长度为3的字符串 "SET"。
  • $4\r\nkey1\r\n:表示第二个参数为长度为4的字符串 "key1"。
  • $6\r\nvalue1\r\n:表示第三个参数为长度为6的字符串 "value1"。

这样的记录方式允许在AOF文件中按照操作的顺序逐条重放写操作命令,从而实现数据在服务器重启后的恢复。由于AOF记录的是写操作命令本身,所以在执行AOF文件中的命令时,可以完全还原数据的状态。

AOF日志潜在的问题

AOF(Append-Only File)写日志是Redis的持久化机制之一,它记录了每个写操作命令,以追加的方式将命令写入AOF文件。尽管AOF具有许多优点,但也存在一些风险和潜在的问题,需要注意和管理:

「1. 磁盘IO开销:」 AOF日志以追加写入方式工作,每次写入操作都会直接追加到AOF文件末尾。这意味着频繁的写入操作可能会导致磁盘IO开销增加,可能会影响系统的性能和响应时间。

「2. 磁盘空间占用:」 AOF日志记录的是每个写操作命令本身,相比于RDB快照,AOF文件可能会更大。如果写入操作频繁,AOF文件可能会不断增大,占用过多的磁盘空间。

「3. 数据一致性:」 尽管AOF的先执行命令再记录日志的机制保证了数据一致性,但如果在记录日志前发生服务器崩溃,尚未记录的操作可能会丢失,可能导致数据一致性问题。

「4. AOF文件损坏:」 由于AOF文件是以文本格式记录的命令,如果AOF文件在写入或存储过程中受到损坏,可能导致数据恢复时出现问题,甚至无法正确恢复数据。

「5. AOF重写耗时:」 AOF重写是为了减小AOF文件的大小,但它是一个耗时的操作,可能会对系统性能产生影响,尤其是在大数据集的情况下。

「6. AOF重写可能引发的问题:」 AOF重写过程中可能会因为各种原因导致数据丢失,例如中断的重写过程、文件系统问题等。在执行AOF重写时,需要谨慎对待,确保数据的完整性。

「7. AOF文件合并:」 在一些场景下,可能需要将多个AOF文件合并成一个,这样的操作需要小心处理,以避免数据丢失或错误。

「8. 硬件故障:」 虽然AOF可以提供持久性保证,但硬件故障(例如磁盘故障)可能会导致AOF文件丢失或损坏,需要适当的备份和恢复策略。

为了减轻AOF写日志带来的风险,可以采取一些措施,如选择适当的AOF同步策略、定期备份AOF文件、监控AOF文件的大小和状态、定期执行AOF重写、备份数据等。这些策略可以帮助减少潜在的问题,并提高系统的可靠性。

AOF日志三种写回策略

AOF(Append-Only File)持久化机制在Redis中有三种不同的写回(sync)策略,用于控制何时将AOF缓冲区中的写入操作刷新到磁盘上的AOF文件。这些策略决定了AOF日志的同步频率,影响了数据的持久性和性能。以下是这三种写回策略:

「1. always(始终同步):」 在这个策略下,每次执行写入操作之后,Redis都会立即将写入操作刷新到磁盘,确保写入操作已经持久化。虽然这种方式能够提供最高的数据保证,但也是性能开销最大的一种方式,因为每次写入操作都会引起磁盘IO。

「优点:」

  • 最高的数据保证,即使系统崩溃,也只会丢失上一个写入操作。

「缺点:」

  • 性能开销较大,频繁的磁盘IO可能影响系统的性能和响应时间。

「2. everysec(每秒同步):」 在这个策略下,Redis会每秒一次将AOF缓冲区中的写入操作批量刷新到磁盘上的AOF文件。这样可以在一定程度上平衡数据保证和性能。

「优点:」

  • 较高的数据保证,每秒一次的同步保证了不会丢失过多的写入操作。
  • 性能开销相对较低,因为是每秒一次的批量刷新。

「缺点:」

  • 在一秒内的操作可能会丢失。

「3. no(不同步):」 这个策略下,Redis不会主动将AOF缓冲区中的写入操作刷新到磁盘,而是由操作系统来决定何时将数据写入磁盘。这是性能开销最小的方式,但数据持久性相对较低。

「优点:」

  • 最小的性能开销,几乎不会影响系统的响应时间。
  • 最高的性能表现,写入操作不会导致频繁的磁盘IO。

「缺点:」

  • 数据持久性较低,如果系统崩溃,可能会丢失多个写入操作。

选择合适的AOF写回策略取决于数据的重要性和性能需求。如果数据安全性最为重要,可以选择always策略。如果在数据一致性和性能之间需要平衡,可以选择everysec策略。如果对性能要求较高,而可以接受一定程度的数据丢失,可以选择no策略。根据实际情况,可以根据需求来配置AOF的写回策略。

这里呢给大家总结一下各种配置的优缺点

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
214 2
|
1月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
23天前
|
NoSQL Redis 数据库
redis 持久化机制及配置
redis 持久化机制及配置
42 4
|
26天前
|
NoSQL Linux Redis
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
|
26天前
|
监控 NoSQL Redis
Redis问题之什么是AOF持久化,它有哪些优点和缺点
Redis问题之什么是AOF持久化,它有哪些优点和缺点
|
1月前
|
监控 NoSQL Redis
|
12天前
|
缓存 NoSQL Redis
redis数据持久化之RDB和AOF
redis数据持久化之RDB和AOF
|
2月前
|
存储 NoSQL Redis
《面试官之你说我听》:简明的图解Redis RDB持久化、AOF持久化
《面试官之你说我听》:简明的图解Redis RDB持久化、AOF持久化
|
2月前
|
存储 NoSQL 安全
Redis系列学习文章分享---第十五篇(Redis最佳实践--设计优雅的key+合适的数据结构+持久化如何配置+慢查询问题解决)
Redis系列学习文章分享---第十五篇(Redis最佳实践--设计优雅的key+合适的数据结构+持久化如何配置+慢查询问题解决)
47 1