云上经典架构

更新时间: 2024-03-06 10:53:26

一键部署

30

https://www.aliyun.com/solution/tech-solution/habwoc

方案概览

All in one ECS式的单机网站架构非常简单,且部署方便,许多业务在初期会采用此架构。但单机架构存在很大的稳定性隐患。ECS实例所在的宿主物理机可能会因为潜在的软硬件故障风险而被有计划的重启,ECS所在的可用区(机房)也可能因为电力故障、自然灾害等不可抗力因素出现短时间内的服务中断。这些都可能造成您的网站无法访问,造成业务损失。为了解决这个问题,您应该选择多可用区架构甚至是多地域架构,实现在不可避免的故障到来时,仍然能对您的用户正常提供网站服务。

本技术解决方案将以搭建一个博客为例,为您演示:

  • 如何搭建一个跨可用区的高可用网站

  • 搭建完成后,模拟故障,观察网站的可用性

方案架构

方案提供的默认设置完成部署后在阿里云上搭建的网站运行环境如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。

tech_solu-修改图标@2x.png

本方案的技术架构包括以下基础设施和云服务:

  • 1个专有网络VPC:为应用型负载均衡ALB、云服务器ECS、云数据库PolarDB MySQL版等云资源形成云上私有网络。

  • 2台交换机:将2台云服务器ECS连接在同一网络上,实现它们之间的通信,并提供基本的网络分段和隔离功能。

  • 1个公网应用型负载均衡ALB:对外提供访问并将用户请求分配到不同云服务器ECS上的博客网站服务。

  • 2台云服务器ECS:用于部署博客网站服务。

  • 1个云数据库PolarDB MySQL版集群:为博客网站服务提供数据服务。

部署准备

15

开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值

    • 为节省成本,本方案默认选择使用按量付费及抢占式资源,使用按量付费资源需要确保账户余额不小于100元。

    • 完成本方案的部署及体验,预计产生费用不超过2元(假设您选择最低规格资源,且资源运行时间不超过30分钟。如调整了资源规格,请以控制台显示的实际报价以及最终账单为准)。

      image.png

  3. 阿里云账号拥有操作所有资源的最高权限,为了安全起见,建议您使用RAM用户。RAM用户需要获得相关权限才能完成方案部署,详情如下:

    • 涉及的云服务:负载均衡ALB、云服务器ECS、专有网络VPC、弹性公网IP、云数据库PolarDB、资源编排ROS。

    • 权限策略参考:

      HighAvailableBlogDeployPolicy

      示例权限策略限制了仅能进行如下操作,您也可以根据需要适当调整权限策略。

      {
          "Version":"1",
          "Statement":[
              {
                  "Effect":"Allow",
                  "Action":[
                      "alb:AddServersToServerGroup",
                      "alb:CreateListener",
                      "alb:CreateLoadBalancer",
                      "alb:CreateServerGroup",
                      "alb:DeleteListener",
                      "alb:DeleteLoadBalancer",
                      "alb:DeleteServerGroup",
                      "alb:DescribeZones",
                      "alb:GetListenerAttribute",
                      "alb:GetLoadBalancerAttribute",
                      "alb:ListServerGroupServers",
                      "alb:ListServerGroups",
                      "alb:RemoveServersFromServerGroup",
                      "ecs:AllocatePublicIpAddress",
                      "ecs:AuthorizeSecurityGroup",
                      "ecs:AuthorizeSecurityGroupEgress",
                      "ecs:CreateDisk",
                      "ecs:CreateInstance",
                      "ecs:CreateNetworkInterface",
                      "ecs:CreateSecurityGroup",
                      "ecs:DeleteDisk",
                      "ecs:DeleteInstance",
                      "ecs:DeleteNetworkInterface",
                      "ecs:DeleteSecurityGroup",
                      "ecs:DescribeAvailableResource",
                      "ecs:DescribeCloudAssistantStatus",
                      "ecs:DescribeDisks",
                      "ecs:DescribeImageSupportInstanceTypes",
                      "ecs:DescribeImages",
                      "ecs:DescribeInstances",
                      "ecs:DescribeInvocations",
                      "ecs:DescribeNetworkInterfaces",
                      "ecs:DescribePrice",
                      "ecs:DescribeSecurityGroupAttribute",
                      "ecs:DescribeSecurityGroups",
                      "ecs:DescribeZones",
                      "ecs:QueryImageByImageId",
                      "ecs:RunCommand",
                      "ecs:StartInstance",
                      "ecs:StopInstance",
                      "ecs:StopInvocation",
                      "polardb:CreateAccount",
                      "polardb:CreateDBCluster",
                      "polardb:CreateDatabase",
                      "polardb:DeleteAccount",
                      "polardb:DeleteDBCluster",
                      "polardb:DeleteDatabase",
                      "polardb:DescribeAccounts",
                      "polardb:DescribeActiveOperationTaskCount",
                      "polardb:DescribeDBClusterAccessWhitelist",
                      "polardb:DescribeDBClusterAttribute",
                      "polardb:DescribeDBClusterAvailableResources",
                      "polardb:DescribeDBClusterEndpoints",
                      "polardb:DescribeDBClusterMigration",
                      "polardb:DescribeDBClusterServerlessConf",
                      "polardb:DescribeDBClusterVersion",
                      "polardb:DescribeDBClusters",
                      "polardb:DescribeDBClustersWithBackups",
                      "polardb:DescribeDatabases",
                      "polardb:DescribeGlobalDatabaseNetworks",
                      "polardb:DescribeRegions",
                      "polardb:DescribeScheduleTasks",
                      "polardb:DescribeTasks",
                      "polardb:ListTagResourcesForRegion",
                      "polardb:ModifyDBClusterAccessWhitelist",
                      "ros:CreateStack",
                      "ros:DeleteStack",
                      "ros:GetServiceProvisions",
                      "ros:GetStack",
                      "ros:GetStackPolicy",
                      "ros:GetStackResource",
                      "ros:GetTemplateEstimateCost",
                      "ros:GetTemplateParameterConstraints",
                      "ros:ListStackEvents",
                      "ros:ListStackOperationRisks",
                      "ros:ListStackResources",
                      "ros:ListStacks",
                      "ros:PreviewStack",
                      "vpc:AllocateEipAddress",
                      "vpc:AssociateEipAddress",
                      "vpc:CreateVSwitch",
                      "vpc:CreateVpc",
                      "vpc:DeleteVSwitch",
                      "vpc:DeleteVpc",
                      "vpc:DescribeEipAddresses",
                      "vpc:DescribeNatGateways",
                      "vpc:DescribeRouteTableList",
                      "vpc:DescribeRouteTables",
                      "vpc:DescribeVSwitches",
                      "vpc:DescribeVpcs",
                      "vpc:DescribeZones",
                      "vpc:ReleaseEipAddress",
                      "vpc:UnassociateEipAddress"
                  ],
                  "Resource":"*"
              }
          ]
      }
    • RAM用户的使用请参见创建RAM用户创建自定义权限策略为RAM用户授权

