AutoScaling 成本优化模式升级--混合实例策略

伸缩组成本优化模式以成本为目标,始终创建最低价的实例,同时,通过多可用区,多实例规格分布,以此来提高服务稳定性。但是,对于成本优势最大化的竞价实例,伸缩组难以防范竞价实例大范围回收可能导致的服务雪崩,本次升级允许用户制定更详细的成本控制策略,在成本和稳定性之间进行调整和权衡。

成本优化模式简介

当您的伸缩配置选择了多实例规格,并想以最低的价格来使用同等规模的 ECS 实例配置时,您可以选择使用 成本优化策略 的伸缩组,来降低您的 ECS 实例使用成本;当您的伸缩配置选择的实例为抢占式实例时,您可能会遇到由于价格、库存等原因导致抢占式实例创建失败场景,从而导致扩容不及时,影响到业务,您也可以选择使用 成本优化策略 的伸缩组,在抢占式实例创建失败的时候自动为您尝试创建同规格的按量实例,来保证业务的稳定性。

从上述的描述,我们可以清晰的看到,成本优化模式的核心策略:

  1. 创建实例时,以单核cpu价格价格最低来选择创建实例的 InstanceType(实例规格),ZoneId(可用区)等配置信息。
  2. 竞价实例创建失败时,调整为创建按量实例,以保证业务连续性。

我们将上述的策略称为最低价策略(LowestPrice)。

成本优化模式升级

成本优化模式的升级策略主要针对竞价实例回收机制可能带来的业务雪崩情况。主要集中在以下两点:

  1. 混合实例配比。允许用户为成本优化伸缩组制定按量实例与竞价实例的混合策略。
  2. 竞价实例主动替换。在竞价实例释放前创建新实例,主动替换掉当前的竞价实例。

在下面的文章中,我们将原成本优化伸缩组称为普通成本优化伸缩组,将指定实例混合策略的成本优化伸缩组称为成本优化混合实例伸缩组。

参数详解

  • OnDemandBaseCapacity

伸缩组所需要的按量实例的最小个数,当伸缩组中按量实例个数小于该值时,将优先创建按量实例。

  • OnDemandPercentageAboveBaseCapacity

满足 OnDemandBaseCapacity 条件后,创建实例中按量实例所占的比例。

  • SpotInstancePools

SpotInstancePools 指定了最低价的多个实例规格,当创建竞价实例时,将在 SpotInstancePools 中进行均衡分布。

  • SpotInstanceRemedy

是否开启竞价实例的补偿机制。开启后在竞价实例被回收前5分钟左右,将主动替换掉当前竞价实例。

兼容性介绍

成本优化混合实例伸缩组与普通成本优化伸缩组在接口和功能方面是完全兼容的。当您不指定混合实例策略的相关参数时,您将创建出普通成本优化伸缩组。同时,对于成本优化混合实例伸缩组,通过合理的制定混合实例策略,能够具有与普通成本优化伸缩组完全相同的行为。下面举例说明:

  1. 假设普通成本优化伸缩组创建的全为按量实例。

此时,你创建的成本优化混合实例伸缩组只需要指定OnDemandBaseCapacity=0, OnDemandPercentageAboveBaseCapacity=100,spotInstancePools=1,那么将拥有完全相同的行为。

  1. 假设普通成本优化伸缩组优先创建竞价实例。

此时,你创建的成本优化混合实例伸缩组只需要指定OnDemandBaseCapacity=0, OnDemandPercentageAboveBaseCapacity=0,spotInstancePools=1,那么将拥有完全相同的行为。

扩缩容策略

成本优化混合实例伸缩组拥有一套相对独立的扩缩容策略,您在大多数情况下不需要关注实例的选择过程,如果您需要对伸缩组行为具有更详细的了解,本节中对扩缩容过程进行了详细的描述。

扩容策略

当指定了伸缩组的实例混合策略之后,伸缩组并非仅对新创建出来的实例按照混合比例进行创建,而是保证伸缩组整体的实例配比趋近目标配比。

  • 按量实例扩容策略

按量实例部分,采用了 LowestPrice 的创建方式,多实例规格与多可用区按照优先级方式依此进行选择,该部分与普通成本优化伸缩组保持一致。

  • 竞价实例扩容策略

