【Redis(2)】Redis的持久化方式RDB和AOF配置

上一篇作为开始,只要讲了Redis数据类型及使用场景,接下来进一步深入,说一下Redis的持久化方式。

1.Redis的持久化方式

Redis支持两种主要的持久化方式:

RDB持久化

通过快照的形式,将某一时刻的数据集保存到磁盘上的二进制文件中。

适用于定时备份,以及灾难恢复。

AOF持久化

记录服务器接收到的每一个写操作命令,并将这些命令追加到文件的末尾。

通过重放这些命令来恢复数据,适用于需要高数据完整性的场景。

2.RDB和AOF的区别

特性 RDB AOF
存储方式 二进制文件 追加日志文件
文件大小 通常较小 可能随时间增长而变大
恢复速度 可能较慢,取决于日志长度
数据完整性 可能丢失最后一次快照后的数据 根据fsync策略,最多丢失1秒的数据
性能影响 快照生成时可能阻塞主线程 写入性能影响较小,fsync可能影响延迟
适用场景 定时备份、灾难恢复 实时数据完整性要求高的场景

3.AOF配置文件

为了实现高性能的AOF持久化配置,需要在数据安全性和性能之间找到平衡点。以下是一个针对高性能需求而优化的AOF配置文件示例,包含了具体配置和注释:

# 开启AOF持久化功能
appendonly yes

# AOF文件的名称
appendfilename "appendonly.aof"

# 配置AOF持久化的fsync策略
# 使用everysec可以实现性能和数据安全性的平衡,每秒fsync一次
appendfsync everysec

# AOF文件自动重写的触发条件
# 设置为100,表示当AOF文件大小是上一次重写后的AOF文件大小的100%时,触发重写
auto-aof-rewrite-percentage 100

# 设置触发AOF重写的最小文件大小
# 避免AOF文件很小的时候触发重写,减少不必要的重写操作
auto-aof-rewrite-min-size 64mb

# 配置在启动加载AOF文件时对不完整文件的处理
# 设置为yes,允许加载不完整的AOF文件,提高数据恢复的灵活性
aof-load-truncated yes

# 启用增量式fsync,减少磁盘I/O操作
aof-rewrite-incremental-fsync yes

# 在AOF重写期间,使用备用的子进程进行写操作,减少对主进程的影响
aof-rewrite-use-rdb-preamble yes

# 配置文件的目录,AOF文件会存储在这个目录下
dir /var/lib/redis

# 日志级别,info表示记录大部分有用的信息,适合生产环境
loglevel info

# 配置文件修改后,不重启Redis服务也可以加载新的配置
config yes

 注意

该配置示例适用于Redis 2.6及更高版本aof-use-rdb-preamble,是在Redis的较新版本中引入的,用于支持增量式AOF重写。

Redis 4.0或以上版本,那么上述配置应该完全适用,因为Redis 4.0引入了更多的持久化选项和改进。对于更早的版本,大部分配置也是适用的,但可能需要根据版本的具体特性进行细微调整。

  1. appendfsync everysec:这个配置项是性能和数据安全性折衷的结果。如果追求更高的数据安全性,可以选择always,但可能会牺牲一些性能。
  2. auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size:这两个配置项共同控制AOF重写的触发条件。可以根据服务器的负载和AOF文件增长速度进行调整。
  3. aof-rewrite-incremental-fsync:在重写期间,使用增量式fsync减少对性能的影响。
  4. aof-rewrite-use-rdb-preamble:在AOF重写时,使用RDB格式写入旧数据,然后追加新的AOF日志,这可以加快重写后的AOF文件的加载速度。

4.RDB配置文件

Redis的RDB持久化是通过创建数据的快照来实现的,以下是一些关键的RDB持久化配置项,以及它们的注释说明:

# RDB持久化配置
# ----------------------------------------------------

# 定义生成RDB快照的条件,格式为:save <seconds> <changes>
# 以下配置表示如果至少有1个键被改变,则每60秒保存一次;
# 如果至少有10000个键被改变,则每300秒保存一次
save 60 1
save 300 10000

# 设置RDB文件的名称
dbfilename "dump.rdb"

# 设置RDB文件存储的目录
dir /var/lib/redis/

# 开启RDB文件压缩,这会消耗CPU资源,但可以显著减少磁盘占用
rdbcompression yes

# 启用RDB文件的校验和,确保数据的完整性
rdbchecksum yes

# 使用管道技术来优化RDB持久化过程中的I/O操作,提高性能
rdbpipelining yes

# 设置是否在后台线程中进行RDB持久化操作,减少对主线程的阻塞
# 注意:从Redis 4.0起,RDB持久化默认就是在子进程中进行的,
# 所以此配置项在新版本中不再需要
# bgsave on

# 设置RDB持久化操作的最大写入带宽,以避免长时间占用太多网络带宽
# rdb-del-sync-files no

# 设置在执行RDB持久化时,是否只对数据库中的部分key进行持久化
# key-value对的模式必须匹配给定的glob样式的pattern
# rdb-save-incremental yes

注意

  1. save 指令定义了数据快照的生成时机,格式为 save <seconds> <changes>,表示在指定的时间内如果有指定数量的键被改变,则会进行快照保存。

  2. dbfilename 设置了RDB文件的名称,这个文件包含了Redis数据库的快照。

  3. dir 指定了RDB文件存放的目录。

  4. rdbcompression 设置为 yes 可以启用LZF压缩算法,压缩RDB文件,减少磁盘占用。

  5. rdbchecksum 设置为 yes 可以为RDB文件添加校验和,确保数据的完整性。

  6. rdbpipelining 设置为 yes 可以启用管道技术,减少持久化过程中的I/O操作次数,提高性能。

