导读

“企业上云”是当下大势所趋,“提效、降成本” 也是企业上云、迁云和管理云必须关注的问题。今天我们将从一个集群部署的场景出发,介绍阿里云如何借助生态工具Terraform持续降低企业上云、迁云和管理云成本。


1.为什么要有资源编排传统运维模式下,业务上线需经过设备采购,机器上架,网络环境搭建和系统安装等准备阶段。随着云计算的兴起,各大公有云厂商均提供了非常友好的交互界面,用户借助一个浏览器就可以按需采购各种云资源,快速实现业务架构的搭建。然而,随着业务架构的不断扩展,云资源采购的规模和种类也在持续增加。当用户需要快速采购大量不同类型的云资源时,云管理页面间大量的交互操作反而降低了云资源的采购效率。在阿里云控制台上初始化一个经典的VPC网络架构,从创建VPC、交换机VSwitch到创建Nat网关、弹性IP再到配置路由等工作,大概要花费20分钟甚至更久。同时,工作成果的不可复制性,带来的是跨Region和跨云平台场景下的重复劳动。事实上,对业务运维人员而言,只关心对资源的配置,无需关心这些资源的创建步骤。如同喝咖啡,只需要告诉服务员喝什么,加不加冰等就够了。如果有一份完整的云资源采购清单,这张清单清楚的记录了所需要购买的云资源的种类,规格,数量以及各云资源之间的关系,然后一键完成购买,并且当业务需求发生变化时,只需要变更清单就可以实现对云资源的快速变更,那么效率就会提高很多。在云计算中这被称作资源编排,目前很多云平台也提供了资源编排的能力,如阿里云的ROS,AWS的CloudFormation等。将云资源、服务或者操作步骤以代码的形式定义在模板中,借助编排引擎,实现资源的自动化管理,这就是基础设施即代码(Infrastructure as Code,简称IaC),也是资源编排最高效的实现模式。然而,多种云编排服务带来的是高昂的学习成本、低效的代码复用率和复杂的多云协同工作流程。每一种服务仅限于管理自家的单一云平台上,无法满足对多个云平台,多种层级(如IaaS,PaaS)资源的统一管理。如何解决如上问题,是否可以使用统一的编排工具,共用一套语法实现对包括阿里云在内的多云的统一管理呢?这就是本文所要介绍的主角 - Terraform。

2.Terraform简介

Terraform是由Hashicorp公司于2014年推出的一个开源项目,是一个典型的IaC工具。在Terraform中,Infrastructure是一个广泛的抽象,几乎涵盖了所有可以被管理的资源和服务,如计算资源虚拟机,存储资源磁盘、对象存储,网络资源虚拟网络、交换机、路由器、IP、负载均衡等,安全资源防火墙、其他安全产品和设备,数据库资源MySQL、PostgreSQL等等。Terraform与前文提到的ROS等各家的资源编排服务相比,主要有几个特点:

  • 开源:从诞生之初,Terraform就是一个开源项目,任何开发者都可以对其贡献代码,完善功能。
  • 多云管理:支持对多种云服务的统一管理,各云服务厂商提供自家的管理插件Provider(后文会提到),用户只需要学习统一的Terraform语法,选择不同的Provider,定义不同的资源模板即可。
    对不同云服务厂商云资源的描述可以定义在同一个模板中,相互之间不会产生干扰。
  • 面向客户端:只要在操作机器上完成对Terraform的安装,就可以通过简单的Terraform命令实现对云资源的一键管理,非常方便,无需再借助与API、SDK等方式整合后进行调用。

目前,市场上的IaC工具大体可以分为两类:一类是配置管理类,典型代表有Ansible,Chef,Puppet等;另一类是以Terraform为代表的资源编排类。运维人员可能对前者更加熟悉,并且认为这些工具也可以实现对资源的管理,比如阿里云的Ansible Module同样可以实现阿里云ECS实例,VPC,SLB等的管理和配置。但两者存在很大差别:

  • 使用场景不同:配置管理工具侧重于操作系统级别配置和管理,如机器的启停,系统软件的安装和配置等,它的目的是为了实现对机器及其上应用的控制和管理,而资源编排解决的是基础设施整体资源栈的编排和管理问题,触达的资源更广。
  • 工作模式不同:资源编排是面向声明式的。声明式只关心最终的操作结果,对用户而言,只关心我定义的那堆资源是否都已经创建完成。如果结果和声明的不一致,则会触发变更操作,直到最终状态。而配置管理工具是面向过程式的,过程式需要关心每一步的操作结果,在执行时通常是串行的,直到所有步骤结束,如先创建VPC,VSwitch,安全组,然后再利用创建好的资源创建ECS实例,SLB实例等。可以理解为按顺序自动化执行所有的操作。

