Redis 数据持久化方案
  2HyDHh3MOg71 2023年11月13日 29 0

今日目标

  • 掌握Redis数据持久化原理

在分布式系统中,存储非结构化数据的中间件Redis是必不可少的,Redis在小、中、大甚至高并发系统中都有发挥起作用的场合,在之前我已经给大家介绍过Redis的基础数据结构(String/Hash/Set/ZSet/List)的增删改查操作。

现在思考一个问题,Redis 如果仅仅只是将数据缓存在内存里面,如果 Redis 宕机了再重启,那么存储在内存中的数据是不是就全部丢失了,这是不是严重的生产事故?如何解决这样的问题?这就用到了我今天要介绍的内容Redis持久化机制,他在将数据写到内存的同时,也在异步的将数据写入磁盘,进行数据持久化

1. Docker安装Redis

我们演示Redis,因为之前已经介绍过Docker,所以我们现在以后的演示,都是使用Docker安装

  • 1.配置文件
mkdir -p /redis/data
mkdir -p /redis/config
cd /redis/config/
#`redis.conf`文件内容`http://download.redis.io/redis-stable/redis.conf`,redis的配置文件
curl -O -L http://download.redis.io/redis-stable/redis.conf
  • 2.启动Docker
docker run -d \
--name redis \
-e TZ=Asia/Shanghai \
-e LANG=en_US.UTF-8 \
-v /redis/data:/data \
-v /redis/config/redis.conf:/etc/redis/redis.conf \
-p 6379:6379 \
--restart unless-stopped \
redis:6.0.20

命令解读

  • docker run :创建并运行redis容器
  • --name : 给redis容器名字为redis
  • -p 6379:6379:这是Redis的主要端口,该端口号用于Redis客户端与Redis服务器之间的通讯,冒号左侧是宿主机端口,右侧是容器端口
  • -e TZ=Asia/Shanghai: 设置时区
  • -e  LANG=en_US.UTF-8: 设置编码格式
  • -d:后台运行容器
  • redis:6.0.20:镜像名称以及版本
  • 3.检验是否安装成功
docker ps

Redis 数据持久化方案_redis

2.Redis持久化

好了我们已经完成了Redis的安装,现在了介绍Redis持久化,Redis持久化方案有两种:

  • RDB持久化
  • AOF持久化

3. RDB持久化

RDB(Redis DataBase Backup file):Redis数据备份文件,也叫Redis数据快照。可以理解为将Redis所有数据进行备份到磁盘,当Redis出现宕机重启的时候,就会读取磁盘中快照文件,进行数据恢复。

3.1. RDB执行时机

RDB在四种情况下会执行持久化:

  • 1.执行save命令
  • 2.执行bgsave命令

  1. Redis停机时(默认执行一次save)
  1. 触发执行RDB条件

3.1.1.执行save命令进行RDB持久化

执行下面的命令,可以立即执行一次RDB,那么接下来就演示一下:

【步骤一】 进入redis容器
## 进入redis容器内部
 docker exec -it redis bash
【步骤二】 执行redis-cli
redis-cli

Redis 数据持久化方案_数据_02

【步骤三】 新打开一个窗口用于查看Redis日志
docker logs -f redis

注意:-f 参数表示实时跟踪容器的日志输出,即将新的日志输出实时打印出来,直到手动停止程序

Redis 数据持久化方案_持久化_03

【步骤四】 在redis客户端执行save命令,并查看Redis日志
save

只有执行save命令,日志中就会出现DB saved

Redis 数据持久化方案_redis_04

注意:save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

3.1.2.执行bgsave命令进行RDB持久化

在执行save命令的时候我们已经进入了redis客户端,以及redis日志,那么现在我们只需要执行命令进行查看即可

【步骤一】 在redis客户端执行bgsave命令,并查看Redis日志
bgsave

结果如下:

Redis 数据持久化方案_持久化_05

注意:bgsave命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响

3.1.3.Redis停机是RDB持久化

Redis停机时会执行一次save命令,实现RDB持久化。