RDB持久化本身是一种快速的持久化方式,因为它通过创建数据的快照来保存当前数据库状态,而不是记录每个写操作命令。这种方式的优点是恢复速度快,对性能的影响相对较小,尤其是在生成RDB文件时,Redis可以利用子进程来完成这个任务,从而避免了对主进程的阻塞。

然而,RDB持久化也有其局限性,主要体现在数据安全性上。由于RDB是周期性地创建数据快照,如果在两次快照之间Redis发生故障,那么在这一段时间内的数据更改将会丢失。因此,如果你需要更高的数据安全性,可能需要考虑使用AOF持久化或者两者的结合。

5.RDB和AOF配合使用 

结合使用RDB和AOF持久化可以提供数据的快速恢复和高完整性。以下是一个配置文件示例,包括了RDB和AOF的相关配置以及注释:

# RDB持久化配置
# --------------------------------------------------

# 定义生成RDB快照的条件,格式为:save <seconds> <changes>
# 以下配置表示如果至少有1个键被改变,则每60秒保存一次;
# 如果至少有10000个键被改变,则每300秒保存一次。
save 60 1
save 300 10000

# 设置RDB文件的名称
dbfilename "dump.rdb"

# 设置RDB文件存储的目录
dir /var/lib/redis/

# 开启RDB文件压缩,这会消耗CPU资源,但可以显著减少磁盘占用
rdbcompression yes

# 启用RDB文件的校验和,确保数据的完整性
rdbchecksum yes

# 使用管道技术来优化RDB持久化过程中的I/O操作,提高性能
rdbpipelining yes


# AOF持久化配置
# -------------------------------------------

# 开启AOF持久化
appendonly yes

# 设置AOF文件的名称
appendfilename "appendonly.aof"

# 设置AOF持久化策略,everysec表示每秒同步一次,平衡了性能和数据安全性
appendfsync everysec

# 配置AOF文件自动重写的触发条件,减少AOF文件的体积
auto-aof-rewrite-percentage 100

# 设置触发AOF重写的最小文件大小,避免在文件很小的时候进行重写
auto-aof-rewrite-min-size 64mb

# 当AOF文件尾部不完整时,允许启动并加载尽可能多的数据
aof-load-truncated yes


# 其他配置
# ---------------------------------------------

# 设置日志级别为信息,记录大部分有用的信息,适合生产环境
loglevel notice

# 设置工作目录
pidfile /var/run/redis/redis-server.pid

这个配置文件是为了在保证一定数据安全性的同时,尽可能提高Redis的性能而设计的。具体来说:

RDB持久化

  • 通过设置save指令,Redis会在特定的键更改次数和时间间隔后创建数据快照。这种配置减少了频繁的快照操作,从而降低了对性能的影响。
  • rdbcompression yes启用了RDB文件的压缩,这有助于减少磁盘空间的使用,但会消耗更多的CPU资源。如果你的服务器CPU资源充足,这将是一个值得启用的选项。
  • rdbpipelining yes可以优化RDB文件的写入过程,减少I/O操作次数,提高性能。

AOF持久化

  • appendfsync everysec策略是在性能和数据安全性之间的折中方案。它每秒同步一次AOF日志到磁盘,减少了数据丢失的风险,同时避免了每次写操作都同步带来的性能开销。
  • auto-aof-rewrite-percentageauto-aof-rewrite-min-size配置项可以自动触发AOF文件的重写,防止AOF文件无限增长,同时保持合理的性能开销。

其他性能优化

  • loglevel notice设置了日志级别,避免了记录过多信息,减少了日志操作对性能的影响。
  • rdbchecksum yes确保了RDB文件的校验和,虽然会增加一定的CPU开销,但有助于保证数据的完整性。

这个配置文件在确保数据安全性的同时,尽可能减少了对性能的影响。然而,"高性能"是相对的,并且取决于具体的使用场景和系统资源。在实际部署中,应该根据工作负载、数据重要性、硬件能力以及对数据丢失的容忍度来调整配置。

相关推荐

  1. Redis(2)】Redis持久方式RDBAOF配置

    2024-04-22 04:24:02       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 04:24:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 04:24:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 04:24:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 04:24:02       18 阅读

热门阅读

  1. tcp网络编程(基础)

    2024-04-22 04:24:02       12 阅读
  2. app创建

    app创建

    2024-04-22 04:24:02      14 阅读
  3. Unity 计时任务管理器TimeHandle

    2024-04-22 04:24:02       13 阅读
  4. HashMap

    HashMap

    2024-04-22 04:24:02      13 阅读
  5. 【随手笔记】一个关于typedef定义的数组调用问题

    2024-04-22 04:24:02       16 阅读
  6. docker安装Elasticsearch

    2024-04-22 04:24:02       12 阅读
  7. SparkSQL允许左联接的数据量大于左表数据量?

    2024-04-22 04:24:02       13 阅读
  8. Gradle:安装、配置及基础使用指南

    2024-04-22 04:24:02       12 阅读
  9. [leetcode] 快乐数 E

    2024-04-22 04:24:02       12 阅读
  10. C# 多线程 未完

    2024-04-22 04:24:02       9 阅读
  11. Python机器学习项目开发实战:深度神经网络

    2024-04-22 04:24:02       11 阅读
  12. Tomcat源码解析——热部署和热加载原理

    2024-04-22 04:24:02       13 阅读
  13. CentOS7 aarch64安装yum

    2024-04-22 04:24:02       12 阅读
  14. 关于使用后端实现动态表单功能的心得

    2024-04-22 04:24:02       11 阅读