竞价实例部分,采用了 LowestPrice 的创建方式,当配置多实例规格时,将根据 SpotInstancePools 配置,在最低价的多个实例规格之间平均分配,针对每一种实例规格,当无法成功创建时,按照价格顺序依次选取下一规格继续进行创建,当竞价实例全部不可创建,将退回到创建对应的按量实例。多可用区则按照优先级的方式依次进行选择。

下面,我们通过示例来描述成本优化混合实例伸缩组的扩容行为:

假设伸缩组组内按量实例个数为3,竞价实例为1个ecs.n1.tiny规格实例,OnDemandBaseCapacity = 5,OnDemandPercentageAboveBaseCapacity = 40,SpotInstancePools = 2,伸缩组实例规格配置为:ecs.n1.tiny, ecs.n1.small,ecs.n1.medium(价格依此上升)。

扩容数量按量实例分配情况竞价实例分配情况
031(tiny)
141(tiny)
251(tiny)
361(tiny)
471(tiny)
571(tiny)1(small)
672(tiny)1(small)
782(tiny)1(small)
882(tiny)2(small)

缩容策略

成本优化混合实例伸缩组的释放策略不遵循伸缩组上指定的释放策略,为了保持实例伸缩组内实例的混合配比,将采用以下描述的实例释放策略。首先,将根据伸缩组实例混合策略,确定将要释放的按量实例与竞价实例的个数,我们将在保证足够数量的实例被释放的前提下,按照伸缩组整体趋近期望配比的方式确定释放按量实例和竞价实例的个数。当按量实例个数不足时,将释放更多的竞价实例;当竞价实例个数不足时,将改为释放按量实例。

  • 按量实例缩容策略

释放按量实例时,将按照以下条件选择可释放的实例:

  1. 优先释放价格高的实例;
  2. 价格相同时,按照伸缩组指定的释放策略选取合适数量的实例进行释放。
  • 竞价实例缩容策略

释放竞价实例时,将按照以下条件选择可释放的实例:

  1. 将首先释放不属于spotInstancePools中规格类型的实例,这部分实例的释放策略与上述按量实例的缩容策略相同;
  2. 如果还需要释放规格类型属于spotInstancePools的实例,将进一步选择释放所需要的实例,选择方式如下:

    1. 选择释放的实例将使得剩余实例的实例规格在spotInstancePools中趋于均衡分布;
    2. 相同规格的多个实例可供选择时,将按照伸缩组指定的释放策略选择释放的实例。

下面,同样我们通过简单的示例来描述成本优化混合实例伸缩组在缩容时的实例选择过程:

假设伸缩组组内按量实例个数为8,竞价实例为2个ecs.n1.tiny规格实例,2个ecs.n1.small规格实例,OnDemandBaseCapacity = 5,OnDemandPercentageAboveBaseCapacity = 40,SpotInstancePools = 2,伸缩组实例规格配置为:ecs.n1.tiny, ecs.n1.small,ecs.n1.medium(价格依此上升)。

缩容数量按量实例分配情况竞价实例分配情况
082(tiny)2(small)
182(tiny)1(small)
272(tiny)1(small)
371(tiny)1(small)
471(tiny)
561(tiny)
660
750
840

竞价实例补偿

竞价实例在系统回收之前五分钟左右将会发送系统回收消息,当您开启竞价实例主动替换功能之后,在系统发送竞价实例的回收消息之后,弹性伸缩将会为该竞价实例创建补偿任务,并在稍后通过创建新的竞价实例来替换即将释放的实例。我们将这一主动替换即将被回收的竞价实例的行为称为竞价实例补偿

竞价实例补偿是保障业务连续性的辅助保障机制,该补偿机制具有以下特点,你需要对这些特点有充分的认识,以便您配置合理的成本优化伸缩组。

  1. 竞价实例补偿的时间窗口。在收到竞价实例系统回收消息后,将为对应的实例生成补偿任务,大约五分钟时间后实例将被回收,当实例被回收后,伸缩组内的对应实例将被健康检查机制清除伸缩组(大约6分钟)。竞价实例补偿任务的有效期为:补偿任务生成到健康检查将实例移除伸缩组之间。一旦错过补偿时间窗口,对应的补偿任务将会失效和清理,意味着对应实例错过补偿期。
  2. 有限的补偿能力。一次竞价实例的补偿过程分为新实例启动和旧实例释放两个过程,补偿任务执行过程中,伸缩组将处于锁定状态。由于暂时伸缩组不支持并行伸缩活动处理,因此,在有限的补偿时间窗口内,能够进行的补偿任务次数和实例数是有限的。由于竞价实例回收通常是呈现批次状,因此,为了最大程度利用有限的补偿能力,我们将对补偿任务进行一定程度的聚合之后,按批次进行下发,最大程度的补偿更多的实例。

