【问题标题】:Architecture on AWS : Running a distributed algorithm on dynamic nodesAWS 上的架构:在动态节点上运行分布式算法
【发布时间】:2017-05-18 05:11:15
【问题描述】:

如图所示,我正在处理的宠物项目有以下两个组件。

a) “RestAPI 层”(一组微服务)

b) “可扩展并行算法”组件。

我打算在 AWS 上运行它。我意识到我可以使用 ElasticBeanTalk 来部署我的 RestAPI 模块。(带有嵌入式 tomcat 的 Spring Boot JAR)

我正在考虑如何构建“可扩展并行算法”组件。以下是有关此的一些设计细节:

  • 这由几个节点组成,它们共享存储在 S3。
  • 每个节点对 S3 数据块执行“算法”。一个节点作为主节点,其余节点将部分结果发送到 这个节点。(尴尬的并行,主从范式)。主节点 由 RestAPI 层调用。
  • “节点”是一个 Spring Boot 应用程序,它通过 HTTP 与其他节点通信。
  • “节点”的数量是动态的,这意味着我应该能够根据 S3 不断增加的数据大小手动添加新节点。
  • Redis上有一个“节点注册表”​​,其中包含所有节点的IP。每个节点注册自己,并使用IP列表 注册表以相互通信。

我的问题:

1) 我应该使用 EC2 来部署“节点”还是我也可以使用 ElasticBeanStalk 来部署这些节点。我知道使用 EC2 我可以根据 S3 数据的大小来管理节点的数量,但是是否可以用 ElasticBeanStalk 做这个?

2) 我可以用吗

Inet4Address.getLocalHost().getHostAddress() 

获取每个节点的 IP ? EC2 实例是否有多个 IP?此 IP 应允许 RestAPI 层与“主”节点通信。

3) 我应该使用什么组件将我的 RestAPI 层暴露给外部世界?但我不想暴露我的“节点”。

更新: 我不能使用 MapReduce,因为节点有状态。即,在初始化期间,每个节点从 S3 读取其数据块并在内存中创建“向量空间”。这是一个耗时的过程,所以这应该存储在内存中。此外,该系统需要近乎实时的响应,不能使用像 MR 这样的“批处理”系统。

【问题讨论】:

  • 听起来您打算自己进行集群管理并实施 map/reduce。您是否考虑过使用 Hadoop(通过 EMR)?也许在 Elastic BeanStalk 中构建一个简单的 Web 前端,启动 EMR 集群来完成实际工作。

标签: java spring amazon-web-services amazon-ec2 amazon-elastic-beanstalk


【解决方案1】:

1) 我会研究 CloudFormation 以帮助您自动化和编排可扩展并行化算法。阅读此常见问题解答

https://aws.amazon.com/cloudformation/faqs/

2) 关于问题 #2,EC2 实例可以有一个私有和公共 ip,具体取决于您如何配置它们。您可以从实例中查询 AWS EC2 元数据服务以获取如下信息:

curl http://169.254.169.254/latest/meta-data/public-ipv4

curl http://169.254.169.254/latest/meta-data/local-ipv4

完整引用 EC2 实例元数据:

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

3) 查看 API Gateway 服务,它可能就是您要找的:

https://aws.amazon.com/api-gateway/faqs/

【讨论】:

    【解决方案2】:

    一些一般原则

    • 使用基础设施自动化:CloudFormation 或对流层而不是 CloudFormation。这将使您的系统干净且易于维护。
    • 使用标记:这可以使您的 AWS 帐户保持整洁。您还可以编写时髦的脚本,例如基于标签描述所有实例,这可以是返回“从属”实例的所有 IP 的单行 CLI/SDK 调用。
    • 使用更多标签,它可以非常强大。

    ElasticBeanstalk VS“手动”设置

    ElasticBeanstalk 对我来说听起来是个不错的选择,但重要的是要看到,它使用的组件与我推荐的相同:

    • 创建一个包含准备就绪的从属实例的 AMI,或者
    • 创建一个 AMI 并使用 UserData 配置您的从站,或者
    • 创建 AMI 和/或使用 Chef 或 Puppet 等编排工具来配置您的从属实例。
    • 在自动缩放启动配置中使用此 AMI
    • 创建一个 AutoScalingGroup,它可以位于固定数量的实例上,也可以根据指标进行扩展。
    • 专业设置:如果您能以某种方式计算等待执行的作业,那么这可以作为扩展或缩减的指标自动
    • Pro+ 提示:使用 Master 节点创建作业,将作业放入 SQS 队列。队列的长度是衡量扩展的一个很好的指标。失败的作业重新回到队列中,并将重新执行。 (SQS 消息只包含一个引用,而不是作业的完整数据。)
    • 强烈建议使用队列来解耦您的环境

    需要明确的是,ElasticBeanstalk 做了类似的事情。实际上,如果您创建一个多节点 Beanstalk 堆栈,它将运行一个 CloudFromation 模板,创建一个 ELB、一个 ASG、一个 LCFG 和实例。您的控制权少了一点,但管理开销也少了。

    如果您使用 Beanstalk,则需要 Worker Environment,它还会为您创建 SQS 队列。如果您选择 Worker Environment,您可以找到教程、工作示例,这会让您的起步更容易。

    进一步阅读: Background Task Handling for AWS Elastic Beanstalk Architectural Overview

    2) 您可以使用 CLI,它具有一些过滤功能,或者您可以使用 jq 等其他命令来过滤/格式化输出。 这是一个类似的example。 注意:使用标签,然后您可以轻松过滤实例。也可以根据ELB/ASG查询。

    3) 通过 API Gateway 公开您的 API 听起来是一个不错的解决方案。我假设您只想公开主节点,因为这就是管理任务的内容。

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2018-04-21
      • 2014-04-04
      • 2016-02-01
      • 2016-05-14
      • 1970-01-01
      • 2010-12-30
      • 2016-03-16
      • 2014-11-18
      相关资源
      最近更新 更多