通过阿里云OOS实现定时备份redis实例转储到OSS

功能背景

随着企业业务数据的快速增长,Redis 作为高性能的内存数据存储方案,在多种应用场景下承担着重要的角色。为确保数据安全,定时备份成为了不可或缺的一环。Redis 实例定时备份是关键数据库管理任务的一个重要组成部分,它主要服务于数据的灾难恢复、历史数据在这里插入图片描述
查询、环境克隆等应用场景。

然而,在目前的 Redis 的备份方案中,虽然支持定时备份功能,可以根据用户的业务需求,设置备份周期进行自动备份。但此方式存在以下不足:

  • 数据安全风险:在实例删除后,传统的定时备份无法保留备份数据,导致数据不能永久保存,存在数据丢失的风险。
  • 运维工作繁琐:缺少自动化的备份转储机制,需要手动操作备份过程,包括下载和上传至云存储服务,这一流程不仅耗时,同时也容易出错。
  • 运维成本增加:由于备份流程需要人工介入,过程中容易出错,需要额外的时间和资源投入,从而增加了整体的运维成本。
  • 效率较低:在没有集中管理的备份方案前,为多个实例或跨地域实例执行备份时,效率相对偏低,管理复杂度高。
  • 监控及告警能力不足:缺乏有效的监控和告警机制,使得备份任务的执行状态难以实时掌握,一旦出现失败或异常问题,及时响应和处理的能力受限。

针对上述不足,结合 OOS 的编排能力,OOS 推出了定时备份 Redis 实例并自动转储至 OSS 的功能,为用户提供了一个高效、安全且自动化的备份解决方案。

此方案有以下优势

  1. 数据安全性提高:通过自动上传备份文件至 OSS , 利用 OSS 的数据冗余存储机制, 确保硬件失效时的数据持久性和可用性;此外,及时 Redis 实例删除也能永久保存。
  2. 完全自动化:一旦配置完成,备份文件将自动、定时上传到 OSS,无需人工干预,大大减轻了运维负担,降低了操作错误。
  3. 多实例多地域集中管理:OOS 定时备份 Redis 任务支持一次选择多个实例。此外,OOS 支持跨区域转储 OSS,您可以将多个地域的 Redis 实例统一备份到同一 OSS 存储桶中。
  4. 灵活的备份策略和成本控制:用户可以根据自己的需要设置备份频率,通过 OSS 的生命周期管理策略,自动清理过期的备份文件,从而更有效地控制成本。
  5. 监控和告警:结合 OSS 和云监控,用户可以实时监控备份状态,一旦备份失败或有其他问题,可以及时收到告警,确保数据的安全性。

操作步骤

注意事项:

