为什么弹性架构是重要的
谈到IT系统架构,我们经常会用建筑架构来做类比,事实上,Architecture这个词也正是来自于传统的建筑行业。系统架构图就像建筑设计图一样,用来指导软件构建。同时,两者之间也存在一个巨大的不同,建筑物追求的是屹立千百年不变,而IT系统追求的是灵活性,以便随时应对真实世界的业务变化。从这个角度来看,IT系统更像一个有机的生命体,需要不停的改变自己去适应外界变化,才能让自身更有生命力。系统压力是一个重要的变化维度,是否能够随着系统压力的增减而动态的调整系统的某一部分体现了架构是否具有足够的弹性。
水平扩展能力,是互联网架构重要的弹性表现。当系统面对增加的用户和访问量时,是否能够快速进行水平扩展,往往决定了互联网应用的生死。另一方面,当访问量回落后,是否能够释放掉资源以节约成本会变成核心竞争力之一。根据扩展的粒度不同,这种扩展可能是机器或组件粒度的,比如增加或减少云服务器的数量,也可能是整体架构粒度的,比如在线游戏开新服,就需要复制整个系统。
实现弹性架构有很多方法,重要的问题是,如何更优雅的让系统具备弹性?让IT系统应对变化时能够快速、可靠和自动化?
实现弹性架构的基本原则
数据化运维
让系统具备弹性的目的是为了应对业务变化,而感知变化是首要的事情。这就需要系统能够具备数据化的运维能力,从收集系统运行数据,到最终根据数据做出是否需要触发弹性变化的判断。
按需获取资源
系统的弹性变化最终会落到对资源的调整上,可能是流量增加时增加云服务器,流量减少时减少云服务器。这就需要系统能够随时根据需要获取和释放计算资源。
可复制和可维护
系统的弹性变化是随时都有可能发生的,所以弹出来的部分一定是被内置到系统内部的,是可以无限次被执行的。同时,又能够很好的被开发人员维护,以代码的形式成为系统的一部分,可以被修改、测试、追踪版本等。
自动化
自动化是减少系统错误的重要手段,所以以上原则都需要能够自动化执行。
在阿里云上实现弹性架构的实践
基于阿里云提供的运维管理服务,我们可以很容易的实现弹性架构。其中最重要的两个服务是云监控和资源编排。
云监控(CloudMonitor)可用于收集阿里云资源的监控指标,探测服务可用性,并针对指标设置报警。通过OpenAPI,可以实时获取系统的运行状况,用来作为弹性变化的触发依据。
资源编排服务(ROS),提供了通过模板管理云资源的能力,用户可以在JSON格式的模板文件中,描述系统的资源和配置,ROS会根据用户的模板,创建和释放资源,并对资源、软件做指定的配置。模板是一种描述性的文本文件,可以像代码一样被编辑、测试和版本控制。通过模板,我们可以把弹性变化的部分进行完整的定义,并且可以被无限次的重复执行。同时,ROS是一种无需人工值守的完全自动化服务。通过ROS提供的OpenAPI和CLI工具,结合云监控的数据,可以把弹性变化整合成自动的机制,让系统拥有完全的弹性能力。
下面用一个例子来介绍如何基于阿里云提供的服务来构建弹性架构。架构如下图:
这是一个非常典型的基于阿里云的Web系统。系统通过ECS提供Web服务,通过RDS来做数据持久化存储,通过SLB来做访问负载均衡。我们要解决的问题是,如何才能让系统具有弹性,以应对可能出现的访问量暴增。一个直观可行的思路就是,直接增加ECS服务器的数量。但是这涉及到一些复杂而琐碎的事情。比如创建ECS实例、初始化系统、安装软件、把ECS实例挂在到SLB,当流量回落以后把增加的ECS从SLB摘除并释放实例。
我们的目标是更优雅的实现弹性架构,也就是要让架构符合之前所说的原则。通过云监控和资源编排,可以很容易做到这一点。云监控可以在控制台直观的配置。我们重点来看看资源编排(ROS)的角色。ROS通过模板创建一批资源,这些资源被成为资源栈(Stack)。所以,当通过ROS来为系统弹出资源以后,系统会变成下图所示:
依据监控数据,我们通过ROS创建了一个资源栈,其中包含3台按量付费的ECS实例,根据我们在模板中的定义,ROS会在这些实力中安装我们的业务软件,这些软件会访问系统已存在的RDS存取数据。当ECS实例启动后,ROS把这些机器加入到SLB,新的访问就会被分发到这些新增加的ECS上。
当访问量回落后,我们通过ROS销毁这个资源栈,ROS会首先把ECS从SLB中摘除,这样新的访问就回到了最开始的ECS上,ROS接着把ECS删除。整个过程不会对用户访问产生影响,系统又回到了最开始的状态。
上面所有的事情都是自动进行的,我们把弹出的内容用ROS的模板进行了定义,其中描述了所有关于ECS创建、软件安装、SLB挂载的细节。因为模板是可以被像代码一样管理的,所以我们弹出的内容是经过了严格测试的,并且能够跟踪回溯版本。
ROS的模板是申明式的JSON文件,所以我们只需要在里面描述清楚我们希望系统达到的状态,而不需要关注如何实现。这个模板文件里的主要部分(需要根据实际情况修改):
{
"ROSTemplateFormatVersion": "2015-09-01",
"Resources": {
"newEcsInstances": {
"Type": "ALIYUN::ECS::InstanceGroup",
"ImageId": "m-25xovkjg5",
"InstanceType": "ecs.s2.large",
"MinAmount": 1,
"MaxAmount": 3,
"SecurityGroup": "sg-25f9isr5m",
"VpcId": "vpc-bp168go6c51f16786k9dl",
"VSwitch": "vsw-bp1r47wdty5ecx4e82j9qaa"
},
"backendServerAttachment": {
"Type": "ALIYUN::SLB::BackendServerAttachment",
"Properties": {
"LoadBalancerId": "15187200816-cn-beijing-btc-a01",
"BackendServerList": {
"Fn::GetAtt": [
"newEcsInstances",
"InstanceIds"
]
}
}
}
}
}
上面的例子稍显简单,其实,阿里云的资源编排服务基本实现了对所有阿里云服务的支持,更有像实例克隆、资源栈更新这样的高级特性,我们可以在一个模板中描述包含大量资源的复杂架构。
总结
我们在上面介绍了弹性架构的重要性和基本原则,并结合阿里云的云监控和资源编排服务,介绍了如何在阿里云上实现弹性架构。随着我们的系统与云计算结合的越来越密切,弹性架构已经成为使用云计算的标准能力,同时也是系统的核心竞争力之一。构建更加优雅的弹性架构,不仅需要我们具备理论,也要能够熟练的整合云计算资源和服务。