当前位置: 首页 > news >正文

Redis: RDB与AOF的选择和容灾备份以及Redis数据持久化的优化方案

如何选择RDB和AOF


1 )同时开启

  • 在我们 Redis 的服务器上,把RDB和AOF同时打开, 这样可以通过RDB快速的恢复数据,因为它是一个紧凑的缩缩的二进制文件, 但是有时 Redis 的不小心故障了,丢失了十几分钟的数据

  • 可以通过AOF来做数据的恢复, 因为它所有写命令都会记录,Redis先加载AOF文件来恢复原始数据,因为AOF数据比RDB更完整,有时候我们会把一些错误的命令也记录在文件中, 会有一些潜在的bug,可以通过 redis-check-aof 来做修复,如果AOF文件实在是用不了,恢复不了,可以把RDB作为一种后备数据来使用,这就是最常用的一种方式

  • 为了考虑性能,可以只在Slave上开启RDB,并且15min备份一次,因为在主从模式下让从节点去实现持久化,其实也是可以达到避免数据丢失的这样的一个效果,如果为了避免 AOF rewite的IO以及阻塞,可以在Redis集群中不开启AOF, 靠集群的备份机制来保证可用性,在启动时选取较新的RDB文件,如果集群全部崩溃,会丢失15min前的数据

2 )混合模式

  • Redis4.0开始支持该模式
  • 解决的问题:Redis在重启时通常是加载AOF文件,但加载速度慢
  • 因为 RDB 数据不完整,所以加载 AOF
  • 开启方式:aof-use-rdb-preamble true
  • 开启后,AOF在重写时会直接读取RDB中的内容
  • 运行过程:通过 bgrwriteaof 完成,不同的是当开启混合持久化后
    • 子进程会把内存中的数据以RDB的方式写入aof中
    • 把重写缓冲区中的增量命令以AOF方式写入到文件
    • 将含有RDB个数和AOF格数的AOF数据覆盖旧的AOF文件
  • 新的AOF文件中,一部分数据来自RDB文件,一部分来自Redis运行过程时的增量数据

3 ) 数据恢复

  • 当我们开启了混合持久化时,启动Redis依然优先加载aof文件,aof文件加载可能有两种情况如下:
    • aof文件开头是rdb的格式,先加载 rdb内容再加载剩余的 aof
    • aof文件开头不是rdb的格式,直接以aof格式加载整个文件
  • 优点:既能快速备份又能避免大量数据丢失
  • 缺点:RDB是压缩格式,AOF在读取它时可读性较差

二者动态切换

  • 在Redis 2.2或以上版本,可以在不重启的情况下,从RDB切换到AOF:
    • 为最新的dump.rdb文件创建一个备份
    • 将备份放到一个安全的地方 cp dump.rdb dump.rdb.bak
  • 执行以下两条命令:
    # 开启 aof
    redis-cli config set appendonly yes
    # 关闭 rdb
    redis-cli config set save ""
    
  • 确保写命令会被正确地追加到AOF文件的末尾
  • 执行的第一条命令开启了AOF功能:
    • Redis会阻塞直到初始AOF文件创建完成为止,所以不要在高峰期做这个事情
    • 之后Redis会继续处理命令请求,并开始将写入命令追加到AOF文件末尾

Redis容灾备份


1 ) 开启RDB持久化

save 900 1
save 300 10
save 60 10000

2 ) 开启AOF配置

# 开启 aof
appendonly yes
appendfilename "appendony. aof"# rewrite
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb# appendfsync always
appendfsync everysec
# appendfsync no

3 ) RDB日志备份,编写脚本定时备份

  • vim bin/redis-rdb-copy-per-hour.sh

    #!bin/bash
    cur_date=$(date "+%Y%m%d%H%M%S")
    rm -rf /usr/local/redis/snapshotting/$cur_date
    mkdir -p /usr/local/redis/snapshotting/$cur_date
    cp /usr/local/redis/data/dump.rdb /usr/local/redis/snapshotting/$cur_datedel_date=$(date -d -48hour "+%Y%m%d%H%M")
    rm -rf /usr/local/redis/snapshotting/$del_date
    
    • 备份与删除48小时之前的
  • 使用 crontab 定时器执行备份脚本

    • 确保机器上有定时任务服务 $ systemctl status crond 可看到定时服务是运行的状态
    • 默认linux都会集成 crond 服务,没有启动,进行 start 即可
    • 现在编写定时任务 :$ crontab -e
    • 下面写入 (以下为每分钟执行一次,生产环境可调整为每小时执行一次)
      */1 * * * * sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
      */1 * * * * sleep 10; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
      */1 * * * * sleep 20; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
      */1 * * * * sleep 30; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
      */1 * * * * sleep 40; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
      */1 * * * * sleep 50; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
      
      • 这里虽然每分钟执行一次,但是加上了 sleep 用来演示阻塞的效果,仅仅是演示
      • */1 表示“每 1 分钟”,而其余的星号分别代表小时、日期、月份和星期几,这里用星号表示任意值
      • 生产环境配置如:0 * * * * sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh 每小时执行一次
    • 查看定时任务列表 $ crontab -l
    • 到时间后,检查是否生成相应的备份
  • 这样就实现了通过脚本来实现了容灾备份

  • 考虑到恢复,则考虑到 redis 进程挂掉了

    • 基于 aof 和 rdb 文件恢复即可
    • 如果 aof 文件损坏了,可以通过机器上最新时间段的rdb副本来恢复

