用于作业服务器的Amazon Auto Scaling API

时间:2012-06-04 18:41:40

标签: amazon-ec2 amazon-web-services autoscaling

我已经阅读了几乎整个文档,甚至超越了AWS AS API,以了解所有AS的东西。

但是我仍然想知道(如果我想先从某人那里找到这个,那么我实际上没有使用过API)如果我的情景对AS有效。

假设我在AS组中设置了一堆工作服务器,所有工作服务器都在每个工作上工作,突然之间(我不知道,AVG CPU大于或者在另一种情况下小于80%)可以扩展或者下来。

我主要担心的是失去了当前正在进行的工作。也许用一个例子可以更好地解释这个:

  • 我启动了5个作业服务器,上面有5个作业
  • 作业完成,并在Amazon API中触发缩小触发器
  • 亚马逊缩小规模
  • 我失去了一个实际上正在运行工作的作业服务器(90%完成再次开始)

考虑到这一点,我最好只使用Amazon Spot Instance / EC2 API并管理我自己的扩展,还是我缺少关于Amazon API如何判断服务器端接的内容?

老实说,我宁愿扩展到SQS等待数量,而不是服务器上的某些健康数据:

  • 每等待100条消息,将群集容量增加20%

但这对AS来说似乎也不太可行。

AWS AS API也不是正确的解决方案,或者我错过了一些关于它如何工作的重要信息?

谢谢,

2 个答案:

答案 0 :(得分:8)

经过一番搜索后,我发现有两种方法可以管理AS API或AS(一般来说是作业):

一种方法是直接从工作者本身操纵服务器的运行状况。这是很多网站所做的并且它是有效的,当您的工作人员在系统中检测到不再有作业或冗余时,它会将服务器标记为不健康。通过这种方式,AS API出现并在一段时间后自动将其关闭。

因此,使用此方法,您将在一段时间内根据您的SQS队列大小制定扩展策略(例如,每隔5分钟SQS消息超过100个添加2个服务器;每10分钟SQS消息超过500个双网容量增加50%)。缩小将由代码而不是活动策略处理。

此方法也适用于零群集,因此当您的群集未被使用时,您可以将群集一直向下移动到没有服务器,从而使其非常经济有效。

优点:

  • 易于设置
  • 使用AWS API函数
  • 可能是设置最快的
  • 使用AWS托管API为您管理群集大小

缺点:

  • 在不使用完整的AWS API的情况下难以管理,即在制作新服务器时,如果不执行所有instanceids的完整API命令返回,则无法获取它的instanceid。在其他情况下,如果您想要对群集进行自我控制,AWS AS API会妨碍您的工作并使生活变得更加困难
  • 依靠亚马逊知道什么是最适合您的钱包。您依靠亚马逊API正确扩展,这对许多人来说是一个优势,但对某些人来说是一个劣势。
  • 工作人员必须存放一些服务器池代码,这意味着该工作程序不是通用的,并且不能在没有配置更改的情况下立即移动到另一个集群。

考虑到这一点,还有第二个选择,DIY。您可以使用EC2竞价型实例和随需应变实例API根据自定义规则创建自己的AS API。这很容易解释:

  • 你有一个cli脚本,当运行开始时,比方说,10个服务器
  • 你有一个cronjob,当检测到满足某些条件时,关闭服务器或更多

优点:

  • 轻松清洁以管理您的目标
  • 可以制作通用工作者
  • 服务器池可以开始管理多个集群
  • 您可以制定规则以及从AWS上的指标获取数据并将其与比较和时间范围一起使用以了解事情是否应该发生变化的非常复杂的事情。

缺点:

  • 难以获得多区域(因为SQS是单区域,所以SQS不是那么糟糕)
  • 难以处理区域容量和工作量方面的错误
  • 您必须依靠自己的服务器正常运行时间和自己的代码来确保cronjob按预期运行并按原样配置服务器并在应用时将其分解。

因此,对于最终用户来说,这似乎是一场更为舒适的战斗。我个人正在考虑这两个,并且已经创建了一个可以为我工作的小型自托管服务器池,但同时我很想尝试让它在AWS自己的API上工作。

希望这有助于人们,

编辑:请注意,使用这两种方法之一,您仍然需要一个功能来预测您应该如何出价,因此您需要在您的专色类型(EC2类型)上调用出价历史记录API并计算如何出价。

另一个编辑:自动检测系统冗余的另一种方法是检查SQS队列的空响应度量标准。这是您的工作人员ping了队列并且没有收到任何响应的次数。如果您在应用程序中使用工作期间的独占锁定,这非常有效。

答案 1 :(得分:1)

我遇到了同样的问题,我和一位与我谈过终止保护的亚马逊人谈过。 实际上,如果某个实例已激活终止保护,则无法终止。触发缩小比例时,应用程序将从自动缩放组中删除,但不会终止。 要终止它,您必须禁用终止保护,然后终止它(例如,您可以在作业结束时执行此操作)。

总之,你要做的是:

  • 在AMI中添加启动脚本以激活终止保护
  • 保留自动缩放规则(向上扩展和缩小)
  • 在正在运行的实例上,一旦安全终止实例(作业结束,......),停用终止保护并终止实例

您可以使用AWS API完成所有这些工作。