阿里云作为国内第一家与 Terraform 集成的云厂商,经过两年多的努力,目前已经提供了超过 148 个 Resource 和 98 个 Data Source,覆盖计算,存储,网络,负载均衡,CDN,容器服务,中间件,访问控制,数据库等超过30款产品,已经满足如SAP,西门子这样大客户的自动化上云需求。从 Terraform 0.12.2 版本开始,阿里云支持将对象存储服务 OSS 作为标准的 Remote State Backend ,开始提供远端存储 State 的能力,在提高 state 安全性的同时,提升多人协作效率。阿里云Modules的注册数量已经达到36个,覆盖多个产品和使用场景,为开发者提供“开箱即用”使用体验。除此之外,Hashicorp中的其他成员 PackerVault也实现了与阿里云的集成,与Terraform一起从镜像制作,到权限控制,到资源编排满足用户和开发者更多的使用场景。

3.阿里云Terraform初探

接下来,本文将通过一些简单的操作和介绍,引导大家在阿里云上快速入门Terraform,后续也会有一系列文章介绍更高级的功能。

3.1 安装Terraform

正如前面提到的,Terraform是一个面向客户端的工具,在使用Terraform之前,需要在本地安装Terraform,可参考官方的安装文档:https://learn.hashicorp.com/terraform/getting-started/install。如果不想安装,可以使用阿里云提供的在线服务Cloud Shell:https://shell.aliyun.com,内置了Terraform的运行环境。

3.2 Provider:基础设施管理驱动

Provider 是Terraform中一个非常重要的组件,是一个用来管理基础设施的后端驱动,可以理解为Terraform的插件。每个云服务厂商实现面向各家云服务的Provider,其中包含资源元数据的定义,上层请求的处理和后端OpenAPI的调用和响应处理。Terraform调用不同的Provider完成不同类型资源的统一管理。目前大多数云平台均实现了各自的Provider,阿里云提供的Provider为 alicloud。Provider无需手动安装,Terraform会在 init阶段根据模板中的定义自动加载。Provider通过关键 provider声明,语法如下:

provider "alicloud" {  profile = "terraform"  region  = "cn-hangzhou"}

以上代码显示声明了需要加载的Provider插件为 alicloud,大括号中指定了该Provider的配置,其中 profile表示阿里云的认证信息可以从Credential文件 ~/.aliyun/config.json中名为 terraform的配置信息中读取;region指明了当前模板中定义的资源会被创建在杭州区域。如果不想使用 profile,可以直接在如上配置中硬编码 access_keysecret_key,但是硬编码的方式存在密钥泄漏的风险,不推荐。运行 terraform init自动加载Provider:Provider 也可以省略,即隐式定义。通过环境变量 ALICLOUD_ACCESS_KEY、ALICLOUD_SECRET_KEYALICLOUD_REGION来设置Provider所需的必填参数。 init时,Terraform将通过下文即将讲到的Resource和Data Source来识别相应的Provider,进而完成加载。

3.3 Resource:资源的定义和管理

Resource是Terraform中的一个重要概念,是Provider的重要组成部分。每个Resource定义了特定基础设施资源的属性,通过对Create、Update、Read和Delete方法的实现来管理特定资源的生命周期。

3.3.1 Resource 的声明和定义

Resource通过关键字 resource来声明,对一个特定资源的定义如下:

# 定义一个ECS实例resource "alicloud_instance" "default" {  image_id        = "ubuntu_18_04_64_20G_alibase_20190624.vhd"  instance_type   = "ecs.sn1ne.large"  instance_name   = "my-first-vm"  ...}

对资源的定义包含如下几个部分:

  • alicloud_instance 为资源类型,定义当前资源的类型,告诉Terraform这个Resource是阿里云的虚拟机还是其他资源,如VPC、SLB等。
  • default 为资源名称,资源名称用来标识所定义的资源,在同一个模板(即当前运行目录下所有以 .tf 结尾的文件)中对同一资源类型的标识必须唯一。
  • 大括号里面的内容为参数配置,用来定义资源属性,比如实例的镜像、规格、名称,VPC的网段等。