Redis 持久化的优化方案


1 )独立部署

  • 因为Redis 的RDB和AOF文件生成的这个过程,除了会对内存和硬硬盘造成压力之外
  • 它其实都是属于一个CPU密集型的操作,所以最好是把 Redis 单独部署在一台服务器上
  • 不要和其他的存储服务, 例如关系数据库或者说消息队列服务部署在一起
  • 消息队列和关系数据库本来就会有大量的磁盘IO
  • 再加上 Redis 的话,可能磁盘和CPU就会受不了
  • 选择独立部署,其实就是为了解决子进程的频繁开销的问题

2 ) 硬盘优化

  • 可以根据写入量来决定,比如当前这个 Redis 的服务器,它有大量的写入请求的话
  • 可以决定是否使用性能更高的SSD的磁盘

3 ) 缓存禁用持久化

  • 如果我们业务的Redis 它的定位就是做缓存
  • 缓存的数据肯定是在别的地方都已经有的,即使它丢失了也不要紧
  • 这个缓存备份,就是AB两套缓存:比如,A缓存失效了,马上B缓存顶上去
  • 只需要把这种方案做好就行, 持久缓存的数据丢失了,是不需要考虑的
  • 因为这个缓存的数据肯定是在关系数据库里边都有的,丢失了也不要紧
  • 所以说这种场景下,就可以把 Redis 这个节点的持久化功能,直接给它禁用掉
  • 这样它从关系数据库加载提供缓存的服务就可以了

4 ) 主从模式从持久化

  • 从模式主从模式从节点的数据是从主节点复制的
  • 因为从节点我们一般是不会开启写模式的,也就是它是只读的
  • 它是写不进去数据的,它的数据都是通过主节点复制过去的
  • 但是它每次从主节点复制数据的时候,首先会主节点进行一次BGSAVE的操作
  • 然后跟磁盘交互一下,生成RDB的快照,然后再把快照发给从节点,这就是一次复制的过程
  • 如果从节点频繁的跟主节点进行复制,那么主节点这边肯定会压力比较大
  • 因为它频繁的在fork 进程去做RDB快照生成这件事情
  • 这样可以考虑,把主节点的持久化给它关闭掉, 从节点来做持久化
  • 比如说,从节点,15分钟备份一次,只需要在从节点上添加一个 save 900 1 就可以了
  • 甚至可以把AOF也给它禁用掉,因为 master/slave 主从已经高可用了,数据是不可能丢失的
  • 因为15分钟内,假如说某一节点的数据丢失了,但还有其他的节点还在工作着
  • 所以说不可能像之前单节点十几分钟的一个很长的窗口期,当掉了,数据全丢了
  • 也可以考虑AOF的禁用,那就又节省掉了一大笔的IO的行为
  • 因为AOF它在 rewrite 的时候肯定会带来一个系统的波动,因为AOF的同步策略默认情况下是每秒
  • 每一次的同步实际上都是它要去把这些数据从缓冲区写到一个AOF文件里边
  • 最后会覆盖掉原来的那个AOF文件,它是这样去做的
  • 新浪微博的架构就是
    • 主从模式, 从节点备份
    • 然后关闭主节点AOF提高性能