此功能使用过程中可能会产生部分费用,计费详情参考 Redis 备份费用说明和函数计算计费说明

  1. 登录 OOS 控制台。

  2. 在左侧导航栏找到 “自动化任务-定时运维”,单击创建

  3. 设置定时规则。这里定时类型有 “立即执行、仅在指定时间执行一次、周期性重复执行” 三种方式。其中 “立即执行” 会在创建任务后立即进行重启操作, “仅在指定时间执行一次” 只会在您设定的某个时间点执行一次, “周期性重复执行” 则会按照一定的规则重复执行,如每一小时执行一次。
    在这里插入图片描述

    这里我们选择 “周期性重复执行”,可以通过 “快速选择” 设置重复的频率,熟悉 cron 表达式的同学也可以通过 cron 表达式进行设置。本教程通过 “快速选择” 设置重复的频率,设置每小时执行一次,之后单击确定
    在这里插入图片描述

    设置定时任务的结束时间。
    在这里插入图片描述

  4. 搜索模板 “ACS-Redis-BulkyCreateBackupAndUploadToOSS”,然后进行勾选。在这里插入图片描述

  5. 接下来选择要进行备份的实例,首先选择实例所在地域,然后选择目标实例,点击确定。在这里插入图片描述在这里插入图片描述

  6. 选择要转储的 OSS 存储桶。在这里插入图片描述

  7. 配置执行任务所需的 RAM 角色:在这里插入图片描述

    • 创建 OOS 编排 OpenAPI 角色,可参考《为 OOS 服务设置 RAM 权限》配置 OOS 所需的 RAM 角色并授权,权限策略如下:
      {"Version": "1","Statement": [{"Action": ["kvstore:CreateBackup","kvstore:DescribeBackupTasks","kvstore:DescribeBackups","kvstore:DescribeInstances"],"Resource": "*","Effect": "Allow"},{"Action": ["ros:CreateStack","ros:DeleteStack","ros:GetStack"],"Resource": "*","Effect": "Allow"},{"Action": "oos:StartExecution","Resource": "*","Effect": "Allow"},{"Action": ["fc:CreateFunction","fc:CreateService","fc:DeleteFunction","fc:DeleteService","fc:GetFunction","fc:GetService","fc:InvokeFunction"],"Resource": "*","Effect": "Allow"},{"Condition": {"StringEquals": {"acs:Service": "fc.aliyuncs.com"}},"Action": "ram:PassRole","Resource": "*","Effect": "Allow"}]
      }
      
    • 创建个通过函数计算下载备份文件所需要的角色,可点击角色快捷创建配置 FC 所需的 RAM 角色(AliyunFCDefaultRole)进行快速创建。在这里插入图片描述
  8. 点击 “创建” -> “确定”,定时备份转储到 OSS 的任务就创建完成了。在这里插入图片描述

  9. 查看任务执行结果:
    a. 您可以等到到达您设定的触发时间来查看备份结果。
    b. 点击 “立即触发” 来执行备份转储任务查看结果。在这里插入图片描述

    此时任务会进入运行中,可通过执行日志查看任务执行进度。在这里插入图片描述

  10. 查看转储至 OSS 中的备份文件:
    等待执行状态变成 “已结束”,可以点击执行 ID。在这里插入图片描述

    点击子执行 ID。在这里插入图片描述

    查看输出。在这里插入图片描述

    此时登录此输出的地址就可以查看转存到 OSS 的备份文件了。

    备份文件存储目录格式为:

    Backup_[实例 ID]/[日期(格式为 YYYY-MM-DD)]/[OOS 备份任务 ID]/[备份文件名称].rdb`
    
    • 如果实例为非集群架构,则每次备份将产生 1 个 rdb 文件。
    • 如果实例为集群架构,由于每个分片将会独立备份,因此每次备份将产生与分片数量一致的 rdb 文件(例如 8 分片集群则每次产生 8 个 rdb 文件)。
    • 转储至 OSS 中的备份不再有自动清理时间,可根据需要保留或删除。
      在这里插入图片描述

附录

执行流程图

整体执行流程图:在这里插入图片描述

其中创建redis备份并上传到OSS流程:在这里插入图片描述

模板

上述步骤中使用的模板“ACS-Redis-BulkyCreateBackupAndUploadToOSS”内容如下(模板链接):

FormatVersion: OOS-2019-06-01
Description:en: Create Redis backups in batches and upload them to OSS. Backing up redis and using fc to upload the backup to OSS may incur charges. For billing details, please refer to <a href='https://help .aliyun.com/zh/redis/user-guide/automatic-or-manual-backup#e606eb29c7mew'>Redis Backup Fee Instructions</a> and <a href='https://help.aliyun.com/zh/ fc/product-overview/billing-overview'>Function calculation billing instructions</a>zh-cn: 批量创建Redis备份并上传到OSS。备份redis和使用fc将备份上传到oss都可能会产生费用,计费详情参考<a href='https://help.aliyun.com/zh/redis/user-guide/automatic-or-manual-backup#e606eb29c7mew'>Redis备份费用说明</a>和<a href='https://help.aliyun.com/zh/fc/product-overview/billing-overview'>函数计算计费说明</a>name-en: ACS-Redis-BulkyCreateBackupAndUploadToOSSname-zh-cn: 批量创建Redis备份并上传到OSS
Parameters:regionId:Label:en: RegionIdzh-cn: 地域IDType: StringAssociationProperty: RegionIdDefault: '{{ACS::RegionId}}'targets:Type: JsonLabel:en: TargetInstancezh-cn: 目标实例AssociationProperty: TargetsAssociationPropertyMetadata:ResourceType: ALIYUN::Redis::InstanceRegionId: regionIdOSSRegionId:Label:en: OSSRegionIdzh-cn: OSS Bucket所在地域IDType: StringAssociationProperty: RegionIdOSSBucketName:Label:en: OSSBucketNamezh-cn: OSS Bucket名称Type: StringAssociationProperty: ALIYUN::OSS::Bucket::BucketNameAssociationPropertyMetadata:RegionId: ${OSSRegionId}rateControl:Label:en: RateControlzh-cn: 任务执行的并发比率Type: JsonAssociationProperty: RateControlDefault:Mode: ConcurrencyMaxErrors: 0Concurrency: 10OOSAssumeRole:Label:en: OOSAssumeRolezh-cn: OOS扮演的RAM角色Type: StringDefault: ''
RamRole: '{{ OOSAssumeRole }}'
Tasks:- Name: GetInstanceDescription:en: Get the redis instanceszh-cn: 获取Redis实例Action: ACS::SelectTargetsProperties:ResourceType: ALIYUN::Redis::InstanceRegionId: '{{ regionId }}'Filters:- '{{ targets }}'Outputs:InstanceIds:Type: ListValueSelector: Instances.Instance[].InstanceId- Name: CreateBackupAndUploadToOSSAction: ACS::Redis::CreateBackupAndUploadToOSSDescription:en: Create backup and upload to OSSzh-cn: 创建Redis备份并上传到OSSProperties:regionId: '{{ regionId }}'instanceId: '{{ ACS::TaskLoopItem }}'OSSRegionId: '{{ OSSRegionId }}'OSSBucketName: '{{ OSSBucketName }}'Loop:RateControl: '{{ rateControl }}'Items: '{{ GetInstance.InstanceIds }}'Outputs:OSSObjectURLs:AggregateType: Fn::ListJoinAggregateField: OSSObjectURLOutputs:OSSObjectURL:Type: StringValueSelector: .OSSObjectURL + "{{ACS::ExecutionId}}/"  | split(".t0") | .[0]
Outputs:OSSObjectURLs:Type: ListValue: '{{ CreateBackupAndUploadToOSS.OSSObjectURLs }}'

其中Action: ACS::Redis::CreateBackupAndUploadToOSS内容如下:

FormatVersion: OOS-2019-06-01
Description:en: Create redis backup and upload to OSSzh-cn: 创建Redis备份并上传到OSSname-en: ACS::Redis::CreateBackupAndUploadToOSSname-zh-cn: 创建Redis备份并上传到OSS
Parameters:regionId:Label:en: RegionIdzh-cn: 地域IDType: StringAssociationProperty: RegionIdinstanceId:Label:en: InstanceIdzh-cn: 实例IDType: StringAssociationProperty: ALIYUN::Redis::Instance::InstanceIdAssociationPropertyMetadata:RegionId: ${regionId}OSSRegionId:Label:en: OSSRegionIdzh-cn: OSS bucket所在地域IDType: StringAssociationProperty: RegionIdOSSBucketName:Label:en: OSSBucketNamezh-cn: OSS Bucket 名称Type: StringAssociationProperty: ALIYUN::OSS::Bucket::BucketNameAssociationPropertyMetadata:RegionId: ${OSSRegionId}Default: ''
Tasks:- Name: CreateBackupAction: ACS::ExecuteApiDescription:en: Create backupzh-cn: 创建Redis备份Properties:Service: r-kvstoreAPI: CreateBackupParameters:RegionId: '{{ regionId }}'InstanceId: '{{ instanceId }}'Outputs:BackupJobID:Type: StringValueSelector: .BackupJobID- Name: WaitForBackupCreatedAction: ACS::WaitForDescription:en: Wait for backup createdzh-cn: 等待备份创建完成Retries: 30DelayType: ExponentialDelay: 2BackOff: 2Properties:Service: r-kvstoreAPI: DescribeBackupTasksParameters:RegionId: '{{ regionId }}'InstanceId: '{{ instanceId }}'BackupJobId: '{{ CreateBackup.BackupJobID }}'DesiredValues:- FinishedNotDesiredValues: []StopRetryValues: []PropertySelector: .BackupJobs[].BackupProgressStatus- Name: GetBackupDownloadUrlAction: ACS::ExecuteApiDescription:en: Get backup download urlzh-cn: 获取备份下载地址Properties:Service: r-kvstoreAPI: DescribeBackupsParameters:RegionId: '{{ regionId }}'InstanceId: '{{ instanceId }}'BackupJobId: '{{ CreateBackup.BackupJobID }}'StartTime:Fn::FormatUTCTime:- Fn::AddHour:- '{{ ACS::CurrentUTCTime }}'- -1- '%Y-%m-%dT%H:%MZ'EndTime:Fn::FormatUTCTime:- '{{ ACS::CurrentUTCTime }}'- '%Y-%m-%dT%H:%MZ'Outputs:BackupDownloadURL:Type: ListValueSelector: .Backups.Backup[].BackupDownloadURL- Name: UploadBackupToOSSAction: ACS::FC::ExecuteScriptDescription:en: Upload backup to OSSzh-cn: 上传备份到OSSProperties:runtime: python3.10handler: index.handlerrole: acs:ram::{{ACS::AccountId}}:role/AliyunFcDefaultRolescript: |-import oss2import requestsdef handler(event, context):auth = oss2.StsAuth(context.credentials.access_key_id, context.credentials.access_key_secret, context.credentials.security_token)endpoint = 'https://oss-{{OSSRegionId}}.aliyuncs.com'bucket = oss2.Bucket(auth, endpoint, '{{OSSBucketName}}')unique_identifier = '{{ACS::TaskLoopItem}}'.split('?')[0].split('/')[-1]execution_id = '{{ACS::ExecutionId}}'.split('.')[0]input = requests.get('{{ACS::TaskLoopItem}}')bucket.put_object(f'Backup_{{InstanceId}}/{{ACS::CurrentDate}}/{execution_id}/{unique_identifier}', input)Loop:Items: '{{ GetBackupDownloadUrl.BackupDownloadURL }}'RateControl:Mode: ConcurrencyMaxErrors: 0Concurrency: 20
Outputs:OSSObjectURL:Type: StringValue: https://oss.console.aliyun.com/bucket/oss-{{OSSRegionId}}/{{OSSBucketName}}/object?path=Backup_{{InstanceId}}/{{ACS::CurrentDate}}/

👍 点赞 - 您的支持是我持续创作的最大动力!
⭐️ 收藏 - 您的关注是我前进的明灯!
✏️ 评论 - 您的反馈是我成长的宝贵资源!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/315360.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由于找不到msvcr120.dll,无法继续执行代码

在日常编程中&#xff0c;缺少关键的msvcr120.dll文件可能会导致代码无法执行&#xff0c;给我们带来不便。针对缺少msvcr120.dll文件的情况&#xff0c;我们可以采取一些有效的解决方法来解决这一问题。通过下载安装或使用Visual C Redistributable工具安装该msvcr120.dll文件…

数据污染对大型语言模型的潜在影响

大型语言模型&#xff08;LLMs&#xff09;中存在的数据污染是一个重要问题&#xff0c;可能会影响它们在各种任务中的表现。这指的是LLMs的训练数据中包含了来自下游任务的测试数据。解决数据污染问题至关重要&#xff0c;因为它可能导致结果偏倚&#xff0c;并影响LLMs在其他…

STL_List与萃取

List 参考文章: https://blog.csdn.net/weixin_45389639/article/details/121618243 List源码 List中节点的定义&#xff1a; list是双向列表&#xff0c;所以其中节点需要包含指向前一节点和后一节点的指针&#xff0c; data是节点中存储的数据类型 template <class _Tp&g…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#x…

动态获取数据并按顺序组合

当有多个select&#xff0c;且选中后会按顺序组合&#xff1a; 第一列选中&#xff1a; “壹”,“贰” 第二列选中&#xff1a; “a”,“b” 那么组合后的数据为&#xff1a;“壹&#xff0c;a”&#xff0c;“壹&#xff0c;b”&#xff0c;“贰&#xff0c;a”&#xff0c;“…

Docker 的数据管理 端口映射 容器互联 镜像的创建

目录 概念 概念 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。总结&#xff1a;因为容器数据是临时保存的为了安全&#xff0c;就要让数据保持持久化。 1&#…

AI绘画的算法原理:从生成模型到Diffusion

近年来&#xff0c;AI绘画技术引起了广泛关注&#xff0c;让我们深入探讨其背后的技术原理和发展历程。本文将以通俗易懂的方式&#xff0c;介绍AI绘画的核心算法&#xff0c;从生成模型到Diffusion。 1. 计算机如何生成图画&#xff1f; AI绘画的核心在于生成模型&#xff08…

Redis入门到通关之数据结构解析-IntSet

文章目录 概述IntSet升级简易源码总结 欢迎来到 请回答1024 的博客 &#x1f34e;&#x1f34e;&#x1f34e;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 …

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day22

Day 22 Transformer seqence to seqence 有什么用呢&#xff1f; Encoder how Block work 仔细讲讲Residual 的过程&#xff1f; 重构 Decoder - AutoRegressive Mask 由于是文字接龙&#xff0c;所以无法考虑右边的 info 另一种decoder Encoder to Decoder – Cross Attend…

jsp servlet 学生信息管理系统

一、角色划分 1、超级管理员 2、学生 二、模块展示 1、登录 2、列表页面【超级管理员展示所有用户信息、学生只展示当前登录用户信息】 3、新增 4、编辑 三、数据库【mysql】 四、运行演示 jsp servlet 学生信息管理系统

Spark高可用模式和Spark分布式Yarn环境安装

Spark分布式HA环境安装 图-12 高可用模式原理 因为在目前情况下&#xff0c;集群中只有一个Master&#xff0c;如果master挂掉&#xff0c;便无法对外提供新的服务&#xff0c;显然有单点故障问题&#xff0c;解决方法就是master的ha。 有两种方式解决单点故障&#xff0c;一…

网络通信安全

一、网络通信安全基础 TCP/IP协议简介 TCP/IP体系结构、以太网、Internet地址、端口 TCP/IP协议简介如下&#xff1a;&#xff08;from文心一言&#xff09; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff0…

Java使用IText根据pdf模板创建pdf文件

1.导包 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-as…

算法学习笔记Day9——动态规划基础篇

一、介绍 本文解决几个问题&#xff1a;动态规划是什么&#xff1f;解决动态规划问题有什么技巧&#xff1f;如何学习动态规划&#xff1f; 1. 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法&#xff0c;只不过在计算机问题上应用比较多&#xff…

kotlin 编写一个简单的天气预报app (七)使用material design

一、优化思路 对之前的天气预报的app进行了优化&#xff0c;原先的天气预报程序逻辑是这样的。 使用text和button组合了一个输入城市&#xff0c;并请求openweathermap对应数据&#xff0c;并显示的功能。 但是搜索城市的时候&#xff0c;可能会有错误&#xff0c;比如大小写…

超市火灾烟雾蔓延及人员疏散的matlab模拟仿真,带GUI界面

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 出口在人员的视野范围内时&#xff0c;该元胞选择朝向引导点的方向运动。出口不在人员的视野范围内时&#xff0c;作随机运动&#xff0c;8个方向的运动概率相等。…

深度学习| 注意力机制

注意力机制 为什么需要注意力机制Seq2Seq问题Transfomer Attention注意力机制分类软硬注意力注意力域 为什么需要注意力机制 这个可以从NLP的Seq2Seq问题来慢慢理解。 Seq2Seq问题 Seq2Seq&#xff08;Sequence to Sequence&#xff09;&#xff1a;早期很多模型中&#xff…

清除git缓存后,每次pull或者push都需要输入用户名密码

git bash进入你的项目目录&#xff0c;输入&#xff1a;git config --global credential.helper store 然后在文件下pull一下&#xff0c;输入一次用户名密码后&#xff0c;再次pull或者push就不需要输入了。 亲测有用哦

挑战一周完成Vue3项目Day2:路由配置+登录模块+layout组件+路由鉴权

一、路由配置 经过分析&#xff0c;项目一共需要4个一级路由&#xff1a;登录&#xff08;login&#xff09;、主页&#xff08;home&#xff09;、404、任意路由&#xff08;重定向到404&#xff09;。 1、安装路由插件 pnpm install vue-router 2、创建路由组件 在src目…

区块链安全应用-------压力测试

基于已有的链进行测试&#xff08;build_chain默认建的链 四个节 点&#xff09;&#xff1a; 第一步&#xff1a;搭链 1. 安装依赖 在ubuntu操作系统中&#xff0c;操作步骤如下&#xff1a; sudo apt install -y openssl curl 2. 创建操作目录, 下载安装脚本 ## 创建操作…