美文网首页
高并发redis - 持久化备份方案

高并发redis - 持久化备份方案

作者: coder爱唱歌 | 来源:发表于2020-03-26 15:46 被阅读0次

1.高并发redis - 持久化备份方案

redis几乎是我们在实际开发过程中提升效率必须用到的工具,特别在高并发场景下,
redis号称单机10w+qps,除了高qps,数据安全也是一个系统必须考虑的部分,
redis数据持久化是保证数据安全一个重要环节,所以现在就来讨论一下redis持久化相关内容。

会讨论一下以下几个方面

  • 1、redis数据持久化的作用
  • 2、redis的持久化,RDB,AOF区别,各自特点,适合什么场景
  • 3、生产环境数据冷备和热备的方案
  • 4、用docker启动单机redis(带生产环境redis配置)
  • 5、容灾演练

1、redis数据持久化的作用

  • 1.主要是故障恢复。
    • 因为redis程序运行过程中,总会遇到一些不可预测的问题,比如机器down了,
      docker空间满了挂了,redis内存满了,等等一系列问题。
  • 2.高可用的一个环节。
    • 当数据恢复,能保证redis重启后快速投入使用
    • 如果重启后,没有数据恢复,就会产生缓存雪崩问题,
      所有请求都会打到数据源头mysql,过万的qps打到mysql,那么mysql一下就挂了。
缓存雪崩.png

2、redis的持久化,RDB,AOF区别,各自特点,适合什么场景

RDB

对redis数据执行周期性备份,每隔一定时间(自己设置),生成redis内存中的数据的一份完整的快照(rdb文件)
配置后生成的文件是.rdb后缀的,纯数据文件,不便于阅读。
rdb文件内容示例-二进制压缩.png

AOF

.aof后缀文件是记录每条操作指令的文件,基本可读。
现在操作系统写文件不是直接写磁盘,会先写os cache,然后操作系统每隔一秒调用fsync操作,把数据从os cache到磁盘,只有到了磁盘,数据才是安全的。
没有一条指令,就会往os cache写一条命令,然后设置每秒做一个fsync,把指令写到磁盘
如果同时有aof和rdb文件,优先使用aof文件去恢复数据,因为里面的数据比较完整。
aof文件内容.png
  • fsync :把os cache的数据写到磁盘的aof文件中
  • rewrite:.aof文件记录每一条指令,所以它会越来越大,当到达一个配置设置值的时候
    ,就会基于当前redis数据,重新生成一份aof文件来压缩体积。
    • 例如现在设置了一个 set name along;
    • 有执行了一个 del name ;
    • 此时.aof文件存了这两条指令,但是数据没变化,所以rewrite压缩的时候,可以把这个的无效指令去掉
  • appendfsync:把os cache数据刷到磁盘的评率。
    • 如果把appendfsync设置为always,相当于是每次写磁盘了 那么吞吐量很低。
    • mysql最多1-2k,redis单机一般来说,上万-几十万。如果设为always,就基本是基于磁盘只有1-2k了。设为everysec,qps也上万


      AOF和RDB介绍.png

AOF和RDB文件对比

rdb的优点:

  • rdb会生成多个数据文件,每个数据文件都代表了某一个时刻redis中完整的数据,多文件的方式,适合做冷备份。
  • rdb是redis效率最高的,因为他会fork一个子进程去操作。
  • 相当与aof持久化机制,直接基于rdb数据文件来重启和恢复redis进程,更加快速。
    • 因为rdb是数据文件,直接加载入内存,而aof是在redis中把之前执行过的指令一一执行一遍。
  • rdb做冷备,是由redis定时生成文件,比较方便
  • rdb每次都是写内存的,一定时间才会fork进程去写文件,而aof是每次都写文件
    rdb的缺点:
  • 很明显,会造成数据的丢失(最主要缺点)
    • 例如每隔5分钟写一次,那么如果刚写完一次,
    • 过了四分钟,还没来得及写下一次,但是redis挂了,没来的写下一次,那么,这四分钟的数据就丢了。
  • 如果每次rdb时间间隔设置过长,数据过多,fork进程写数据的时候会导致redis去处理rdb,而暂时不能提供服务(几秒或者数秒)
    aof的优点:
  • aof可以很好的保护数据不丢失,因为aof每隔一秒,在后台执行一次fsync操作,做多丢失1秒数据
  • aof日志文件以append-only模式写入,所以没有磁盘寻址的开销,写入效率很高。
  • 会fork一个进程把老文件整合,整合完毕,然后就把老文件删了(rewrite)
  • aof文件是指令文件,可读的。
    aof的缺点:
  • 数据恢复会比较慢
    • 指令文件,同样数据,肯定比rdb数据文件大,执行时间长。
  • 一般设置每秒一次fsync操作,相比rdb会增加一些额外开销。

3、生产环境数据冷备和热备的方案