5 ) 优化 fork 处理

  • 这个优化就是降低 AOF 的重写频率
  • RDB它虽然是子进程 fork 在做这件事情,但是RDB毕竟是一个很长的时间窗口期才会去做这件事儿
  • 所以,降低重写频率,说的无非就是我们开启了AOF的情况
  • 比如说,现在已经超过64m了,它就会rewrite,在rewrite的这个过程中,它肯定是会影响到性能的
  • 那我们把 rewrite的执行的这个时间给它拉长,即把重写上限调高,比如从 64m 到 5g
  • 这样就可以降低rewrite的一个触发的频率
  • 这样,也会提高我们的性能,降低 fork 子进程的一个创建
  • 还有一个AOF的配置优化,在重写的时候,要不要去执行正常的追加操作
    • 如果说在它重写的这个期间段内,本来就已经带来阻塞了
    • 然后我还让它去正常进入我们正常的一些命令
    • 这个时候它又要去folk进程去做这件事,开销销比较大的
    • 我们可以把这个 no-appendfsync-on-rewrite 选项改为 yes ,(默认是 no)
    • 改为yes之后,AOF 重写段内不去执行接收正常命令追加的这个行为
    • 这样的话,它就会专心去做 rewrite,rewrite做完才会继续接受命令
    • 这个方案不好的地方就是重写期间的数据可能会丢失,需要根据具体生产环境
    • 包括你的服务器CPU硬盘各方面因素来决定的,如果你的硬盘是能扛得住的
    • 你的服务器性能是比较好的,就可以忽略,这个选项不要去禁用
    • 让它在重写期间仍然可以执行正常的追加就可以了

相关文章:

Redis: RDB与AOF的选择和容灾备份以及Redis数据持久化的优化方案

如何选择RDB和AOF 1 )同时开启 在我们 Redis 的服务器上,把RDB和AOF同时打开, 这样可以通过RDB快速的恢复数据,因为它是一个紧凑的缩缩的二进制文件, 但是有时 Redis 的不小心故障了,丢失了十几分钟的数据 可以通过AOF来做数据的…...

Goweb---Gorm操作数据库(二)

Gorm允许用户自己自定义钩子操作,使用这些钩子操作,可以在增删改查操作前进行相关的操作和检验,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。 自定义钩子函数 package ma…...

鸿蒙HarmonyOS之封装Http请求工具类

一、常量类 Constants.ets //超时时间10秒 static readonly HTTP_READ_TIMEOUT: number 10000;//请求成功返回码 static readonly HTTP_CODE_200: number 200;//请求成功后data中的code值(根据实际情况定) static readonly SERVER_CODE_SUCCESS: numb…...

java基础(4)类和对象

目录 1.前言 2.正文 2.1类的定义与使用 2.1.1类的定义 2.1.2类的实例化 2.1.3this引用 2.1.3.1 访问当前对象的成员变量 2.1.3.2调用当前对象的成员方法 2.1.3.3构造函数中的 this 2.1.3.4归纳this 2.2封装 2.2.1封装的定义 2.2.2访问修饰符 2.3static 2.3.1sta…...

[Linux]:线程(二)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 与Windows环境不同,我们在linux环境下需要通过指令进行各操作&…...

【unity进阶知识3】封装一个事件管理系统

前言 框架的事件系统主要负责高效的方法调用与数据传递,实现各功能之间的解耦,通常在调用某个实例的方法时,必须先获得这个实例的引用或者新实例化一个对象,低耦合度的框架结构希望程序本身不去关注被调用的方法所依托的实例对象…...

服务器使用frp做内网穿透详细教程,请码住

目录 1.内网穿透的定义 2.前提条件 3.frp下载地址 4.配置服务器端的frps.toml文件 5. 配置客户端,即物理服务器或者是电脑本机地址 6.添加服务端启动命令startServerFrp.sh 7.添加客户端启动命令startClientFrp.sh 8. 查看服务端启动日志 9.查看客户端启…...

小程序视频编辑SDK解决方案,轻量化视频制作解决方案

面对小程序、网页、HTML5等多样化平台,如何轻松实现视频编辑的轻量化与高效化,成为了众多开发者和内容创作者共同面临的挑战。正是洞察到这一市场需求,美摄科技推出了其领先的小程序视频编辑SDK解决方案,为创意插上翅膀&#xff0…...

ERROR [internal] load metadata for docker.io/library/openjdk:8

ERROR: failed to solve: DeadlineExceeded: DeadlineExceeded: DeadlineExceeded: openjdk:8: failed to do request: Head “https://registry-1.docker.io/v2/library/openjdk/manifests/8”: dial tcp 202.160.129.6:443: i/o timeout 在构建docker镜像时从docker.io/libr…...

Wed前端--HTML基础

目录 一、开发工具 二、HTML文档结构 2.1头部head 2.1.1title标记 2.1.2元信息meta标记 具体实例 ​编辑 一、开发工具 最基础的开发工具是:HBuilder 二、HTML文档结构 HTML文档由头部head和主体body组成 头部head标记中可以定义标题样式,头部信…...

