Redis的持久化机制和配置-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Redis 的数据全部在内存里如果突然宕机数据就会全部丢失因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失这种机制就是 Redis 的持久化机制。

Redis 的持久化机制有两种第一种是RDB快照第二种是 AOF 日志。快照是一次全量备份AOF 日志是连续的增量备份。快照是内存数据的二进制序列化形式在存储上非常紧凑而 AOF 日志记录的是内存数据修改的指令记录文本。

1、RDB快照

RDB快照是某个时间点的一次全量数据备份是二进制文件在存储上非常紧凑。

1.1 触发机制

RDB持久化触发机制分为手动触发自动触发 手动触发

save命令会阻塞当前服务器直到RDB完成为止如果数据量大的话会造成长时间的阻塞线上环境一般禁止使用 bgsave命令就是background save执行bgsave命令时Redis主进程会fork一个子进程来完成RDB的过程完成后自动结束操作系统的多进程Copy On Write机制简称COW。所以Redis主进程阻塞时间只有fork阶段的那一下。相对于save阻塞时间很短。

自动触发

场景一配置redis.conf触发规则自动执行

# 当在规定的时间内Redis发生了写操作的个数满足条件会触发发生BGSAVE命令。
# save <seconds> <changes>
# 当用户设置了多个save的选项配置只要其中任一条满足Redis都会触发一次BGSAVE操作
save 900 1 
save 300 10 
save 60 10000

# 以上配置的含义900秒之内至少一次写操作、300秒之内至少发生10次写操作、
# 60秒之内发生至少10000次写操作只要满足任一条件均会触发bgsave

场景二执行shutdown命令关闭服务器时如果没有开启AOF持久化功能那么会自动执行一次bgsave

场景三主从同步slave和master建立同步机制

1.2 RDB执行流程

Redis 使用操作系统的多进程 cow(Copy On Write) 机制来实现RDB快照持久化

  1. 执行bgsave命令的时候Redis主进程会检查是否有子进程在执行RDB/AOF持久化任务如果有的话直接返回
  2. Redis主进程会fork一个子进程来执行执行RDB操作fork操作会对主进程造成阻塞影响Redis的读写fork操作完成后会发消息给主进程从而不再阻塞主进程。阻塞仅指主进程fork子进程的过程后续子进程执行操作时不会阻塞
  3. RDB子进程会根据Redis主进程的内存生成临时的快照文件持久化完成后会使用临时快照文件替换掉原来的RDB文件。该过程中主进程的读写不受影响但Redis的写操作不会同步到主进程的主内存中而是会写到一个临时的内存区域作为一个副本
  4. 子进程完成RDB持久化后会发消息给主进程通知RDB持久化完成将上阶段内存副本中的增量写数据同步到主内存

1.3 RDB的优缺点

优点

  • RDB文件小非常适合定时备份用于灾难恢复
  • Redis加载RDB文件的速度比AOF快很多因为RDB文件中直接存储的时内存数据而AOF文件中存储的是一条条命令需要重演命令。

缺点

  • RDB无法做到实时持久化若在两次bgsave间宕机则会丢失区间分钟级的增量数据不适用于实时性要求较高的场景
  • RDB的cow机制中fork子进程属于重量级操作并且会阻塞redis主进程
  • 存在老版本的Redis不兼容新版本RDB格式文件的问题

2、AOFappend only file日志

AOF日志是持续增量的备份是基于写命令存储的可读的文本文件。AOF日志会在持续运行中持续增大由于Redis重启过程需要优先加载AOF日志进行指令重放以恢复数据恢复时间会无比漫长。所以需要定期进行AOF重写对AOF日志进行瘦身。目前AOF是Redis持久化的主流方式。

2.1 开启方式

AOF默认是关闭的通过redis.conf配置文件进行开启

## 此选项为aof功能的开关默认为“no”可以通过“yes”来开启aof功能  
## 只有在“yes”下aof重写/文件同步等特性才会生效  
appendonly yes  

## 指定aof文件名称  
appendfilename appendonly.aof  

## 指定aof操作中文件同步策略有三个合法值always everysec no,默认为everysec  
appendfsync everysec  
## 在aof-rewrite期间appendfsync是否暂缓文件同步"no"表示“不暂缓”“yes”表示“暂缓”默认为“no”  
no-appendfsync-on-rewrite no  

## aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite默认“64mb”建议“512mb”  
auto-aof-rewrite-min-size 64mb  

## 相对于“上一次”rewrite本次rewrite触发时aof文件应该增长的百分比  
## 每一次rewrite之后redis都会记录下此时“新aof”文件的大小(例如A)
## aof文件增长到A*(1 + p)之后触发下一次rewrite每一次aof记录的添加都会检测当前aof文件的尺寸。  
auto-aof-rewrite-percentage 100