首先在生产环境,aof和rdb都是必须打开的,因为数据安全的重要性不言而喻,保证数据的最少丢失。
一般都是配套使用

  • 首先 appendonly yes; appendfsync everysec; 开启每秒的aof
  • 然后save 300 1000; 开启每5分钟的rdb,数据量根据业务来
  • 数据冷备份方案:
    • 写crontab定时调度脚本去做数据备份
    • 每小时都copy一份rdb的备份,到一个目录,仅仅保留最近48小时的备份
    • 每天都保留一份当日的rdb备份,到一个目录中去,仅仅保留最近一个月的备份
    • 每次copy备份的时候,都把太久的备份给删掉
    • 每天晚上把当前服务器上所有的数据备份,发送一份到远程云服务上去。

相关脚本
redis_rdb_copy_daily.sh 备份30天

# 先创建当天的
cur_date=`date +%Y%m%d`
rm -rf /data/rdb_back/$cur_date
mkdir /data/rdb_back/$cur_date
cp /data/dump.rdb /data/rdb_back/$cur_date

# 然后删除一个月之前的
del_date=`date -d -1month +%Y%m%d`
rm -rf /data/rdb_back/$del_date

redis_rdb_copy_hourly.sh 48小时的

cur_date=`date +%Y%m%d%k`
rm -rf /data/rdb_backup/$cur_date
mkdir /data/rdb_backup/$cur_date
cp /data/dump.rdb /data/rdb_backup/$cur_date

del_date=`date -d -48hour +%Y%m%d%k`
rm -rf /data/rdb_backup/$del_date

添加定时器脚本

crontab -e
0 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh
0 0 * * * sh /data/redis/sh/redis_rdb_copy_daily.sh

测试sh脚本方法为,手动执行这两个sh脚本,自定义时间,看能不能在对应文件夹生成文件。

注意:这里直说冷备方案,因为后面会将主从复制和哨兵之类的,通过节点切换来完成热备份高可用。

4、用docker启动单机redis(带生产环境redis配置)

用docker起动单个redis:redis.conf放在/data/redis/redis.conf
redis.conf

#下面包括了密码,rdb的设置,aof的设置,和工作目录地址
port 6379
requirepass "123456"
dbfilename "dump.rdb"
dir "/data"
logfile "/data/redis.log"
save 300 20
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 1mb

docker启动脚本

# 挂载/data/redis/ 到 redis.conf设置的dir中
docker run -d --name redis1 -p 6379:6379 -v /data/redis/:/data/ redis redis-server /data/redis.conf

启动后进入容器,随便设置几个key,然后退出来,就会发现,/data/redis 下面就会多出了rdb,aof,log等文件


docker启动reids后多出来文件.png

5、容灾演练
模拟redis直接挂掉,然后进行数据恢复的过程。

  • 首先直接在docker中把redis的container删掉
  • 然后查看/data/redis/下面的aof文件是否存在
  • 存在的话用上面docker启动指令再次启动reids
  • 进入容器内的redis-cli,查看刚才设置的key,是存在的,这就说明数据备份成功。

相关文章

  • 高并发redis - 持久化备份方案

    1.高并发redis - 持久化备份方案 redis几乎是我们在实际开发过程中提升效率必须用到的工具,特别在高并发...

  • redis备份

    --rdb选项会请求Redis实例生成并发送RDB持久化文件, 保存在本地。 可使用它做持久化文件的定期备份。 p...

  • 深入学习Redis:主从复制

    在Redis的持久化中曾提到,Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重...

  • Redis高可用, 2022-06-28

    (2022.06.28 Tues)Redis高可用有多种表现形式,分别是持久化persistence,备份repl...

  • redis的持久化方案

    redis有两种持久化方案: RDB:以指定时间间隔对数据集进行备份(全量备份); AOF:AOF模式记录serv...

  • redis 持久化策略

    企业级redis集群架构的特点 海量数据 高并发 高可用 要达到高可用,持久化是不可减少的,持久化主要是做灾难恢复...

  • 基于Redis5.0.2的总结随笔

    Redis支持数据持久化,众多数据结构存储,master-slave模式数据备份等多种功能。 Redis持久化 持...

  • Spring Boot(十三):整合Redis哨兵,集群模式实践

    前面的两篇文章(Redis的持久化方案, 一文掌握Redis的三种集群方案)分别介绍了Redis的持久化与集群方案...

  • 【redis主从复制解析】

    前言 redis的高可用涉及到持久化、主从复制(读写分离)、哨兵和集群。持久化主要是内存数据到磁盘,是一个单机备份...

  • Redis缓存持久化策略

    Redis RDB持久化原理 简介:rdb持久化方案配置讲解,redis的开发者是怎么实现rdb的 rdb持久化配...

网友评论

      本文标题:高并发redis - 持久化备份方案

      本文链接:https://www.haomeiwen.com/subject/ktycuhtx.html