上述代码定义了一个阿里云ECS实例,镜像ID为ubuntu_18_04_64_20G_alibase_20190624.vhd,规格为 ecs.sn1ne.large,实例名称为 my-first-vm,更多参数定义可参考官方文档:https://www.terraform.io/docs/providers/alicloud/r/instance.html

3.3.2 Resource 的创建

完成对资源的定义,可以先通过 terraform plan预览模板中所定义的资源:

shell@Alicloud:~$ terraform  plan...An execution plan has been generated and is shown below.Resource actions are indicated with the following symbols:  + createTerraform will perform the following actions:  # alicloud_instance.default will be created  + resource "alicloud_instance" "default" {      + availability_zone          = (known after apply)      + host_name                  = (known after apply)      + image_id                   = "ubuntu_18_04_64_20G_alibase_20190624.vhd"      + instance_charge_type       = "PostPaid"      + instance_name              = "my-first-vm"      + instance_type              = "ecs.sn1ne.large"      ...    }Plan: 1 to add, 0 to change, 0 to destroy.

如上输出可知,Terraform将创建一个资源 alicloud_instance.default,其中某些属性如 host_name为 known after apply,这个意思是说该参数的值需要在执行 terraform apply之后才能知道,通常这种字段值如果没有显示设置,后端系统将自动生成的或者通过其他Resource和Data Source来设置。确认无误后,执行 terraform apply开始创建资源:

shell@Alicloud:~$ terraform applyAn execution plan has been generated and is shown below.Resource actions are indicated with the following symbols:  + createTerraform will perform the following actions:  # alicloud_instance.default will be created  + resource "alicloud_instance" "default" {      + availability_zone          = (known after apply)      ...    }Plan: 1 to add, 0 to change, 0 to destroy.Do you want to perform these actions?  Terraform will perform the actions described above.  Only 'yes' will be accepted to approve.  Enter a value: yesalicloud_instance.default: Creating...alicloud_instance.default: Still creating... [10s elapsed]alicloud_instance.default: Still creating... [20s elapsed]alicloud_instance.default: Creation complete after 23s [id=i-bp18hno0jw73fcbrykt7]Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

‍为了安全起见, apply之后需要输入 yes确认,执行完毕后输出创建后的ECS实例 ID为 i-bp18hno0jw73fcbrykt7。登录ECS控制台验证如下:

3.3.3 Resource 的变更

对于IaC的工具,资源的变更非常简单,只需要修改模板中定义的属性值即可。Terraform对资源的变更有两种情况:

  • 原地变更(update in-place):即在不改变资源生命周期的情况下,实现对资源自身属性的修改,如变更资源的名称,描述,标签等。
  • 重建变更(destroy and then create replacement):某些资源属性不支持变更,这种情况下,如果修改资源的属性,Terraform将会先删除原有的资源,然后按照最新的模板定义创建新的Resource,间接实现资源的变更操作。对于不支持变更的属性,阿里云Provider的文档中,会对该属性字段显示声明为 ForceNew 。

接下来,分别通过修改实例的两个属性来演示如上的两种变更情况。首先,修改实例的名称为“update-my-first-vm”,并为其增加一个标签 Newtag: "update name" 。跳过 plan 过程直接执行 terraform apply  结果如下:

shell@Alicloud:~$ terraform applyalicloud_instance.default: Refreshing state... [id=i-bp18hno0jw73fcbrykt7]An execution plan has been generated and is shown below.Resource actions are indicated with the following symbols:  ~ update in-placeTerraform will perform the following actions:  # alicloud_instance.default will be updated in-place  ~ resource "alicloud_instance" "default" {        ...      ~ instance_name              = "my-first-vm" -> "update-my-first-vm"        instance_type              = "ecs.sn1ne.large"        ...      + tags                       = {          + "Newtag" = "update name"        }        ...    }Plan: 0 to add, 1 to change, 0 to destroy.Do you want to perform these actions?  Terraform will perform the actions described above.  Only 'yes' will be accepted to approve.  Enter a value: yesalicloud_instance.default: Modifying... [id=i-bp18hno0jw73fcbrykt7]alicloud_instance.default: Modifications complete after 1s [id=i-bp18hno0jw73fcbrykt7]Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

