Redis的持久化机制(下)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis的持久化机制(下)

2 RDB(Redis database)- 全量写入

Redis Server在有多db 中存储的K.V可理解为Redis的一个状态。当发生写操作时,Redis就会从一个状态切换到另外一个状态。


基于全量的持久化就是在某个时刻,将Redis的所有数据持久化到硬盘中,形成一个快照。快照,顾名思义可以理解为拍照一样,把整个内存数据映射到硬盘中,保存一份到硬盘,因此恢复数据起来比较快,把数据映射回去即可,不像 AOF,一条条的执行操作命令。

当Redis 重启时,通过加载最近一个快照数据,可以将 Redis 恢复至最近一次持久化状态上。


快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb。

2.1 触发方式

save

  • 客户端显示触发
  • 或客户端发送 shutdown 命令,系统会先执行 save 命令阻塞客户端,然后关闭服务器


save本身是单线程串行方式执行,因此当数据量大时,可能会发生Redis Server的长时间卡顿。

其备份期间其他命令全部阻塞,无法执行,因此备份时期 数据的状态始终一致

若存在老的RDB文件,则新的会替换老的,时间复杂度O(N)。

image.png

设置 redis.conf

image.png

再使用脚本初始化 500w 数据,等待后发现已经落盘:

image.png

bgsave

bgsave 可由

  • 客户端显式触发
  • 配置定时任务触发
  • 当有主从架构时,从服务器向主服务器发送 sync 命令来执行复制操作时,主服务器会执行 bgsave


bgsave命令在执行时,会fork一个子进程。子进程提交完成后,会立即给客户端返回响应,备份操作在后台异步执行,期间不会影响Redis的正常响应。


对于bgsave来说,当父进程Fork完子进程之后,异步任务会将当前的内存状态作为一个版本进行复制。在复制过程中产生的变更,不会反映在这次备份当中。


不用命令,而使用配置

在Redis的默认配置中,当满足下面任一条件,会自动触发 bgsave 的执行:

image.png

bgsave相对于save的优势是异步执行,不影响后续命令执行。但Fork子进程,涉及父进程的内存复制,会增加服务器内存开销。当内存开销高到使用虚拟内存时,bgsave的Fork子进程会阻塞运行,可能会造成秒级不可用。因此使用bgsave需要保证服务器空闲内存足够。


image.png

image.png

2.2 RDB执行流程

rdb.c文件执行流程:

image.png

2.3 RDB 最佳配置

关闭自动RDB:

dbfilename dump-${port}.rdb
dir /redisDataPath
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

需要注意的触发时机

  • 主从复制时机的全量复制,master节点会执行bgsave
  • debug reload
  • shutdown
  • flushDB 、 flushAll

2.4 RDB性质

  1. RDB是Redis内存到硬盘的快照,用于持久化
  2. save通常会阻塞Redis
  3. bgsave不会阻塞Redis,但会fork新进程
  4. save自动配置满足任一就会被执行

2.5 RDB 优点

  • 紧凑压缩的二进制文件
    RDB会生成多个数据文件,每个文件都代表了某时刻Redis中的所有数据,这种方式非常适合做冷备。可将这种完整数据文件发送到云服务器存储,比如ODPS分布式存储,以预定好的备份策略来定期备份Redis中的数据
  • fork子进程性能最大化
    RDB对Redis对外提供的读写服务,影响非常小,可让Redis保持高性能,因为Redis主进程只要fork一个子进程,让子进程执行RDB
  • 启动效率高
    相对于AOF,直接基于RDB文件重启和恢复Redis进程,更加快速

2.6 RDB缺点

耗时

O(n)

写时复制(copy-on-write)

耗内存,copy-on-write策略。RDB每次在fork子进程来执行RDB快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒。

执行 fork 时,os会使用写时复制,即 fork 函数发生的一刻父子进程共享同一内存数据。当父进程要更改其中某片数据时(如执行一个写命令),os会将该片数据复制一份以保证子进程数据不受影响,所以新的 RDB 文件存储的是执行 fork 一刻的内存数据。


不可控

容易丢失数据。一般RDB每隔5分钟,或者更长时间生成一次,若过程中Redis宕机,就会丢失最近未持久化的数据

2.7 恢复流程

当Redis重新启动时,会从本地磁盘加载之前持久化的文件。当恢复完成之后,再受理后续的请求操作。

