前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis持久化

Redis持久化

作者头像
爱撒谎的男孩
发布2019-12-31 15:06:10
6140
发布2019-12-31 15:06:10
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

  1. 1. Redis持久化
    1. 1.1. RDB (默认使用)
      1. 1.1.1. 手动触发 (bgsave)
      2. 1.1.2. 自动触发
      3. 1.1.3. 备份的文件位置
      4. 1.1.4. RDB的优缺点
        1. 1.1.4.1. 优点
        2. 1.1.4.2. 缺点
    2. 1.2. AOF
      1. 1.2.1. AOF 工作流程
      2. 1.2.2. 开启
      3. 1.2.3. 文件同步
      4. 1.2.4. 文件重写
        1. 1.2.4.1. 文件变小的原因
        2. 1.2.4.2. 手动触发
        3. 1.2.4.3. 自动触发
    3. 1.3. 性能优化
      1. 1.3.1. fork操作
        1. 1.3.1.1. 问题
        2. 1.3.1.2. 优化
    4. 1.4. 文件恢复

Redis持久化

RDB (默认使用)

  • RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。

手动触发 (bgsave)

  1. 执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回。
  2. 父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒。
  3. 父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令
  4. 子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项。
  5. 进程发送信号给父进程表示完成,父进程更新统计信息,具体见info Persistence下的rdb_*相关选项。

自动触发

  • 执行debug reload命令重新加载Redis时,也会自动触发save操作。
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则 自动执行bgsave。
  • 使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改 时,自动触发bgsave
  • 这个在配置文件redis.conf中配置
  • 默认的配置如下
代码语言:javascript
复制
save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
  • stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了
  • rdbcompression ;默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
  • rdbchecksum :默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
  • dbfilename :设置快照的文件名,默认是 dump.rdb
  • dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。
  • 也就是说通过在配置文件中配置的 save 方式,当实际操作满足该配置形式时就会进行 RDB 持久化,将当前的内存快照保存在 dir 配置的目录中,文件名由配置的dbfilename决定。

备份的文件位置

  • redis.conf中修改
  • dbfilename :设置快照的文件名,默认是 dump.rdb
  • dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。

RDB的优缺点

优点
  • RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份,并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。
  • Redis加载RDB恢复数据远远快于AOF的方式。
缺点
  • RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。
  • RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。
  • 针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决。

AOF

  • 开启AOF功能需要设置配置:appendonly yes,默认不开启。AOF文件名通过appendfilename配置设置,默认文件名是appendonly.aof。保存路径同RDB持久化方式一致,通过dir配置指定。AOF的工作流程操作:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)

AOF 工作流程

  1. 所有的写入命令会追加到aof_buf(缓冲区)中。
  2. AOF缓冲区根据对应的策略向硬盘做同步操作(同步策略)
  3. 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的
  4. 当Redis服务器重启时,可以加载AOF文件进行数据恢复。

开启

  • redis.conf文件中
  • 在启动时Redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些
代码语言:javascript
复制
appendonly yes   # 开启
  • 开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:
代码语言:javascript
复制
appendfilename appendonly.aof

文件同步

  • redis.conf配置文件中配置即可
  • Redis提供了多种AOF缓冲区同步文件策略,由参数appendfsync控制,可以在配置文件中配置,三种策略如下:
    • appendfsync always
      • 每次写入都要同步AOF文件,在一般的SATA硬盘上,Redis只能支持大约几百TPS写入,显然跟Redis高性能特性背道而驰,不建议配置。
      • 每次写入都需要同步,最安全也是最慢的
    • appendfsync everysec
      • 是建议的同步策略,也是默认配置,做到兼顾性能和数据安全性。理论上只有在系统突然宕机的情况下丢失1秒的数据。
      • 每秒同步一次,默认的配置
    • appendfsync no
      • 由于操作系统每次同步AOF文件的周期不可控,而且会加大每次同步硬盘的数据量,虽然提升了性能,但数据安全性无法保证
      • 不主动同步,而是交由操作系统来做(每30秒同步一次)

文件重写

  • 随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入AOF重写机制压缩文件体积。AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程。
文件变小的原因
  1. 进程内已经超时的数据不再写入文件。
  2. 旧的AOF文件含有无效命令,如del key1、hdel key2、srem keys、seta111、set a222等。重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。
  3. 多条写命令可以合并为一个,如:lpush list a、lpush list b、lpush listc可以转化为:lpush list a b c。为了防止单条命令过大造成客户端缓冲区溢出,对于list、set、hash、zset等类型操作,以64个元素为界拆分为多条
手动触发
  • 直接调用bgrewriteaof命令。
自动触发
  • 根据auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage参 数确定自动触发时机。
    • auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB。
    • auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)和上一次重写后AOF文件间(aof_base_size)的比值。

性能优化

fork操作

问题
  • 每次执行持久化的时候都需要fork一个子进程,同时也会阻塞命令的执行
  • 当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创建子进程,对于大多数操作系统来说fork是个重量级错误。虽然fork创建的子进程不需要拷贝父进程的物理内存空间,但是会复制父进程的空间内存页表。例如对于10GB的Redis进程,需要复制大约20MB的内存页表,因此fork操作耗时跟进程总内存量息息相关,如果使用虚拟化技术,特别是Xen虚拟机,fork操作会更耗时。
  • 对于高流量的Redis实例OPS可达5万以上,如果fork操作耗时在秒级别将拖慢Redis几万条命令执行,对线上应用延迟影响非常明显。正常情况下fork耗时应该是每GB消耗20毫秒左右。可以在info stats统计中查latest_fork_usec指标获取最近一次fork操作耗时,单位微秒
优化
  1. 优先使用物理机或者高效支持fork操作的虚拟化技术,避免使用 Xen。
  2. 控制Redis实例最大可用内存,fork耗时跟内存量成正比,线上建议 每个Redis实例内存控制在10GB以内。
  3. 合理配置Linux内存分配策略,避免物理内存不足导致fork失败
  4. 降低fork操作的频率,如适度放宽AOF自动触发时机,避免不必要的全量复制等。

文件恢复

  • 如果需要恢复数据,只需要将备份的文件放在redis的安装目录即可,那么当redis重启加载的时候就会自动恢复数据
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis持久化
    • RDB (默认使用)
      • 手动触发 (bgsave)
      • 自动触发
      • 备份的文件位置
      • RDB的优缺点
    • AOF
      • AOF 工作流程
      • 开启
      • 文件同步
      • 文件重写
    • 性能优化
      • fork操作
    • 文件恢复
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档