基于阿里云构建自己的弹性应用

短短几年,软件、企业信息系统、互联网等行业因为云计算的出现和普及发生了很多的改变。在今天,如果我们计划创建一家新的互联网初创公司的时候,我们不再需要把时间浪费在服务器采购、IDC选择、网络南北互通和服务器硬件故障这些基础设施上面。因为像ECS这类服务的出现,我们需要的服务器资源已经变得唾手可得。同时,RDS、Redis、OSS等服务的出现,我们甚至不需要自己去安装和维护数据库、缓存等软件了。云计算使互联网初创公司能够更关注自己核心业务的快速奔跑。

同时,云计算本身也在快速发展。创业公司对云计算的理解和应用能力,也成为了创业公司最终成败的一个重要因素之一,因为这不仅影响到成本,同时也影响到产品的性能、规模、服务能力、用户体验和迭代速度。成本和迭代速度对于初创公司的重要性不言而喻。

阿里云在2015年底推出了一款新的服务,其目标皆在于帮助云计算用户进一步减少在基础设施维护上的成本,提供更加敏捷的云计算资源维护能力。这款服务就是阿里云资源编排服务

在资源编排服务出现之前,虽然我们已经不需要搬运沉重的服务器到机房去,大部分时候我们只要在阿里云的网站上点点鼠标就能够得到我们想要的服务器资源,但是当管理的资源多起来以后,通过Web界面来维护大量的云产品的创建、配置仍然是颇有挑战的工作,特别是当出于安全需要而引入复杂的网络拓扑结构时,很多管理员不得不借助外部文档来记录资源间的依赖关系、系统整体架构和很多的配置细节。使用阿里云资源编排服务(Resource Orchestration Service),用户仅需要编写一个文本文件,就能很好的解决这些问题。借助这个文件和编排服务提供的能力,我们不仅能够定义我们的资源需求、配置细节和资源间的依赖关系,甚至我们可以在同一个文件中描述整个网络拓扑结构和系统架构。这个文件神奇的定义了整个系统,并且重要的是只有一个文件,而且整个系统可以任意复制、修改。

资源编排的核心概念:

  • 模板:模板是一个JSON格式的文本文件,遵照阿里云资源模板的格式定义。其中定义了用户系统的所有资源细节和整体架构。阿里云资源编排模板定义
  • 资源编排服务:资源编排服务是阿里云提供的开放云产品,提供RESTful风格的API、SDK和Web界面供用户使用。接受用户提交的资源模板,完成用户系统的生命周期维护。
  • 资源栈: 资源栈是一个逻辑上的概念,用户定义的资源模板文件,由资源编排服务执行后得到的资源全体即是资源栈。一个资源栈代表了一个用户的运行时系统。

基于阿里云构建自己的弹性应用

下面用一个网页游戏的例子来说明如何借助资源编排服务的能力来简化整个系统配置。作为一个小的创业团队,我们没有专职的运维工程师,同时我们的游戏很受欢迎,是一个峰值在线人数超过2000人的网页游戏。由于游戏的特点导致用户操作比较频繁,我们大概前期需要2台2核心4GB内存的ECS实例,一个rds.mss1.xlarge规格的SQLServer实例,2台ECS实例运行的是同样的游戏服务端程序,游戏用户通过统一的域名登入游戏,不会感知后面到底有多少机器来提供服务,所以我们还需要一个SLB来做2台ECS的前端负载均衡器。整个游戏系统的架构如下:

基于阿里云构建自己的弹性应用

为了创建整个游戏系统,我们提前已经把游戏软件做成了一个私有镜像,镜像ID是m-25qoptbjn,然后我们编写了下面的模板:

