以更优雅的方式实现弹性架构

为什么弹性架构是重要的

        谈到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"
                    ]
                }
            }
        }
    }
}

        上面的例子稍显简单,其实,阿里云的资源编排服务基本实现了对所有阿里云服务的支持,更有像实例克隆、资源栈更新这样的高级特性,我们可以在一个模板中描述包含大量资源的复杂架构。

总结

        我们在上面介绍了弹性架构的重要性和基本原则,并结合阿里云的云监控和资源编排服务,介绍了如何在阿里云上实现弹性架构。随着我们的系统与云计算结合的越来越密切,弹性架构已经成为使用云计算的标准能力,同时也是系统的核心竞争力之一。构建更加优雅的弹性架构,不仅需要我们具备理论,也要能够熟练的整合云计算资源和服务。

时间: 2024-11-26 04:32:33

以更优雅的方式实现弹性架构的相关文章

一个更好的可视化微服务架构的方式

本文讲的是一个更好的可视化微服务架构的方式[编者的话]如何快速地可视化一个微服务架构,本文作者有一个很酷的办法,赶紧来看看吧! [3 天烧脑式容器存储网络训练营 | 深圳站]本次培训以容器存储和网络为主题,包括:Docker Plugin.Docker storage driver.Docker Volume Pulgin.Kubernetes Storage机制.容器网络实现原理和模型.Docker网络实现.网络插件.Calico.Contiv Netplugin.开源企业级镜像仓库Harbo

更优雅的jQuery拼接下拉框方式

在Stack Overflow浏览到一个问题:如何用jQuery更好的拼接下拉框代码?这个小需求在实践中也写过很多次,但是网友提供了一个更优雅的jQuery拼接下拉框方式. 代码如下: var options = $("#options"); $.each(result, function() {     options.append($("<option />").val(this.ImageFolderID).text(this.Name)); })

【双11背后的技术】17.5W秒级交易峰值下的混合云弹性架构之路

选自<不一样的技术创新--阿里巴巴2016双11背后的技术>,全书目录:https://yq.aliyun.com/articles/68637 前言 每年的双11都是一个全球狂欢的节日,随着每年交易逐年创造奇迹的背后,按照传统的方式,我们的成本也在逐年上升.双11当天的秒级交易峰值平时的近10多倍,我们要用3-4倍的机器去支撑.但大促过后这批机器的资源利用率不高,到次年的双11会形成较长时间的低效运行.试想一下,电商交易有大促峰值,而阿里云有售卖Buffer,如果能充分发挥云计算的弹性能力,

17.5W秒级交易峰值下的混合云弹性架构之路

前言 每年的双11都是一个全球狂欢的节日,随着每年交易逐年创造奇迹的背后,按照传统的方式,我们的成本也在逐年上升.双11当天的秒级交易峰值平时的近10多倍,我们要用3-4倍的机器去支撑.但大促过后这批机器的资源利用率不高,到次年的双11会形成较长时间的低效运行.试想一下,电商交易有大促峰值,而阿里云有售卖Buffer,如果能充分发挥云计算的弹性能力,让资源可以两边快速腾挪,就可以解决资源浪费的问题了.把我们的交易单元可以部署在云上面,那么大促的时候我们只需要按照压测模型去云上构建一个符合能力的新

更优雅的微信第三方设计

  在拿到项目时,首先需要冷静下来.而不是急着去动手,大部分同学肯定都理解了解其缘由.这边要说的更多是前期先看看相似对手的情况.因为视觉设计相对于产品功能,是最容易拉开差异感的部分.或许一套不同的视觉策略就能让产品迅速脱离大部分同类作品走出来. 大部分的普遍 大部分的微信第三方,和似乎都不太注重展示部分.即视觉部分,隐隐有些暴发户的感觉.而且现在做这块的公司似乎已经有当年做团购的景象.多,十分多,最后迷失在一片片营销的海洋里. 做为设计师,先跳出来观察下.其实我们会惊讶的发现,这些站的普遍性都是

多个细节帮助你更优雅地书写页面

  我们常以"整齐","易读","亲切","易于维护","复用性强"等来形容一些优秀的开发者所写的代码.现在,对代码的好评还有一个更为时尚的词"优雅",是不是听起来觉得很亲切呢? 页面是互联网产品的表现层面,不仅讲求外观,而且会应对更新迅速的互联网产品需求.要成为一名优秀的开发者,经验积累是必不可少的,而一部分经验归纳起来正是在工作过程中的细节.下文介绍的即是在页面开发流程中的多方面的细

对比.net使用Java的匿名类对工厂方法模式提供更优雅的实现

工厂模式的意图: 定义一个用户创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 结构图: 场景: 这里制造两个手机product:Nokia.Motorola,为了制造这两个Product需要使用两个Creator(Factory)来制造它们.这两个Creator都有各自的Concreator(类似生产线).这两个手机都实现必须实现两个最基本的功能:call(打电话).photo(拍照). product: /// <summary> ///

锦上添花——多个细节帮助你更优雅地书写页面

中介交易 SEO诊断 淘宝客 云主机 技术大厅 我们常以"整齐","易读","亲切","易于维护","复用性强"等来形容一些优秀的开发者所写的代码.现在,对代码的好评还有一个更为时尚的词"优雅",是不是听起来觉得很亲切呢? 页面是互联网产品的表现层面,不仅讲求外观,而且会应对更新迅速的互联网产品需求.要成为一名优秀的开发者,经验积累是必不可少的,而一部分经验归纳起来正是在工作过程中的细节

网站分析:多个细节帮助你更优雅地书写页面

中介交易 SEO诊断 淘宝客 云主机 技术大厅 [编者按]本文作者@EdwardUp 我们常以"整齐","易读","亲切","易于维护","复用性强"等来形容一些优秀的开发者所写的代码.现在,对代码的好评还有一个更为时尚的词"优雅",是不是听起来觉得很亲切呢? 页面是互联网产品的表现层面,不仅讲求外观,而且会应对更新迅速的互联网产品需求.要成为一名优秀的开发者,经验积累是必不可少的,而一