Java AWS上的体系结构:在动态节点上运行分布式算法
如图所示,我正在处理的pet项目有以下两个组件 a) “RestAPI层”(微服务集) b) “可伸缩并行算法”组件 我计划在AWS上运行它。我意识到我可以使用ElasticBeanTalk来部署我的RestAPI模块 我正在考虑如何构建“可伸缩并行化算法”组件。以下是一些设计细节:Java AWS上的体系结构:在动态节点上运行分布式算法,java,spring,amazon-web-services,amazon-ec2,amazon-elastic-beanstalk,Java,Spring,Amazon Web Services,Amazon Ec2,Amazon Elastic Beanstalk,如图所示,我正在处理的pet项目有以下两个组件 a) “RestAPI层”(微服务集) b) “可伸缩并行算法”组件 我计划在AWS上运行它。我意识到我可以使用ElasticBeanTalk来部署我的RestAPI模块 我正在考虑如何构建“可伸缩并行化算法”组件。以下是一些设计细节: 这包括两个节点,它们共享存储在上的相同数据 S3 每个节点对S3数据块执行“算法”。一个节点作为主节点,其余节点将部分结果发送给 这个节点。(令人尴尬的并行,主从模式)。主节点 由RestAPI层调用 “节点”是
- 这包括两个节点,它们共享存储在上的相同数据 S3
- 每个节点对S3数据块执行“算法”。一个节点作为主节点,其余节点将部分结果发送给 这个节点。(令人尴尬的并行,主从模式)。主节点 由RestAPI层调用
- “节点”是一个Spring引导应用程序,它通过HTTP与其他节点通信
- “节点”的数量是动态的,这意味着我应该能够根据S3不断增加的数据大小手动添加一个新节点
- Redis上有一个“节点注册表”,其中包含所有节点的IP。每个节点注册自己,并使用 注册表以相互通信
Inet4Address.getLocalHost().getHostAddress()
要获取每个节点的IP地址?EC2实例是否有多个IP?该IP应允许RestAPI层与“主”节点通信
3) 我应该使用什么组件将RestAPI层暴露给外部世界?但我不想暴露我的“节点”
更新:
我无法使用MapReduce,因为节点具有状态。也就是说,在初始化过程中,每个节点从S3读取其数据块,并在内存中创建“向量空间”。这是一个耗时的过程,因此应将其存储在内存中。此外,该系统需要近实时响应,不能使用“批处理”像MR.这样的系统。1)我将研究CloudFormation,以帮助您自动化和协调可伸缩的并行化算法。阅读此常见问题解答
2) 关于问题2,EC2实例可以有私有和公共ip,具体取决于您如何配置它们。您可以从实例中查询AWS EC2元数据服务,以获得如下信息:
或
EC2实例元数据的完整引用:
3) 查看API网关服务,它可能是您正在寻找的:
一些一般原则
- 使用基础设施自动化:云形成或云形成上的对流层。这将使您的系统干净且易于维护
- 使用标签:这可以让你的AWS帐户保持整洁。此外,您还可以编写一些时髦的脚本,如基于标记描述所有实例,这可以是一个一行CLI/SDK调用,返回“从属”实例的所有IP
- 使用更多的标签,它会非常强大
- 创建一个包含准备就绪的从属实例的AMI,或
- 创建一个AMI并使用UserData配置您的从属设备,或
- 创建AMI和/或使用编排工具(如Chef或Puppet)来配置从属实例
- 在自动缩放启动配置中使用此AMI
- 创建一个AutoScalingGroup,它可以是固定数量的实例,也可以基于度量进行缩放
- 专业设置:如果您可以以某种方式计算等待执行的作业,则这可以是自动放大或缩小的度量标准
- Pro+提示:使用主节点创建作业,将作业放入SQS队列。队列的长度是一个很好的伸缩指标。失败的作业将返回队列,并将重新执行。(SQS消息仅包含引用,而不包含作业的完整数据。)
- 使用队列将使您的环境解耦,这是强烈建议的
3) 通过API网关公开API听起来是一个很好的解决方案。我假设您只想公开主节点,因为这就是管理任务的原因。听起来您正计划执行群集管理并自己实现map/reduce。您是否考虑过使用Hadoop(通过EMR)?也许在Elastic BeanStalk中构建一个简单的web前端,启动EMR集群来完成实际工作。
curl http://169.254.169.254/latest/meta-data/public-ipv4
curl http://169.254.169.254/latest/meta-data/local-ipv4