如上所示, update in-place 只改变了实例的名称和新增了一个tag,不需要重新创建实例。Terraform的展示中, + 表示新增, ~ 表示更新的内容,左边的是旧值,右边的是新值, - 表示即将删除。在此基础上,如果修改实例所属的资源组 resource_group_id ,则在执行 terraform apply 之后将会导致实例的重建:

shell@Alicloud:~$ terraform applyalicloud_instance.default: Refreshing state... [id=i-bp18hno0jw73fcbrykt7]An execution plan has been generated and is shown below.Resource actions are indicated with the following symbols:-/+ destroy and then create replacementTerraform will perform the following actions:  # alicloud_instance.default must be replaced-/+ resource "alicloud_instance" "default" {      ~ availability_zone          = "cn-hangzhou-g" -> (known after apply)        deletion_protection        = false      ~ host_name                  = "iZbp18hno0jw73fcbrykt7Z" -> (known after apply)      ~ id                         = "i-bp18hno0jw73fcbrykt7" -> (known after apply)        ...        instance_name              = "update-my-first-vm"      - internet_charge_type       = "PayByTraffic" -> null      ~ internet_max_bandwidth_in  = -1 -> (known after apply)      + public_ip                  = (known after apply)      + resource_group_id          = "rg-aekzryaevt26ofq" # forces replacement        ...    }Plan: 1 to add, 0 to change, 1 to destroy.Do you want to perform these actions?  Terraform will perform the actions described above.  Only 'yes' will be accepted to approve.  Enter a value: yesalicloud_instance.default: Destroying... [id=i-bp18hno0jw73fcbrykt7]alicloud_instance.default: Still destroying... [id=i-bp18hno0jw73fcbrykt7, 10s elapsed]alicloud_instance.default: Destruction complete after 10salicloud_instance.default: Creating...alicloud_instance.default: Still creating... [10s elapsed]alicloud_instance.default: Still creating... [20s elapsed]alicloud_instance.default: Creation complete after 23s [id=i-bp16oytazedmtelzdgo2]Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

如上所示, resource_group_id的变更是一个 forces replacement行为,导致原机器的释放和新机器的创建。值得注意的是,删除的资源无法实现回滚,数据无法恢复,因此在 apply 前一定要通过 plan  命令仔细查看哪些资源是原地变更,哪些是重建变更,以免造成不可恢复的错误。

3.3.4  Resource 的查看

想要查看创建完的资源,最简单的方式是执行命令 terraform show,此时终端将会快速展示出所有当前模板中定义的资源及其属性:

shell@Alicloud:~$ terraform show# alicloud_instance.default:resource "alicloud_instance" "default" {    availability_zone          = "cn-hangzhou-g"    deletion_protection        = false    id                         = "i-bp16oytazedmtelzdgo2"    image_id                   = "ubuntu_18_04_64_20G_alibase_20190624.vhd"    instance_charge_type       = "PostPaid"    instance_name              = "update-my-first-vm"    instance_type              = "ecs.sn1ne.large"    ...    tags                       = {        "Newtag" = "update name"    }    ...}

这种方法固然简单,但是如果当资源非常多的时候,在所有资源中寻找目标资源就比较吃力了。此时,可以通过 terraform state模式来实现对目标资源的查看。首先,执行 terraform state list罗列出当前的所有资源,每个资源显示格式为 .

shell@Alicloud:~$ terraform state listalicloud_instance.default

接着,找到对应的资源,执行 terraform state show .即可实现对目标资源的查看:

shell@Alicloud:~$ terraform state show alicloud_instance.default# alicloud_instance.default:resource "alicloud_instance" "default" {    availability_zone          = "cn-hangzhou-g"    deletion_protection        = false    id                         = "i-bp16oytazedmtelzdgo2"    image_id                   = "ubuntu_18_04_64_20G_alibase_20190624.vhd"    instance_charge_type       = "PostPaid"    instance_name              = "update-my-first-vm"    instance_type              = "ecs.sn1ne.large"    ...    tags                       = {        "Newtag" = "update name"    }    ...}

可以看到,其结果与只有一个资源时 terraform show的结果是一致的。

3.3.5  Resource 的释放

通常情况下,资源的释放是通过命令 terraform destroy来执行,但是这个命令会将模板中所有定义的资源都删除,如下:

shell@Alicloud:~$ terraform destroy alicloud_instance.default: Refreshing state... [id=i-bp16oytazedmtelzdgo2]An execution plan has been generated and is shown below.Resource actions are indicated with the following symbols:  - destroyTerraform will perform the following actions:  # alicloud_instance.default will be destroyed  - resource "alicloud_instance" "default" {      ...      - id                         = "i-bp16oytazedmtelzdgo2" -> null      ...      - instance_name              = "update-my-first-vm" -> null      ...    }Plan: 0 to add, 0 to change, 1 to destroy.Do you really want to destroy all resources?  Terraform will destroy all your managed infrastructure, as shown above.  There is no undo. Only 'yes' will be accepted to confirm.  Enter a value: yesalicloud_instance.default: Destroying... [id=i-bp16oytazedmtelzdgo2]alicloud_instance.default: Still destroying... [id=i-bp16oytazedmtelzdgo2, 10s elapsed]alicloud_instance.default: Destruction complete after 11sDestroy complete! Resources: 1 destroyed.

如果想要删除其中的某个资源,可以通过 -target=.来指定要删除的资源,如 terraform destroy -target=alicloud_instance.default,其结果跟只有一个资源的删除是一致的。除此之外,归功于Terraform状态的一致性(后面会讲到)的特点,还有一种间接删除资源的方式。上文中提到,当模板发生变更的时候, apply命令会判断资源不一致而导致触发资源的变更,因此,我们可以在模板中把想要删除的资源定义移除,然后运行 apply命令来完成资源的移除。

3.4 State:资源的状态存储

细心的读者可能会发现,在执行 showstate list命令时,执行速度非常快,随着命令的结束,资源的属性就被快速展示,而其他命令的执行都需要等几秒钟甚至几分钟,这个跟Terraform的实现机制有关。Terraform在完成资源的创建和修改之后,会将资源的最新的状态和属性存储在一个称之为 state的文件中,文件名默认为 terraform.tfstate,文件的默认存储位置是资源模板所在的目录。这个 state文件可以看作是Terraform存储资源属性的“数据库”,当执行 showstate list命令时,Terraform直接读取的是 state文件,无需调用云平台的API,而其他的命令需要与API交互后返回。state文件非常重要, 它只从属于一个特定的模板,模板变, state变。因此,如果 state文件被损坏或者被删除,Terraform会认为其管理的资源发生了变更和移除(虽然实际的资源可能依然存在于云平台),此时再执行 apply命令将会按照模板的定义变跟或者重建资源,直到模板对资源的定义与 state中保存的保持一致。state与模板的依附关系在团队协作管理的时候尤为重要,在拷贝模板代码的同时,如果想维护同一套资源, state也需要一起拷贝,这在无形中增加了代码维护的成本。为了解决这个问题,Terraform提供了远端存储 state的能力 remote state,正如前文提到的,可以将 state文件存放在阿里云的OSS上,以实现模板与 state的管理分离。模板与 state的高度一致性也是Terraform的一个亮点,可以说虽然Terraform是面向客户端的,但它也是有状态,这也意味着Terraform所管理的资源,不能通过其他工具和服务(如控制台,阿里云CLI,API等)来变更资源,否则,Terraform会在下次执行 apply时因为状态的不一致而触发变更。

3.5 Data Source:基础设施的动态查询

对资源的查询是运维人员或者系统最常使用的操作,比如,查看某个Region下有哪些可用区,某个可用区下有哪些实例规格,每个Region下有哪些镜像,当前账号下有多少机器等。通过对资源及其属性的查询可以帮助和引导开发者进行下一步的操作。除此之外,在编写Terraform模板时,Resource使用的参数有些是固定的静态变量,但有些情况下参数变量不确定或者可选值不清楚或者参数可能随时变化。比如我们创建ECS 实例时,通常需要指定我们自己的镜像ID和实例规格,首先要知道某个镜像ID对应的字符串,特定CPU核数和内存对应的实例规格;创建VSwitch的时候,需要知道某个Region下有哪些可用区等,当然,我们可以通过控制台或者帮助文档手动查询到这些信息,但是一方面查找不方便,另一方面,我们的模板可能随时会更新。如果在代码中硬编码ImageID,InstanceType和可用区等信息,一旦我们更新这些信息,模板就需要重新修改代码,非常不灵活。在Terraform 中,Data Source 提供的就是一个查询资源的功能,每个Data Source实现对一个特定资源的动态查询:在模板中定义过滤条件,执行 plan或者 apply即可动态返回符合条件的资源。在编写Resource代码时非常方便,通过引用的方式可将Data Source的结果动态呈现给Resource。Data Source通过 data关键字声明,如下:

// Images data source for image_iddata "alicloud_images" "default" {  most_recent = true  owners      = "system"  name_regex  = "^ubuntu_18.*_64"}data "alicloud_zones" "default" {  available_resource_creation = "VSwitch"  enable_details              = true}// Instance_types data source for instance_typedata "alicloud_instance_types" "default" {  availability_zone = data.alicloud_zones.default.zones.0.id  cpu_core_count    = 2  memory_size       = 4}resource "alicloud_instance" "web" {  image_id        = data.alicloud_images.default.images[0].id  instance_type   = data.alicloud_instance_types.default.instance_types[0].id  instance_name   = "my-first-vm"  system_disk_category = "cloud_ssd"  ...}

如上例子中的ECS Instance没有指定镜像ImageID和实例规格,而是通过 data引用:Terraform运行时将首先根据镜像名称前缀选择系统镜像,如果同时有多个镜像满足条件,则选择最新的镜像。实例规格也是类似,在符合创建VSwitch的某个可用区下选择2核4G的实例规格进行返回,并将其中的第一个值赋值给Resource Instance。

4.一分钟部署ECS集群

读到此处,我们再回头考虑文章开始提到的:在阿里云控制台上需要20分钟甚至更久的时间来初始化一个经典的VPC网络架构。如果要在这个架构中搭建一个ECS集群,那么花费的时间将会更长。如图展示了在一个VPC网络环境下,搭建一个单可用区的ECS集群,并通过Nat网关和EIP实现与公网环境的互通。对于这样的一个网络架构,如果通过控制台来一步步搭建,至少需要十几步的操作和若干页面间的来回切换,费时又费力。但如果交给Terraform来做,借助已经实现的Module terraform-alicloud-ecs-cluster,只需一键就可在1分钟内搞定16个资源。

// 在杭州部署含6个节点的集群module "cluster" {  source        = "terraform-aicloud-modules/ecs-cluster/alicloud"  region_id     = "cn-hangzhou"  cluster_size  = 6  instance_name = "one-min-deploy-ecs-cluster"}

(一键部署ECS集群)如果想实现网络架构的跨Region复制或者同时部署,只需修改或者增加Region,执行 apply命令即可。

// 在杭州部署含6个节点的集群module "cluster-cn" {  source        = "terraform-aicloud-modules/ecs-cluster/alicloud"  region        = "cn-hangzhou"  cluster_size  = 6  instance_name = "one-min-deploy-ecs-cluster"}// 在德国部署含8个节点的集群module "cluster-eu" {  source        = "terraform-aicloud-modules/ecs-cluster/alicloud"  region        = "eu-central-1"  cluster_size  = 8  instance_name = "one-min-deploy-ecs-cluster"}...

总结“提效、降成本”在Terraform帮助企业上云,迁云和管理云中得到了很好的体现。正如上文演示,借助Terraform强大的功能和简单的编写语法,一分钟内实现6个节点ECS集群的快速部署和多Region的快速复制,极大地提升了部署效率。阿里云对Terraform的支持力度只会越来越大,保持与控制台资源管理功能的一致性是阿里云Provider追求的目标,更多的产品和功能将在Terraform中持续体现,基于Module的解决方案也将陆续推出,真正做到一个工具实现对阿里云所有资源的统一管理。Terraform的用法非常多样灵活,本文只是带领大家熟悉如何在阿里云上使用Terraform,后续将推出一系列文章来介绍更多高级的功能,敬请期待。


1.如何打造多语言云计算SDK体系——阿里云SDK体系介绍2.云服务OpenAPI设计7大挑战3.云栖精彩回顾 | 开放平台专场大咖们都聊了些啥?