{
    "ROSTemplateFormatVersion": "2015-09-01",

    "Resources": {

        "LoadBalancer": {
            "Description": "创建负载均衡实例,带宽20Mbps,按固定带宽付费",
            "Properties": {
                "AddressType": "internet",
                "Bandwidth": 20,
                "InternetChargeType": "paybybandwidth"
            },
            "Type": "ALIYUN::SLB::LoadBalancer"
        },

        "BackendServer1": {
            "Description": "创建游戏服务器实例,使用装有游戏服务端软件的自定义镜像, 实例规格ecs.s2.large",
            "Properties": {
                "ImageId": "m-25qoptbjn",
                "InstanceType": "ecs.s2.large",
                "InternetChargeType": "PayByTraffic",
                "IoOptimized": "optimized",
                "SecurityGroupId": {
                    "Fn::GetAtt": [
                        "securityGroup",
                        "SecurityGroupId"
                    ]
                },
                "SystemDisk_Category": "cloud"
            },
            "Type": "ALIYUN::ECS::Instance"
        },

        "BackendServer2": {
            "Description": "创建游戏服务器实例,使用装有游戏服务端软件的自定义镜像, 实例规格ecs.s2.large",
            "Properties": {
                "ImageId": "m-25qoptbjn",
                "InstanceType": "ecs.s2.large",
                "InternetChargeType": "PayByTraffic",
                "IoOptimized": "optimized",
                "SecurityGroupId": {
                    "Fn::GetAtt": [
                        "securityGroup",
                        "SecurityGroupId"
                    ]
                },
                "SystemDisk_Category": "cloud"
            },
            "Type": "ALIYUN::ECS::Instance"
        },

        "SLB_Attachment": {
            "Description": "挂载2台ECS实例到SLB",
            "Properties": {
                "BackendServers": [{
                    "ServerId": {
                        "Ref": "BackendServer1"
                    },
                    "Weight": 100
                }, {
                    "ServerId": {
                        "Ref": "BackendServer2"
                    },
                    "Weight": 100
                }],
                "LoadBalancerId": {
                    "Ref": "LoadBalancer"
                }
            },
            "Type": "ALIYUN::SLB::BackendServerAttachment"
        },
        "securityGroup": {
            "Description": "创建经典网络安全组",
            "Properties": {
                "SecurityGroupName": "WebGameSG"
            },
            "Type": "ALIYUN::ECS::SecurityGroup"
        },
        "Database": {
            "Description": "创建SQL Server数据库",
            "Type": "ALIYUN::RDS::DBInstance",
            "Properties": {
                "Engine": "SQLServer",
                "EngineVersion": "2008r2",
                "DBInstanceClass": "rds.mss1.xlarge",
                "DBInstanceStorage": 10,
                "DBInstanceNetType": "Intranet",
                "SecurityIPList": {
                    "Fn::GetAtt": ["BackendServer1", "InnerIp"]
                }
            }
        }
    }
}

模板完整定义了整个系统的资源细节和之间的依赖关系。我们登入阿里云资源编排服务的控制台,输入上面的模板内容,几分钟后网页游戏服务就已经搭建完成了。当然这个例子还是很简陋的,随着游戏运营,可能同时在线人数上升到了5000人,我们需要增加3台机器,我们只要修改模板文件重新交给资源编排服务就可以进行系统扩容。如果我们需要在另一个地域,比如青岛开辟一组新的服务,只要把模板文件复制后,选择在青岛区域运行就同样可以在几分钟内将整个服务复制到青岛。

另一个例子,我们是一家为客户提供基因分析服务的初创公司。我们通过采集客户的唾液来提取基因数据,然后采用大规模机器学习的方法来对基因数据进行分析,并最终给客户提供某些疾病的发病风险的可能性报告。人的基因数据一般都需要若干GB的文件来存储,分析这些数据需要大量的计算资源。作为初创公司,维护几百台服务器是无法接受的成本。通过阿里云的资源编排服务,我们把整个分析所依赖的软件和资源用一个模板文件来定义,当接到分析任务的时候,我们把模板文件交给阿里云的资源编排服务构建整个系统,可能是几十台ECS,上面运行我们的分析软件。当整个计算完成后,我们立即释放所有资源。这样,我们即有能力调度大量的计算资源来完成我们的业务,同时又不必为资源闲置买单。借助阿里云资源编排的能力,我们可以用同样的模板来同时构建多个一模一样的系统,来并行处理。同时,阿里云资源编排服务提供API和SDK,使我们可以把整个流程和我们的业务系统进行集成,我们可以像写代码一样的来操作云计算资源。

上面的例子虽然很简单,但是已经能够构建出很多有用的系统。其他一些系统要更复杂,但是通过阿里云资源编排服务提供的能力,整体的运维复杂度依然可以控制在很低的程度。

阿里云资源编排服务是免费的,更多信息请访问: https://www.aliyun.com/product/ros/

上一篇:活体检测及实人认证


下一篇:云上prometheus监控运维