一键部署

5

ROS一键部署

您可以通过下方提供的ROS一键部署链接,来自动化地完成这些资源的创建和配置:

  • 创建1个专有网络VPC。

  • 创建2台交换机。

  • 部署2台云服务器ECS并安装WordPress。

  • 创建1个公网应用型负载均衡ALB,并挂载这两台ECS作为后端服务器。

  • 部署1个云数据库PolarDB MysQL版集群。

  1. 单击一键部署,并选择地域。

  2. 配置模板参数页面修改资源栈名称,配置ECS实例、PolarDB数据库。填写完所有必选信息并确认后单击创建开始一键配置。

    说明

    可能会遇到因所选资源售空而导致无法创建资源栈的情况,您可以更换地域、可用区或资源规格重试。

  3. 资源栈信息页面的状态显示为创建成功时表示一键配置完成。

验证及清理

10

方案验证

完成了多服务器配置后,您可以停止任一服务器,来验证在部分服务器不可用时,服务的可用性。

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择实例与镜像>实例

  3. 在顶部菜单栏,选择和试用实例相同的地域。

  4. 选择任意1个ECS实例,在其右侧操作列,选择更多>实例状态>停止

  5. 停止实例页面,选择普通停机模式,然后单击确定

  6. 待实例状态变成已停止后,再次通过DNS地址访问WordPress,发现博客依然可以访问。

您也可以模拟PolarDB故障验证网站的可用性,详情请参见:PolarDB主可用区故障时自动切换主备

清理资源

在本方案中,您创建了2台云服务器ECS实例、1个应用型负载均衡ALB实例、2个交换机、1个专有网络VPC、1个云数据库PolarDB MySQL版实例。测试完方案后,您可以参考以下规则处理对应产品的实例,避免继续产生费用:

  1. 登录ROS控制台

  2. 在左侧导航栏,选择资源栈

  3. 资源栈页面的顶部选择部署的资源栈所在地域,找到资源栈,然后在其右侧操作列,单击删除

  4. 删除资源栈对话框,选择删除方式释放资源,然后单击确定,根据提示完成资源释放。