怎么把springboot部署到阿里云_听说“一分钟就能部署阿里云ECS集群”?相关推荐

  1. 数人云DCOS:坚持Mesos+Docker,图谋10万主机集群与机器学习扩容

    国内的容器创业公司各具特色,数人云看中的是用Mesos和Docker改变企业级市场.在日前的媒体沟通会上,数人云创始人&CEO王璞和数人云CTO肖德时介绍了数人云的目标以及技术选择.商业路径. ...

  2. redis 端口_「建议收藏」手把手教你搭建redis集群

    前言 在生产中单机的redis服务不能保证程序的高可用,所以有时需要我们来搭建一个redis集群,保证某一台redis服务挂了的时候,我们的服务还可以保证正常运行. 单机redis的搭建,可以参考我的 ...

  3. 原创 【ReactJs+springBoot项目——租房】第13章:MySQL主从复制+MyCat数据库中间件+HAProxy+PXC集群

    分析目前系统架构中的数据库层存在的问题 分析MySQL数据库的集群方案 学习主从复制(读写分离)架构方案 掌握MyCat数据库中间件的使用 掌握HAProxy复制均衡的使用 掌握PXC集群的使用 多种 ...

  4. 导致集群重启_干货丨如何水平扩展和垂直扩展DolphinDB集群?

    随着业务的扩展,数据量不断积累,数据库系统的数据容量和计算能力会逐渐不堪重负,因此优秀的数据库系统必须具备良好的扩展性.DolphinDB集群中的数据节点是集计算和存储于一体的,所以要提高计算能力和数 ...

  5. nginx集群_使用Nginx+Tomcat+keepalived 搭建高性能高可用性负载均衡集群

    在互联网项目中,往往面临着高用户量.高并发的问题,造成服务器的压力非常大,特别是电商项目,以淘宝天猫为例,近年双十一的成交量屡创新高,可想而知淘宝天猫的服务器面临的并发量有多大,单一服务器肯定承受不住 ...

  6. 【华为云技术分享】MongoDB经典故障系列五:sharding集群执行sh.stopBalancer()命令被卡住怎么办?

    [摘要] MongoDB sharding集群执行sh.stopBalancer()命令时被卡住怎么办?别慌,华为云数据库来给您支招,收下这份方案指南,让您分分钟远离被自建MongoDB数据库支配的恐 ...

  7. 2台mysql集群_如何安装配置基于2台服务器的MySQL集群

    这篇文章旨在介绍如何安装配置基于2台服务器的MySQL集群.并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行. 注意!虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务 ...

  8. 云原生中间件RocketMQ-消费者核心参数、消费模式之集群模式

    文章目录 PushConsumer核心参数详解 PushConsumer消费模式-集群模式 PushConsumer核心参数详解 consumeFromWhere:消费者从那个位置开始消费 CONSU ...

  9. 虚拟ip mysql负载均衡_微服务管理平台nacos虚拟ip负载均衡集群模式搭建

    一.Nacos简介 Nacos是用于微服务管理的平台,其核心功能是服务注册与发现.服务配置管理. Nacos作为服务注册发现组件,可以替换Spring Cloud应用中传统的服务注册于发现组件,如:E ...

最新文章

  1. charles 代理手机连不上网_手机连不上网?四种方法教你如何解决,建议收藏以备不时之需...
  2. slack 国内 android,使用Slack Api登录,Android
  3. 计算机科学与技术python方向是什么意思-第一模块·开发基础-第1章 Python基础语法...
  4. Properties 配置文件参数 注入bean中
  5. [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类
  6. mysql自定义函数多参数_自定义mysql函数 - 无法传递参数
  7. draft.js_如何使用快捷方式在Draft.js中创建有序列表和无序列表
  8. 利用HTML中的XML数据岛记录浏览
  9. C语言宏定义中#define中的井号#的使用
  10. 考前必背的50个知识点——系统集成项目管理工程师考试
  11. Maven进行Mahout编程,使其兼容Hadoop2.2.0环境运行 (转)
  12. Python:学习笔记
  13. swf文件的反编译入门
  14. java生成微信小程序二维码,前台扫描识别
  15. HTTP请求方式和幂等性
  16. redis主从故障自动切换IP漂移
  17. unity 阳光插件_PR插件BeatEdit安装教程
  18. Vue :将头像/文本生成二维码
  19. C语言代码简化技巧(一)
  20. 电子健康档案在国外的一些实践

热门文章

  1. CSS3:linear-gradient,线性渐变的使用方法
  2. Netty3之ServerBootstrap分析
  3. 在网站建设过程中主要在哪几个方面为后期的网站优打好根基?
  4. loadrunner通过使用libmysql.dll完成mysql的测试
  5. JS面向对象,创建,继承
  6. Seam - 无缝集成 JSF,第 3 部分: 用于 JSF 的 Ajax
  7. 博客订阅代码de制作
  8. E打开https网站时,提示此网站的安全证书有问题(证书无效)
  9. 使用Uploadify实现上传图片生成缩略图例子,实时显示进度条
  10. android开发控件水波纹,Android实现水波纹控件的方法