4 选型及最佳实践

image.png

混合持久化

Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,通过配置项 aof-use-rdb-preamble 开启)。

如果把混合持久化打开,AOF 重写时就直接把 RDB 内容写到 AOF 文件开头:

  • 好在可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多数据
  • 但是,AOF 里的 RDB 部分就是压缩格式不再是 AOF 格式,可读性较差

RDB最佳策略

  • 关闭
  • 集中手动管理RDB操作
  • 在从节点打开自动执行配置,但是不宜频繁执行RDB

AOF最佳策略

  • 建议打开,但是如果只是纯作为缓存使用可不开
  • AOF重写集中管理
  • everysec

抉择RDB & AOF

不要仅使用RDB,因为那样会导致丢失很多数据


也不要仅使用AOF,因为那样有两个问题


你通过AOF做冷备,没有RDB做冷备,来的恢复速度更快


RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug


综合使用AOF和RDB


用AOF保证数据不丢失,作为数据恢复的第一选择


用RDB做不同程度的冷备,在AOF文件都丢失或损坏不可用时,还可使用RDB快速实现数据恢复

一些最佳实践

  • 小分片
    例如设置maxmemory参数设置每个redis只存储4个G的空间,这样各种操作都不会太慢
  • 监控(硬盘、内存、负载、网络)
  • 足够的内存


参考

目录
相关文章
|
1月前
|
NoSQL 安全 关系型数据库
Redis:持久化的两种方式
Redis持久化机制主要包括RDB和AOF两种方式。RDB通过生成数据快照进行持久化,支持手动或自动触发,具有加载速度快、文件紧凑等特点,但无法实时保存数据。AOF则记录每个操作命令,保障数据更安全,支持多种写入策略,并可通过重写机制优化文件大小。两者各有优劣,常结合使用以兼顾性能与数据安全。
|
1月前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
4月前
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
144 9
|
5月前
|
缓存 NoSQL 算法
Redis数据库的键值过期和删除机制
我们需要注意的是,虽然Redis提供了这么多高级的缓存机制,但在使用过程中,必须理解应用的特性,选择合适的缓存策略,才能最大化Redis的性能。因此,在设计和实施应用程序时,理解应用的数据访问模式,以及这些模式如何与Redis的缓存机制相互作用,尤为重要。
204 24
|
8月前
|
存储 NoSQL 安全
Redis的两种持久化方式---RDB、AOF
通过本文的介绍,我们详细讲解了Redis的两种主要持久化方式:RDB和AOF。每种方式都有其独特的优缺点和适用场景。在实际应用中,可以根据具体需求选择合适的持久化方式,或者同时启用RDB和AOF,以达到最佳效果。希望本文能帮助您更好地理解和应用Redis的持久化机制,构建高效、可靠的数据存储解决方案。
680 79
|
7月前
|
NoSQL Redis
Redis的数据持久化策略有哪些 ?
Redis 提供了两种方式,实现数据的持久化到硬盘。 1. RDB 持久化(全量),是指在指定的时间间隔内将内存中的数据集快照写入磁盘。 2. AOF持久化(增量),以日志的形式记录服务器所处理的每一个写、删除操作 RDB和AOF一起使用, 在Redis4.0版本支持混合持久化方式 ( 设置 aof-use-rdb-preamble yes )
|
10月前
|
存储 NoSQL Redis
Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
Redis 是一个内存数据库,意味着它主要将数据存储在内存中,从而能够提供极高的性能。然而,作为内存数据库,Redis 默认情况下的数据不会永久保存。为了确保数据在重启或故障后能够恢复,Redis 提供了几种 **持久化机制**。这些机制允许 Redis 将内存中的数据保存到硬盘上,从而实现数据持久化。
553 22
Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
|
9月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
138 7
|
10月前
|
NoSQL 安全 Redis
redis持久化策略
Redis 提供了两种主要的持久化策略:RDB(Redis DataBase)和AOF(Append Only File)。RDB通过定期快照将内存数据保存为二进制文件,适用于快速备份与恢复,但可能因定期保存导致数据丢失。AOF则通过记录所有写操作来确保数据安全性,适合频繁写入场景,但文件较大且恢复速度较慢。两者结合使用可增强数据持久性和恢复能力,同时Redis还支持复制功能提升数据可用性和容错性。
200 5
|
11月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
214 5

热门文章

最新文章