Latex 自定义运算符加限定条件的实现

“\operatorname{mean}\limits_{n \in N}” 的效果 mean ⁡ n ∈ N \operatorname{mean}\limits_{n \in N} meann∈N​ “\operatorname*{mean}\limits_{n \in N}” 的效果 mean ⁡ n ∈ N \operatorname*{mean}\limits_{n \in N} n∈Nmean​ 参考这篇文章...

大数据实时数仓Hologres(三):存储格式介绍

文章目录 存储格式介绍 一、格式 二、使用建议 三、技术原理 1、列存 2、行存 3、行列共存 四、使用示例 存储格式介绍 一、格式 在Hologres中支持行存、列存和行列共存三种存储格式,不同的存储格式适用于不同的场景。在建表时通过设置orientation属性指…...

关于vue2+uniapp+uview+vuex 私募基金项目小程序总结

1.关于权限不同tabbar处理 uniapp 实现不同用户展示不同的tabbar(底部导航栏)_uniapp tabbar-CSDN博客 但是里面还有两个问题 一个是role应该被本地存储并且初始化 第二个问题是假设我有3个角色 每个角色每个tabbar不一样的,点击tabbar时候会导致错乱 第三个问题…...

多线程(一):线程的基本特点线程安全问题ThreadRunnable

目录 1、线程的引入 2、什么是线程 3、线程的基本特点 4、线程安全问题 5、创建线程 5.1 继承Thread类,重写run 5.1.1 创建Thread类对象 5.1.2 重写run方法 5.1.3 start方法创建线程 5.1.4 抢占式执行 5.2 实现Runnable,重写run【解耦合】★…...

启动hadoop集群出现there is no HDFS_NAMENODE_USER defined.Aborting operation

解决方案 在hadoop-env.sh中添加 export HDFS_DATANODE_USERroot export HDFS_NAMENODE_USERroot export HDFS_SECONDARYNAMENODE_USERroot export YARN_RESOURCEMANAGER_USERroot export YARN_NODEMANAGER_USERroot 再次运行即可。...

Redis实现短信登录解决状态登录刷新的问题

