写点什么

利用 AWS Step Function 自动扩展 Redshift 集群

  • 2019-10-25
  • 本文字数:2944 字

    阅读完需:约 10 分钟

利用 AWS Step Function 自动扩展 Redshift 集群

谈到公有云如何帮助我们降低总体拥有成本,人们首先想到的会是:



    以上两点都非常正确,然而,托管化的服务充其量只能简化某个单独服务的运维工作,而在实际的运维场景中,我们时常会遇到更复杂的运维工作流,这些工作流通常会涉及到对多个系统组件的操作,并且需要有严格的先后流程控制、故障回滚及错误告警等功能。如果以人工的操作来执行这类工作流,操作步骤繁复不说,更有可能由于某个环节的人工操作失误,导致系统出现意外的故障。


    为此,AWS 云上提供了相关的工作流调度服务 Step Function,帮助我们把这类工作自动化,降低运维负担及人为引入的故障率。当然,Step Function 并不仅仅局限于运维工作的自动化,事实上,AWS Step Functions 让您能够使用可视工作流轻松协调分布式应用程序和微服务的组件。通过使用每个都能执行离散函数的单独组件构建应用程序,让您能够快速扩展和更改应用程序。


    本文以一个实际客户的应用场景出发,来介绍如何使用 Step Function 服务,自动化执行一个拥有多个步骤的工作流。

    场景介绍

    用户使用 DMS 服务将 Aurora 中的数据持续导入到 Redshift 中做后续的分析,随着数据量的增加,需要调整 Redshift 集群的大小来扩展存储的容量,由于 Redshift 集群在调整大小的过程中处于只读的模式,此时 DMS 服务对 Redshift 的增量写入会失败,比较好的做法是先停止 DMS 任务,等到 Redshift 集群调整完毕后再启动,除了通过人力定期观察 Redshift 磁盘的使用量,并在合适的时候调整 Redshift 集群的方式之外,有没有一种无人值守的方式来帮助我们实现自动化的运维工作呢?


    下面我们就介绍一种通过 AWS 服务实现上述需求的解决方案,整个方案除了可以保证完全自动化之外,还拥有如下好处:



      • CloudWatch 每个月前 10 个 Alarm 免费。

      • SNS 每个月前 100 万次调用免费。

      • Lambda 每个月前 100 万次调用免费。

      • Step Function 每个月前 4000 次状态流程转换免费。


      我们可以看到,通过更多地使用 AWS 提供的 Serverless 服务,不仅提高了整个系统的自动化程度,降低运维成本,并且在调用不频繁的场景中,能够实现整个方案零成本。


      下面我们来看一下整个解决方案的架构设计:



      下面是整个方案的工作流程:




        我们来看一下这个 Step Function 的状态机,整个流程十分直观,当状态机启动后,首先会停止正在进行增量备份的 DMS 任务,之后对 DMS 任务的目标 Redshift 集群做一个 Snapshot 快照,然后调整 Redshift 集群的大小,最后重新启动 DMS 任务。


        相关代码下载:


        https://github.com/iwasnobody/RedshiftResize


        下面介绍详细的配置过程。

        第一步 准备工作:

        1.获取 DMS 服务中,作为同步任务目标的 Redshift 的 Endpoints ARN。



        2.创建 Role 供 Step Function 及相关的 Lambda 使用。


        首先创建 LambdaAccessStepFuncRole,使得相关 Lambda 能够触发 Step Function 执行任务。






        通过相同的方式创建 ResizeRedshift_DMSRole,使得相关 Lambda 能够启停 DMS 任务,调整 Redshift 集群大小。



        其中,DMSFullAccess 不是系统内置的 Policy,需要自己创建,下面是该 Policy 的具体设置,即:允许对 DMS 的所有相关操作。



        通过相同的方式创建 ResizeRedshift_StepFuncRole,使得 Step Function 能够在执行的某个阶段调用 Lambda 执行相关任务。



        第二步 创建 Step Function 中需要调用的 Lambda 函数 ResizeRedshift_StopDMS。


        选择之前创建好的 ResizeRedshift_DMSRole。



        从 GitHub 上获取 ResizeRedshift_StopDMS.py 代码。



        设置 Lambda 执行的环境变量,其中:


        redshift_arn 是准备工作中获取的 DMS 任务目标 Redshift 的 Endpoints ARN。


        redshift_name 是 DMS 任务的目标 Redshift 集群名称。


        第三步 创建 Step Function 状态机。


        选择之前创建好的 ResizeRedshift_StepFuncRole。



        从 GitHub 上获取 StepFunction 代码,注意需要将代码中的 Lambda Arn 改写成上面创建好的 ResizeRedshift_StopDMS Lambda 函数的 Arn。



        创建触发 Step Function 状态机的 Lambda 函数 TriggerStepFunc,选择之前创建的 LambdaAccessStepFuncRole。



        从 GitHub 上获取 TriggerStepFunc 代码。



        设置 Lambda 执行的环境变量,其中:


        StepFuncArn 为 Step Function ResizeRedshift 的 Arn。


        第四步 创建 SNS Topic,用于触发刚刚创建的 TriggerStepFunc Lambda 函数。




        第五步 在 CloudWatch 中创建 Redshift 存储容量的告警。


        选择相关 Redshift 集群的 PercentageDiskSpaceUsed。



        这里配置当已使用存储大于 80%时,触发告警。



        设置告警触发的时候,向已经创建的 SNS 发送消息。


        第六步 测试整个流程:

        1.进入 SNS,选择手工向 SNS 发送消息,具体的消息内容不重要。




        1. 在 Step Function 界面能够看到触发了新的状态机执行。




        1. 通过 DMS 界面,我们可以看到 DMS 任务已经被停止,在 Redshift 界面,我们可以查看集群扩展的状态。




        1. 等到状态机执行成功后,可以看到 DMS 任务被重新启动,并且 Redshift 集群的规模扩展了 1 倍。





        注意事项:


        1. 由于 Redshift 在调整集群的过程中处于 read only 模式,无法写入新的数据,此时 DMS 无法将 Aurora 的增量更新同步到 Redshfit 中,所以需要停止 DMS 任务,等到 Redshift 集群调整完成后再重新启动 DMS 任务。

        2. DMS 任务停止期间,Aurora 的增量更新保存在 binlog 中,需要确保 binlog 在 Aurora 中的保存时间大于 DMS 任务停止的时间,下图展示了如何将 binlog 的保存时间设为 24h。



        3.具体 binlog 的保存时间设为多长取决于 Redshift 当前的集群规模和数据量,建议如果当前集群规模及数据量较大的情况下,通过 Snapshot 镜像创建测试集群,手工调整测试集群的规模实际测试大致需要的时间。



        4. 如果希望能够在特定的维护时间窗口调整 Redshift 集群的规模,可以通过 SNS 发送邮件的方式通知运维人员,然后在特定时间手工触发 Step Function 来实现。


        作者介绍:


        余骏


        亚马逊 AWS 解决方案架构师,负责基于 AWS 的云计算方案架构的咨询和设计,同时致力于 AWS 云服务在国内的应用和推广。对应用容器化,微服务框架和应用等有浓厚的兴趣。在加入 AWS 之前,在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。


        本文转载自 AWS 技术博客。


        原文链接:


        https://amazonaws-china.com/cn/blogs/china/aws-step-function-widen-auto-redshift/


        2019-10-25 08:001477

        评论

        发布
        暂无评论
        发现更多内容

        偷瞄大佬书签栏,16个C++必备学习网站,建议收藏

        奔着腾讯去

        c++

        自动驾驶混战,剑气二宗谁能笑傲江湖?

        脑极体

        内网域渗透分析(实战总结)

        网络安全学海

        网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

        看完阿里大牛的数据结构学习笔记,我直接手撕了500道Leetcode题

        Java 程序员 架构 面试 算法

        都2021年了,还在算法上折跟头?这本《字节跳动面试必问算法秘籍》送给你!

        Java 架构 面试 程序人生 编程语言

        Hold the Door!区块链底层平台流控分析

        趣链科技

        区块链 流量控制 底层平台

        认识流媒体协议,从 RTSP 协议解析开始!

        声网

        协议 RTSP

        手把手带你玩转 JS | 引航计划|大前端

        三掌柜

        大前端 引航计划 引航 技术专题合集

        Serverless 工程实践 | Serverless 应用优化与调试秘诀

        阿里巴巴云原生

        阿里云 Serverless 云原生

        如何区分封闭图形的内部和外部

        Changing Lin

        10月月更

        接棒运动赛事!工厂里也有热血竞技?

        白洞计划

        手把手教你使用Studio Lite + Digtal car!助力智能汽车场景、轻应用开发更轻松!

        SOA开发者

        软件架构思考

        轻口味

        android 架构设计原则 10月月更

        记不住源码?掌握这套方法,Alibaba必有你一席之地!

        Java 架构 面试 程序人生 编程语言

        新一代容器平台ACK Anywhere,来了

        阿里巴巴中间件

        阿里云 云原生 中间件 ACK ACK Anywhere

        必须得会的汽车ECU研发基础—底层软件介绍4

        SOA开发者

        运用贝塞尔曲线绘制笔锋效果

        ZEGO即构

        音视频 笔锋实践 贝塞尔曲线

        用时三个月,阿里P8大佬总结出来的最深《Java性能优化全攻略》限时分享!

        Java 架构 面试 程序人生 编程语言

        机器人自主学习新进展,百度飞桨发布四足机器人控制强化学习新算法

        百度大脑

        人工智能 飞桨

        还在郁郁寡欢?啃完666页Java面试高频宝典,十月保你定级腾讯T3-2

        Java 架构 面试 程序人生 编程语言

        自我提升:高效能人士的 7 个习惯学习笔记(二)

        程序员架构进阶

        效率 自我管理 自我提升 10月月更

        中国移动5G消息开发者社区 | 主题沙龙直播预约:5G消息在文旅场景的应用探讨

        5G消息

        5G 5G消息 中国移动5G rcs

        分享一套golang实现的 IM 系统,一键部署服务端,客户端SDK全平台支持,可以替代IM云服务

        OpenIM

        流计算 Oceanus 限量1元秒杀,立省2000元

        腾讯云大数据

        数字化加速时刻,天津港解锁了“天工开物”新篇

        脑极体

        携程 x StarRocks:高效支持高并发查询,大幅降低人力和硬件成本

        StarRocks

        大数据 数据分析 高并发 StarRocks

        Python代码阅读(第34篇):列表元素出现频率字典

        Felix

        Python 编程 Code Programing 阅读代码

        引航计划|大前端|优质合集手把手带你玩转移动开发

        三掌柜

        大前端 引航计划 引航

        代码检查规则:Java语言案例详解

        百度开发者中心

        Java 最佳实践 案例分享 代码检查规则

        阿里P8最全总结PDF:Tomcat+虚拟机+Spring全家桶+MyBatis源码等

        Java 架构 面试 程序人生 编程语言

        看山聊 Java:检查日期字符串是否合法

        看山

        Java 10月月更

        利用 AWS Step Function 自动扩展 Redshift 集群_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章