AOF是文件操作对于变更操作比较密集的server那么将造成磁盘IO的负荷加重。此外linux对文件操作采取了“延迟写入”手段即并非每次write操作都会触发实际磁盘操作而是进入了buffer中当buffer数据达到阀值时触发实际写入(也有其他时机)这是linux对文件系统的优化。

Linux 的glibc提供了fsync(int fd)函数可以将指定文件的内容强制从内核缓存刷到磁盘。只要 Redis 进程实时调用 fsync 函数就可以保证 aof 日志不丢失。但是 fsync 是一个磁盘 IO 操作它很慢如果 Redis 执行一条指令就要 fsync 一次那么 Redis 高性能的地位就不保了。

因此在上述配置文件中可观察到Redis中提供了3中AOF记录同步选项

  • always每一条AOF记录都立即同步到文件性能很低但较为安全。
  • everysec每秒同步一次性能和安全都比较中庸的方式也是redis推荐的方式。如果遇到物理服务器故障可能导致最多1秒的AOF记录丢失。
  • noRedis永不直接调用文件同步而是让操作系统来决定何时同步磁盘。性能较好但很不安全。

2.2 重写rewrite机制

AOF日志会在持续运行中持续增大需要定期进行AOF重写对AOF日志进行瘦身。

AOF Rewrite 虽然是“压缩”AOF文件的过程但并非采用“基于原AOF文件”来重写或压缩而是采取了类似RDB快照的方式基于Copy On Write全量遍历内存中数据然后逐个序列到AOF文件中。因此AOF rewrite能够正确反应当前内存数据的状态。

AOF重写bgrewriteaof和RDB快照写入bgsave过程类似二者都消耗磁盘IO。Redis采取了“schedule”策略无论是“人工干预”还是系统触发快照和重写需要逐个被执行。

重写过程中对于新的变更操作将仍然被写入到原AOF文件中同时这些新的变更操作也会被Redis收集起来。当内存中的数据被全部写入到新的AOF文件之后收集的新的变更操作也将被一并追加到新的AOF文件中。然后将新AOF文件重命名为appendonly.aof使用新AOF文件替换老文件此后所有的操作都将被写入新的AOF文件。

2.3 触发机制

和RDB类似AOF触发机制也分为手动触发自动触发

手动触发 直接调用bgrewriteaof命令

redis-cli -h ip -p port bgrewriteaof

自动触发

根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机

auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积默认为64MB我们线上是512MB。

auto-aof-rewrite-percentage:代表当前AOF文件空间aof_current_size和上一次重写后AOF文件空间aof_base_size的值

自动触发时机

(aof_current_size > auto-aof-rewrite-min-size ) && (aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage

其中aof_current_size和aof_base_size可以在info Persistence统计信息中查看。

2.4 AOF的优缺点

优点 AOF只是追加写日志文件对服务器性能影响较小速度比RDB要快消耗的内存较少

缺点

  • AOF方式生成的日志文件太大需要不断AOF重写进行瘦身。
  • 即使经过AOF重写瘦身由于文件是文本文件文件体积较大相比于RDB的二进制文件。
  • AOF重演命令式的恢复数据速度显然比RDB要慢。

3、Redis 4.0 混合持久化

  • 仅使用RDB快照方式恢复数据由于快照时间粒度较大时回丢失大量数据。
  • 仅使用AOF重放方式恢复数据日志性能相对 rdb 来说要慢。在 Redis 实例很大的情况下启动需要花费很长的时间。

Redis 4.0 为了解决这个问题带来了一个新的持久化选项——混合持久化。将 rdb 文件的内容和增量的 AOF 日志文件存在一起。这里的 AOF 日志不再是全量的日志而是自持久化开始到持久化结束的这段时间发生的增量 AOF 日志通常这部分 AOF 日志很小。相当于

  • 大量数据使用粗粒度时间上的rdb快照方式性能高恢复时间快。
  • 增量数据使用细粒度时间上的AOF日志方式尽量保证数据的不丢失。

在 Redis 重启的时候可以先加载 rdb 的内容然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放重启效率因此大幅得到提升。

混合持久化是最佳方式吗

不一定。

首先混合持久化是Redis 4.0才引入的特性现在很多 公司可能都还在使用3.x版本。使用不了这一特性。

另外可以使用下面这种方式。Master使用AOFSlave使用RDB快照master需要首先确保数据完整性它作为数据备份的第一选择slave提供只读服务或仅作为备机它的主要目的就是快速响应客户端read请求或灾切换。

至于具体使用哪种持久化方式就看大家根据场景选择。没有最好只有最合适。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis