如图所示,我正在处理的pet项目有以下两个组件。
a) “restapi层”(一组微服务)
b) “可扩展并行算法”组件。
我计划在aws上运行这个,我意识到我可以使用elasticbeantalk来部署restapi模块
我正在考虑如何构建“可伸缩并行化算法”组件。以下是一些设计细节:
这由两个节点组成,它们共享存储在s3上的相同数据。
每个节点对s3数据块执行“算法”。一个节点充当主节点,其余节点将部分结果发送到此节点(令人尴尬的并行主从模式)。主节点由restapi层调用。
“节点”是一个spring引导应用程序,它通过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这样的“批处理”系统。
2条答案
按热度按时间wa7juj8i1#
1) 我将研究cloudformation,以帮助您自动化和协调可伸缩的并行化算法。阅读此常见问题解答
https://aws.amazon.com/cloudformation/faqs/
2) 关于问题2,ec2示例可以有私有和公共ip,这取决于您如何配置它们。您可以从示例中查询aws ec2元数据服务,获得如下信息:
或
对ec2示例元数据的完整引用:
http://docs.aws.amazon.com/awsec2/latest/userguide/ec2-instance-metadata.html
3) 查看api网关服务,它可能就是您要查找的:
https://aws.amazon.com/api-gateway/faqs/
d8tt03nd2#
一些一般原则
使用基础设施自动化:云形成或对流层云形成。这将使您的系统干净,易于维护。
使用标签:这可以保持你的aws帐户整洁。您还可以编写一些时髦的脚本,比如基于标记描述所有示例,这可以是一个一行cli/sdk调用,返回“从属”示例的所有IP。
使用更多的标签,它会非常强大。
elasticbeanstalk与“手动”设置
elasticbeanstalk听起来是个不错的选择,但重要的是要看到,它使用了我推荐的相同组件:
创建一个ami,其中包含您的slave示例ready to go,或者
创建一个ami并使用userdata来配置你的从设备,或者
创建ami和/或使用chef或puppet之类的编排工具来配置从属示例。
在自动缩放启动配置中使用此ami
创建一个autoscalinggroup,它可以是固定数量的示例,也可以基于度量进行缩放。
pro设置:如果你能以某种方式计算等待执行的作业,那就可以作为自动放大或缩小的度量
pro+提示:使用主节点创建作业,将作业放入sqs队列。队列的长度是一个很好的衡量尺度。失败的作业将返回队列,并将重新执行。(sqs消息只包含一个引用,而不包含作业的完整数据。)
使用队列将使您的环境解耦,这是强烈建议的
很明显,elasticbeanstalk也有类似的功能。实际上,如果创建多节点beanstalk堆栈,它将运行cloudfromation模板,创建elb、asg、lcfg和示例。你只是少了一点控制,但也减少了管理开销。
如果您使用beanstalk,那么您需要一个worker环境,它还为您创建sqs队列。如果你去一个工人的环境,你可以找到教程,工作的例子,这使你的开始更容易。
进一步阅读:aws elastic Beanstalk架构概述的后台任务处理
2) 您可以使用cli,它有一些过滤功能,也可以使用jq等其他命令来过滤/格式化输出。这里有一个类似的例子。注意:使用标记,然后您可以轻松地筛选示例。也可以基于elb/asg进行查询。
3) 通过api网关公开api听起来是个不错的解决方案。我假设您只想公开主节点,因为这就是管理任务的原因。