元月's blog 元月's blog
首页
  • 基础
  • 并发编程
  • JVM
  • Spring
  • Redis篇
  • Nginx篇
  • Kafka篇
  • Otter篇
  • Shardingsphere篇
  • 设计模式
  • MySQL
  • Oracle
  • 基础
  • 操作系统
  • 网络
  • 数据结构
  • 技术文档
  • Git常用命令
  • GitHub技巧
  • 博客搭建
  • 开发工具
更多

元月

临渊羡鱼,不如退而结网
首页
  • 基础
  • 并发编程
  • JVM
  • Spring
  • Redis篇
  • Nginx篇
  • Kafka篇
  • Otter篇
  • Shardingsphere篇
  • 设计模式
  • MySQL
  • Oracle
  • 基础
  • 操作系统
  • 网络
  • 数据结构
  • 技术文档
  • Git常用命令
  • GitHub技巧
  • 博客搭建
  • 开发工具
更多
  • Redis

    • Redis安装
    • Redis持久化+灾难恢复方案
      • 前言
      • 一、Redis Persistence
        • 1、RDB 快照
        • save
        • bgsave
        • 2、AOF (Append Only File)
        • 基本配置
        • AOF重写
        • 3、Redis 4.0 混合持久化
        • 4、AOF和RDB,我们应该选哪一个?
      • 二、Disaster recovery
        • 灾难预防方案
        • 预防备份策略
      • 思维导图
    • Redis常见数据类型和使用场景
    • Redis数据结构(一)Hyperloglog的实现原理
    • Redis数据结构(二)Bitmap位图的实现原理
    • Redis高可用
    • Redis缓存过期策略以及淘汰策略是什么?
    • 缓存穿透、缓存击穿和缓存雪崩的解决方案
    • Redis分布式锁的演变历史
    • Redis的集成与应用
  • Nginx

  • Kafka

  • Shardingsphere

  • Otter

  • nexus

  • 中间件
  • Redis
元月
2022-06-17
目录

Redis持久化+灾难恢复方案

# Redis持久化和灾难恢复

# 前言

Redis是如何将数据持久化到硬盘?

在生产环境中,Redis如何进行灾难恢复?

如果你想了解更多Persistence和Disaster recovery方面的知识,亦可参考官方文档:https://redis.io/docs/manual/persistence/ (opens new window)

# 一、Redis Persistence

Redis是一种key-value型的非关系型内存数据库,Redis持久化是指将数据持久化存储,例如存储到SSD中,Redis提供了如下的持久化方案:

# 1、RDB 快照

默认情况下,Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中,可以配置redis"当N秒内有M次数据的变动"触发一次保存,或者也可以手动的调用save 或 bgsave 命令手动生成dump快照,手动执行save命令是同步的,会阻塞线程

# save

下面的命令“当redis在60 秒内有至少有 1000 个键被改动“,dump一次快照:

//60 秒内有至少有 1000 个键被改动
//关闭RDB只需要将所有的save保存策略注释掉即可
save 60 1000
1
2
3

# bgsave

bgsave使用到redis一种copy-on-write技术,过程如下

1、当redis开始dump时,会fork出一个子线程。

2、由子线程写入一个临时的RDB文件。

3、写入完成后,替换掉旧文件。

save和bgsave的区别

区别 save bgsave
IO类型 同步 异步
是否阻塞redis其它命令 是 否(在生成子进程执行调用fork函 数时会有短暂阻塞)
复杂度 O(n) O(n)
优点 不会消耗额外内存 不阻塞客户端命令
缺点 阻塞客户端命令 需要fork子进程,消耗内存

RDB方式使用的是bgsave命令

# 2、AOF (Append Only File)

将修改的指令记录进文件appendonly.aof中(先写入os cache,每隔一段时间fsync到磁盘)

# 基本配置

通过下面的配置开启:

appendonly yes
1

多久fsync一次到磁盘,有三个选项:

appendfsync always #每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全。
appendfsync everysec #默认。每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据。
appendfsync no #从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择
1
2
3

# AOF重写

自动重写配置:

#aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大
auto-aof-rewrite-min-size 64mb   
#aof文件自上一次重写后文件大小增长了100%则再次触发重写
auto-aof-rewrite-percentage 100  
#不触发重写
auto-aof-rewrite-percentage 0
1
2
3
4
5
6

除了自动重写外,AOF还可以手动重写,进入redis客户端执行命令bgrewriteaof,它也使用到redis一种copy-on-write技术,过程如下:

  1. 当redis开始rewrite时,会fork出一个子线程。
  2. 由子线程写入一个临时的RDB文件。
  3. 写入完成后,替换掉旧文件

Tips:当你不小心使用了flushall指令,只要rewrite没有执行,你依然恢复你的数据,关闭redis,删除AOF中的flushall指令,重启服务即可

# 3、Redis 4.0 混合持久化

重启 Redis 时, 选择AOF 文件恢复数据相对于RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。 Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。

通过下面的配置开启(必须先开启aof):

aof-use-rdb-preamble yes 
1

混合持久化过程如下:

  • 主线程会fork出一个子进程
  • 子进程会把内存中的数据以RDB的方式写入新的aof中
  • 把重写缓冲区中的增量命令以AOF方式写入到新文件
  • 将含有RDB个数和AOF格数的AOF数据覆盖旧的AOF文件

文件格式:

# 4、AOF和RDB,我们应该选哪一个?

命令 RDB AOF
启动优先级 低 高
体积 小 大
恢复速度 快 慢
数据安全性 容易丢失数据 根据策略决定

当RDB和AOF两种持久化方式都开启时,Redis重启会选择AOF文件恢复数据,因为相对而言,AOF文件的数据更全

# 二、Disaster recovery

在Redis的环境中,灾难恢复和备份是基本上一样的,只是在此基础上将持久化文件备份到外部的数据中心。这样,即使在一些灾难性事件,数据也是安全的。

# 灾难预防方案

  • 将每天或者每小时的RDB文件加密后(gpg -c等)传输到云存储服务器上,例如:Amazon s3,Ali cloud等
  • 通过SCP(SSH的一部分)命令将文件传输到其它服务器上

# 预防备份策略

  • 创建一个crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份
  • 每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份
  • 保证备份文件命名包含日期和时间,保证每次copy备份的时候,都把太旧的备份给删了
  • 每天一次将Redis机器上的备份复制一份到其他机器上,以防机器损坏

# 思维导图

#Redis
Redis安装
Redis常见数据类型和使用场景

← Redis安装 Redis常见数据类型和使用场景→

最近更新
01
otter二次开发-支持按目标端主键索引Load数据
08-03
02
mvnw简介
06-21
03
gor流量复制工具
06-03
更多文章>
Theme by Vdoing | Copyright © 2022-2024 元月 | 粤ICP备2022071877号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式