Redis实现短信登录 获取验证码控制层 /*** 发送手机验证码*/PostMapping("/code")public Result sendCode(RequestParam("phone") String phone) {// TODO 发送短信验证码并保存验证码return userService.sendCode(phone);} 获取验证码服务层 Result sendC…...

33. java快速排序

1. 前言 排序算法是数据结构中最基础的算法,快速排序则是面试中最常见的排序算法。无论是校招面试还是社招面试,快速排序算法的出现频率远高于其他算法,而且经常会要求候选人白板手写实现算法。快速排序算法的核心是分治处理,重点是分析时间复杂度。 2. 快速排序算法 面试…...

普通二叉搜索树的模拟实现【C++】

二叉搜素树简单介绍 二叉搜索树又称二叉排序树,是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 注意…...

unity 介绍Visual Scripting Scene Variables

Visual Scripting中的场景变量是指在Unity中使用可视化脚本时,能够在不同场景间传递和存储数据的变量。这些变量可以用来跟踪游戏状态、玩家信息或其他动态数据,允许开发者在不编写代码的情况下创建复杂的游戏逻辑。 场景变量的优势包括: 1…...

linux服务器部署filebeat

# 下载filebeat curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.23-linux-x86_64.tar.gz # 解压 tar xzvf filebeat-7.17.23-linux-x86_64.tar.gz# 所在位置(自定义) /opt/filebeat-7.17.23-linux-x86_64/filebeat.ym…...

个人获取Wiley 、ScienceDirect、SpringerLink三个数据库文献的方法

在同学们的求助文献中经常出现Wiley 、ScienceDirect、SpringerLink这三个数据库文献。本文下面就讲解一下个人如何不用求助他人自己搞定这三个数据库文献下载的方法。 个人下载文献首先要先获取数据库资源,小编平时下载文献是通过科研工具——文献党下载器获取的数…...

Java五子棋

目录 一:案例要求: 二:代码: 三:结果: 一:案例要求: 实现一个控制台下五子棋的程序。用一个二维数组模拟一个15*15路的五子棋棋盘,把每个元素赋值位“┼”可以画出棋…...

【从0开始自动驾驶】用python做一个简单的自动驾驶仿真可视化界面

【从0开始自动驾驶】用python做一个简单的自动驾驶仿真可视化界面 废话几句废话不多说,直接上源码目录结构init.pysimulator.pysimple_simulator_app.pyvehicle_config.json 废话几句 自动驾驶开发离不开仿真软件成品仿真软件种类多https://zhuanlan.zhihu.com/p/3…...

一拖二快充线:单接与双接的多场景应用

在当代社会,随着智能手机等电子设备的普及,充电问题成为了人们关注的焦点。一拖二快充线作为一种创新的充电解决方案,因其便捷性与高效性而受到广泛关注。本文将深入探讨一拖二快充线的定义、原理以及在单接与双接手机场景下的应用&#xff0…...

接口自动化测试概述

目录 1 接口自动化测试简介 1.1 什么是接口 1.2 什么是接口测试 1.3 为什么要做接口测试 1.4 什么是接口测试自动化 1.5 为什么要做接口测试自动化 2 接口自动化测试规范 2.1 文档准备 2.1.1 需求文档 2.1.2 接口文档 2.1.3 UI 交互图 2.1.4 数据表设计文档 2.2 明…...

Fingerprint.js:精准用户识别的浏览器指纹技术

在数字化时代,用户识别成为互联网服务中不可或缺的一环。随着隐私保护意识的增强,传统的用户识别方法如Cookies和本地存储面临着越来越多的挑战。而Fingerprint.js作为一种创新的浏览器指纹技术,以其高效、隐私友好的特性,逐渐在个…...

Gson将对象转换为JSON(学习笔记)

JSON有两种表示结构,对象和数组。对象结构以"{"大括号开始,以"}"大括号结束。中间部分由0或多个以”,"分隔的”key(关键字)/value(值)"对构成,关键字和值之间以":"分隔,语法结…...

什么是IPv6

目前国内的网络正在快速的向IPv6升级中,从网络基础设施如运营商骨干网、城域网,到互联网服务商如各类云服务,以及各类终端设备厂商如手机、电脑、路由器、交换机等。目前运营商提供的IPv6线路主要分为支持前缀授权和不支持前缀授权两种。 说…...

python画图|放大和缩小图像

在较多的画图场景中,需要对图像进行局部放大,掌握相关方法非常有用,因此我们很有必要一起学习 【1】官网教程 首先是进入官网教程,找到学习资料: https://matplotlib.org/stable/gallery/subplots_axes_and_figures…...

Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版

CleanMyMac X 4.15.6 for mac中文版下载是一款功能更加强大的系统优化清理工具,软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。CleanMyMac X 4.15.6 for mac 软件与最新macOS系统更加兼容,流畅地…...

网络运营推广平台/邵阳seo排名

webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便。1、适用系统:Linux2、编译安装:wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gztar…...

公司做网站那个网站好/百度排名服务

前段有时间研究的时候,上不去,现在忙成这样,它又能上了,能上也没时间关注了。转载于:https://www.cnblogs.com/junuh/archive/2009/06/15/1503469.html...

wordpress base64/北京seo课程培训

linux 系统版本信息命令查询大全查看命令1.uname -a # 查看内核/操作系统/CPU信息2.cat /proc/cpuinfo # 查看CPU信息3.hostname # 查看计算机名4.du -sh <目录名> # 查看指定目录的大小5.查看逻辑CPU的个数&#xff1a;cat /proc/cpuinfo | grep "**processor**&qu…...

虎丘网站建设/优化方案怎么写

JPA是什么 Java Persistence API:用于对象持久化的API Java EE 5.0平台标准的ORM规范&#xff0c;使得应用程序以统一的方式访问持久层。 JPA和Hibernate的关系 JPA是Hibernate的一个抽象&#xff08;就像JDBC和JDBC驱动的关系&#xff09;&#xff1a; 1&#xff09;JPA是规范…...

网站上推广游戏怎么做/重庆百度竞价开户

转载&#xff1a;https://blog.csdn.net/xiaodanpeng/article/details/53503076 Python 实现 在Linux下&#xff0c;CPU利用率分为用户态&#xff0c;系统态和空闲态&#xff0c;分别表示CPU处于用户态执行的时间&#xff0c;系统内核执行的时间&#xff0c;和空闲系统进程执行…...

wordpress不显示子分类/优化大师下载安装免费

概述 在爬虫相关的项目中&#xff0c;有时需要爬取各种数据结构的数据&#xff0c;为了更方便的存储&#xff0c;我们通常会使用 MongoDB 进行存储。 本文将使用 Python 连接 MongoDB &#xff0c;对数据进行增删改的操作实践&#xff0c;读者需要先对 Python 或 MongoDB 有一…...