【步骤一】 暂停redis容器
docker stop redis
【步骤二】 查看redis日志

结果如下:说在退出redis之前进行一次RDF

Redis 数据持久化方案_Redis_06

3.1.4. 触发RDB条件(理解Save格式即可)

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# 900秒内,如果超过1个key被修改,则发起快照保存
save 900 1
# 300秒内,如果超过10个key被修改,则发起快照保存
save 300 10
# 60秒内,如果1万个key被修改,则发起快照保存
save 60 10000

使用vim /redis/config/redis.conf,进行添加配置

Redis 数据持久化方案_Redis_07

注意:配置完成后,执行命令是bgsave , 如果是save "" 则表示禁用RDB

修改保存后重启redis,然后再进行数据的保存,来查看规则是否生效

docker restart redis

RDB的其它配置也可以在redis.conf文件中设置

# 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes

# RDB文件名称
dbfilename dump.rdb  

# 文件保存的路径目录
dir ./

3.2. RDB原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

Redis 数据持久化方案_持久化_08

RDB总结

RDB方式bgsave的基本流程

  • fork主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的RDB文件
  • 用新RDB文件替换旧的RDB文件

RDB会在什么时候执行

  • 默认是服务停止时

save 60 1000代表什么含义

  • 代表60秒内至少执行1000次修改则触发RDB

RDB的缺点

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
  • fork子进程、压缩、写出RDB文件都比较耗时

4.AOF持久化

AOF(Append Only File)文件追加:    Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

4.1. AOF配置

AOF默认关闭,需要在redis.conf文件中尽显配置开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

Redis 数据持久化方案_redis_09

Redis 数据持久化方案_数据_10

AOF的命令记录的频率也可以通过redis.conf文件来配

appendfsync everysec是默认方案

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

Redis 数据持久化方案_数据_11

思考:AOF默认配置下,会丢失数据?

AOF默认是会丢失数据的,但是最多也就丢失一秒数据

4.2. AOF配置策略对比

配置项

刷盘时机

优点

缺点

Always

同步刷盘

可靠性高,几乎不丢数据

性能影响大

everysec

每秒刷盘

性能适中

最多丢失1秒数据

no

操作系统控制

性能最好

可靠性较差,可能丢失大量数据

4.2. AOF文件重写

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

  • 在redis控制台执行
bgrewriteaof

发现开始完成文件写入

Redis 数据持久化方案_持久化_12

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-min-size 64mb

Redis 数据持久化方案_redis_13

AOF和RDB优缺点对比


RDB

AOF

持久化方式

定时对整个内存做快照

记录每一次执行的命令

数据完整性

不完整,两次备份之间会丢失

相对完整,取决于刷盘策略

文件大小

会有压缩,文件体积小

记录命令,文件体积很大

宕机恢复速度

很快

数据恢复优先级

低,因为数据完整性不如AOF

高,因为数据完整性更高

系统资源占用

高,大量CPU和内存消耗

低,主要是磁盘IO资源 但AOF重写时会占用大量CPU和内存资源

使用场景

可以容忍数分钟的数据丢失,追求更快的启动速度

对数据安全性要求较高常见

AOF和RDB的选择

在实际生产中我们如何选择AOF和RDB持久化呢?实际上他们两个是相互辅助的

  • 不能只设置RDB,因为只设置RDB会导致数据大量丢失(两次保存时间间隔的数据会丢失)
  • 不能只设置AOF,因为当 AOF 文件非常大时,恢复过程可能需要较长时间,RDB相对于AOF更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug;
  • Redis 支持同时开启开启两种持久化方式,我们可以综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,作为数据恢复的第一选择;用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年05月31日   33   0   0 Dockerredis
  xaeiTka4h8LY   2024年05月31日   44   0   0 nosqlredis
  xaeiTka4h8LY   2024年04月26日   54   0   0 yumredis
  xaeiTka4h8LY   2024年04月26日   50   0   0 centoslinuxredis
2HyDHh3MOg71