时光魔法 | 如何在业务不停机时建立数据一致的快照
时光魔法 | 如何在业务不停机时建立数据一致的快照 https://mp.weixin.qq.com/s/cSsgqaxJBjWPeLCUT58lTg
时光魔法 | 如何在业务不停机时建立数据一致的快照
曾经有人说,技术就像是魔法。
只要提出需求,技术就会满足他们。
据说,第一个这么讲话的产品经理,
已经被程序员们怼的生活不能自理~
但是,产品经理的这种想法其实也不是没有可能。他们也许会问:可以在不关闭 EC2 实例时,创建一个数据一致的 EBS 快照吗?现在程序员们可以傲骄的回答: Yes, We Can!
今天我们有请 AWS 企业容灾解决方案业务拓展经理王宇老师介绍如何利用 AWS 让业务不停机时建立数据一致的快照。
王宇
AWS 企业容灾解决方案业务拓展经理
目前负责 AWS 中国区的混合云、容灾和 DevOps 产品和解决方案。曾服务于 VMware 等传统私有云厂商,熟悉传统 IT 架构和私有云、混合云、公有云的解决方案融合。
关于 Amazon EC2 Systems Manager(SSM),我们此前已经做过介绍。
传送门
《Amazon EC2 Systems Manager 让你轻松管理 AWS 混合云》
当一个 EC2 实例在启动状态时,其上运行的如数据库等应用必然会有一些数据是保存在内存中,或是 Pending 在数据存储阶段,这些数据都不能被 EBS 的快照检索到,因此这些数据也有可能无法从 EBS 的快照中恢复回来,从而导致应用数据的丢失。
Amazon EBS 作为 EC2 的块级存储卷,可以创建时间点快照,并存放在 S3 存储中。在使用 EBS 的快照功能作为备份解决方案使用时,通常我们都不希望在打快照的过程中关闭 EC2 实例,因此我们需要创建一个数据一致的 EBS 快照,也就是说在打快照时通知正在运行的应用程序,让它们做好准备。
在本文中,我将介绍的内容就是利用 Run Command 和 Maintenance Window 这两个 Amazon EC2 Systems Manager(SSM) 的组件来完成自动创建数据一致的 EBS 快照工作。
使用 Run Command
创建数据一致的 EBS 快照
Run Command 是一个安全的远程管理 EC2 实例的工具,例如远程在一个实例上执行命令或脚本,而不用登录到该实例上。当然,需要该实例事先安装好 SSM Agent。
在本文的例子中,我们需要通过执行脚本命令来通知实例上的应用程序,再执行 EBS 快照的动作,顺序如下:
1
发出命令给应用程序以及文件系统,使其将缓存中的数据固化到存储介质中去,然后暂时停止所有的 I/O 操作。此时,EBS 存储处于数据一致的状态。
2
使用元数据得到运行脚本的 EC2 实例 ID。
3
通过实例ID找到与其关联的所有EBS卷,并给这些卷打上快照。
4
最后,在接到 EC2 API 对最后一个 EBS 快照命令的反馈之后,可以立即释放 I/O 操作控制,而不必等待最后一个 EBS 快照完成。
第一步中的脚本命令根据不同的操作系统和应用程序会有不同,在下面的一个例子中可以看到。
在这个过程中,EC2 实例通过 Run Command API 来接收和执行脚本命令,并返回结果,而通过 EC2 API 来查找相关的EBS卷信息并给 EBS 打快照。因此我只需要在权限控制时创建一个 Role,让这个 Role 具备 AmazonEC2RoleforSSM 这个 policy 以及 ec2:DescribeInstanceAttribute 和 ec2:CreateSnapshot 这两个 action 即可。使用这个 Role 来启动 EC2 实例。
使用 Run Command 进行操作的好处如下:
脚本命令集中化管理,发生任何变化时可以立即应用到所有实例中去。
命令可以安全地远程执行,甚至实例还可以连续不断的接收和执行新的命令。
每个命令的执行情况和结果都能体现在 Run Command 报告中,这些信息也同样存储在 AWS CloudTrail 中便于审计。
Run Command 与 IAM 集成,能够有效控制哪些用户可以访问以及用户的访问级别。
使用 Maintenance Windows
执行日常运维操作
Maintenance Windows 可以定义一个重复的时间窗口,来执行 Run Command 中的命令脚本,从而达到自动执行日常运维操作的目的。那么我们就可以利用 Maintenance Windows 来创建一个非高峰时间的运行时间窗口来给EBS进行数据一致性快照操作。
在实际操作中,一个维护窗口可以与多个目标实例进行关联,可以把目标 EC2 实例用 “ConsistentSnapshot” 标签进行分组,再使用不同的标签值来区分每组实例应该执行什么样的脚本命令。每组目标上执行的命令都可以使用一个 SSM document 来进行描述,内容就包括使用 Run Command 在这组实例中进行数据一致的 EBS 快照操作。