最佳实践

这里我们主要展示如何使用java SDK创建伸缩规则,并采用maven进行依赖管理。创建目标追踪伸缩规则,需要使用aliyun-java-sdk-ess 2.3.1及以上版本。

程序所需的maven依赖如下:

        <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>3.0.8</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-ess</artifactId><version>2.3.1</version></dependency>

创建混合实例的成本优化伸缩组:

CreateScalingGroupRequest request = new CreateScalingGroupRequest();
request.setScalingGroupName(name);
request.setMinSize(0);
request.setMaxSize(100);
request.setVSwitchId(vsId);
request.setMultiAZPolicy("COST_OPTIMIZED");
request.setOnDemandBaseCapacity(onDemandBaseCapacity);
request.setOnDemandPercentageAboveBaseCapacity(onDemandPercentageAboveBaseCapacity);
request.setSpotInstanceRemedy(spotInstanceRemedy);
request.setSpotInstancePools(spotInstancePools);
CreateScalingGroupResponse response = client.getAcsResponse(request);


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot 通过url访问本地文件

Configurationpublic class MyWebMvcConfigurer extends WebMvcConfigurationSupport {Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 访问相对路径registry.addResourceHandler("/assets/**").addResourceLocations("clas…

推出超低功耗数字式热释电传感器,翠展微电子厉害了……

近日&#xff0c;翠展微电子宣布推出了一款针对人体被动红外&#xff08;PIR&#xff09;应用的超低功耗数字芯片M1601。 据了解该方案通过热释电红外传感器以非接触方式检测出人体辐射的信号&#xff0c;并将该信号转换成电信号输入到芯片中进行信号处理。芯片的工作电流极低…

云上的Growth hacking之路,打造产品的增长引擎

增长关乎产品的存亡 增长&#xff01;增长&#xff01;增长&#xff01;业务增长是每一个创业者每天面临的最大问题。无论你的产品是APP&#xff0c;还是web&#xff0c;或者是小程序&#xff0c;只能不断的维持用户的增长&#xff0c;才能向资本市场讲出一个好故事&#xff0…

在容器上构建持续部署及最佳实践初探

作者 | 倚天码农责编| 徐威龙封图| CSDN下载于视觉中国要想理解持续集成和持续部署&#xff0c;先要了解它的部分组成&#xff0c;以及各个组成部分之间的关系。下面这张图是我见过的最简洁、清晰的持续部署和集成的关系图。图源&#xff1a;sonatype.com持续部署如图所示&…

阿里开源!云原生应用自动化引擎 OpenKruise | 直击 KubeCon

在近期开展的 KubeCon China 2019 上&#xff0c;阿里云将陆续为全球用户分享阿里巴巴超大规模云原生落地实践、云原生前沿技术与应用包括 OpenKruise 开源项目、开放云原生应用中心&#xff08;Cloud Native App Hub&#xff09;&#xff0c;同时将重磅发布边缘容器、云原生应…

Java-方法重写

方法重写只针对非静态方法&#xff0c;且不能是 private 类型的 如果是静态方法 // 重写都是方法的重写&#xff0c;和属性无关 public class B {public static void test() {System.out.println("B>test()");} }// 继承 public class A extends B{public stati…

Flowable 数据库表结构 ACT_GE_BYTEARRAY

二进制数据表&#xff0c;存储通用的流程定义和流程资源。&#xff08;act_ge_bytearray&#xff09; 保存流程定义图片和xml、Serializable(序列化)的变量,即保存所有二进制数据&#xff0c;特别注意类路径部署时候&#xff0c;不要把svn等隐藏文件或者其他与流程无关的文件也…

Express 的使用

以下内容&#xff0c;基于 Express 4.x 版本 Node.js 的 Express Express 估计是那种你第一次接触&#xff0c;就会喜欢上用它的框架。因为它真的非常简单&#xff0c;直接。 在当前版本上&#xff0c;一共才这么几个文件&#xff1a; lib/ ├── application.js ├── e…

数据库设计的 10 个最佳实践

作者 | Emily Williamson译者 | 孙薇&#xff0c;责编 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;数据库是应用及计算机的核心元素&#xff0c;负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行&#xff0c;总有一…

Flowable 数据库表结构 ACT_GE_PROPERTY

属性数据表(act_ge_property) 属性数据表。存储整个流程引擎级别的数据 字段名称字段描述数据类型主键为空取值说明NAME_名称nvarchar(64)√schema.versionschema.historynext.dbidVALUE_值nvarchar(300)√5.create(5.)REV_乐观锁int√version

原理解析 | 深入了解 Apache Flink 的网络协议栈

Flink 的网络协议栈是组成 flink-runtime 模块的核心组件之一&#xff0c;是每个 Flink 作业的核心。它连接所有 TaskManager 的各个子任务(Subtask)&#xff0c;因此&#xff0c;对于 Flink 作业的性能包括吞吐与延迟都至关重要。与 TaskManager 和 JobManager 之间通过基于 A…

从未如此简单:10分钟带你逆袭Kafka!

来源 | 51CTO 技术栈作者 | 故事凌封图| CSDN下载于视觉中国Apache Kafka 是一个快速、可扩展的、高吞吐的、可容错的分布式“发布-订阅”消息系统&#xff0c; 使用 Scala 与 Java 语言编写&#xff0c;能够将消息从一个端点传递到另一个端点。较之传统的消息中间件&#xff0…

Flowable 数据库表结构 ACT_HI_ACTINST

历史节点表&#xff08;act_hi_actinst&#xff09; 历史活动信息。这里记录流程流转过的所有节点&#xff0c;与HI_TASKINST不同的是&#xff0c;taskinst只记录usertask内容 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDPROC_DEF_ID_流程定义IDnvar…

GMTC2019|闲鱼-基于Flutter的架构演进与创新

2012年应届毕业加入阿里巴巴&#xff0c;主导了闲鱼基于Flutter的新混合架构&#xff0c;同时推进了Flutter在闲鱼各业务线的落地。未来将持续关注终端技术的演变及趋势 Flutter的优势与挑战 Flutter是Google开源的跨端便携UI工具包&#xff0c;除了具有非常优秀的跨端渲染一致…

python-小数点保留位数问题

看了之后发现所有四舍五入都有点问题 https://blog.csdn.net/chenmozhe22/article/details/81666831

Flowable 数据库表结构 ACT_HI_ATTACHMENT

历史附件表( act_hi_attachment ) 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDREV_乐观锁integer√VersionUSER_ID_用户IDnvarchar(255)√用户IDNAME_名称nvarchar(255)√附件名称DESCRIPTION_描述nvarchar(4000)√描述TYPE_类型nvarchar(255)√附件类…

别吹了!Python程序员正在消失! 资深CTO:你才发现?

程序员你有没有感觉到&#xff0c;Python最近已经刷屏到爆炸了&#xff1f;细分析Python之所以刷屏&#xff0c;主要是因为人红是非多&#xff0c;在编程界它是一种特殊的存在&#xff0c;有人认为&#xff0c;只有用Python才能优雅写代码&#xff0c;提高代码效率&#xff1b;…

Tableau BI工具对接 AnalyticDB for PostgreSQL数据源

AnalyticDB for PostgreSQL&#xff08;原HybridDB for PostgreSQL&#xff09;作为高性能分析型数据库&#xff0c;可以支持用户对其业务数据进行实时分析&#xff0c;能够让企业敏锐感知市场动态&#xff0c;做出必要决策。 Tableau是一款数据分析与可视化工具&#xff0c;它…

蚂蚁区块链BaaS:开放在云端,落地于实体

自 2018 年 6 月上线以来&#xff0c;蚂蚁区块链 BaaS 不断在技术上实现突破&#xff0c;形成自身独特的优势&#xff0c;并做为行业领军者在不同领域的几十个场景实现落地。在区块链的商用时代加速到来之际&#xff0c;通过开放自身的技术体系&#xff0c;与国内外各合作伙伴一…

Java-instanceof和类型转换

instanceof public class Person {public void run(){System.out.println("run");} }public class Student extends Person{ }public class Teacher extends Person{ }public class Application {public static void main(String[] args) {// instanceof 是 Java 的…